Что такое микросервисы java
Перейти к содержимому

Что такое микросервисы java

  • автор:

Учимся разворачивать микросервисы. Часть 1. Spring Boot и Docker

Учимся разворачивать микросервисы. Часть 1. Spring Boot и Docker

В этой статье я хочу рассказать о своем опыте создания учебной среды для экспериментов с микросервисами. При изучении каждого нового инструмента мне всегда хотелось его попробовать не только на локальной машине, но и в более реалистичных условиях. Поэтому я решил создать упрощенное микросервисное приложение, которое впоследствии можно будет «обвешивать» всякими интересными технологиями. Основное требование к проекту — его максимальная функциональная приближенность к реальной системе.

Изначально я разбил создание проекта на несколько шагов:

  1. Создать два сервиса — ‘бекенд’ (backend) и ‘шлюз’ (gateway), упаковать их в docker-образы и настроить их совместную работу Ключевые слова: Java 11, Spring Boot, Docker, image optimization
  2. Разработка Kubernetes конфигурации и деплой системы в Google Kubernetes EngineКлючевые слова: Kubernetes, GKE, resource management, autoscaling, secrets
  3. Создание чарта с помощью Helm 3 для более эффективного управления кластером Ключевые слова: Helm 3, chart deployment
  4. Настройка Jenkins и пайплайна для автоматической доставки кода в кластер Ключевые слова: Jenkins configuration, plugins, separate configs repository

Каждому шагу я планирую посвятить отдельную статью.

Направленность этого цикла статей заключается не в том, как написать микросервисы, а как заставить их работать в единой системе. Хоть все эти вещи обычно лежат за пределами ответственности разработчика, думаю, что все равно полезно быть знакомым с ними хотя бы на 20% (которые, как известно, дают 80% результата). Некоторые безусловно важные темы, такие как обеспечение безопасности, будут оставлены за скобками этого проекта, так как автор в этом мало что понимает система создается исключительно для личного пользования. Я буду рад любым мнениям и конструктивной критике.

Создание микросервисов

Сервисы были написаны на Java 11 с использованием Spring Boot. Межсервисное взаимодействие организовано с использованием REST. Проект будет включать в себя минимальное количество тестов (чтобы потом было, что тестировать в Jenkins). Исходный код сервисов доступен на GitHub: бекенд и шлюз .

Чтобы иметь иметь возможность проверить состояние каждого из сервисов, в их зависимости был добавлен Spring Actuator. Он создаст эндпойнт /actuator/health и будет возвращать 200 статус, если сервис готов принимать траффик, или 504 в случае проблем. В данном случае это довольно фиктивная проверка, так как сервисы очень просты, и при каком-то форсмажоре они скорее станут полностью недоступны, чем сохранят частичную работоспособность. Но в реальных системах Actuator может помочь диагностировать проблему до того, как об нее начнут биться пользователи. Например, при возникновении проблем с доступом к БД, мы сможем автоматически на это среагировать, прекратив обрабатывать запросы сломанным экземпляром сервиса.

Сервис Backend

Сервис бекенда будет просто считать и отдавать количество принятых запросов.

@RestController public class RequestsCounterController < private final AtomicLong counter = new AtomicLong(); @GetMapping("/requests") public Long getRequestsCount() < return counter.incrementAndGet(); >>

Тест на контроллер:

@WebMvcTest(RequestsCounterController.class) public class RequestsCounterControllerTests < @Autowired private MockMvc mockMvc; @Test public void firstRequest_one() throws Exception < mockMvc.perform(get("/requests")) .andExpect(status().isOk()) .andExpect(MockMvcResultMatchers.content().string("1")); >>
Сервис Gateway

Шлюз будет переадресовывать запрос сервису бекенда, дополняя его следующей информацией:

  • id шлюза. Он нужен, чтобы можно было по ответу сервера отличить один экземпляр шлюза от другого
  • Некий «секрет», который будет играть роль очень важного пароля (№ ключа шифрования важной куки)

Конфигурация в application.properties:

backend.url=http://localhost:8081 instance.id=$ secret="default-secret"

Адаптер для связи с бекендом:

@Service public class BackendAdapter < private static final String REQUESTS_ENDPOINT = "/requests"; private final RestTemplate restTemplate; @Value("$") private String backendUrl; public BackendAdapter(RestTemplateBuilder builder) < restTemplate = builder.build(); >public String getRequests() < ResponseEntityresponse = restTemplate.getForEntity( backendUrl + REQUESTS_ENDPOINT, String.class); return response.getBody(); > >
@RestController @RequiredArgsConstructor public class EndpointController < private final BackendAdapter backendAdapter; @Value("$") private int instanceId; @Value("$") private String secret; @GetMapping("/") public String getRequestsCount() < return String.format("Number of requests %s (gateway %d, secret %s)", backendAdapter.getRequests(), instanceId, secret); >>
Запуск:
./mvnw package -DskipTests java -Dserver.port=8081 -jar target/microservices-backend-1.0.0.jar
./mvnw package -DskipTests java -jar target/microservices-gateway-1.0.0.jar
$ curl http://localhost:8080/ Number of requests 1 (gateway 38560358, secret "default-secret")

Все работает. Внимательный читатель отметит, что нам ничего не мешает обратиться к бекенду напрямую в обход шлюза ( http://localhost:8081/requests ). Чтоб это исправить, сервисы должны быть объединены в одну сеть, а наружу «торчать» должен только шлюз.
Также оба сервиса делят одну файловую систему, плодят потоки и в один момент могут начать мешать друг другу. Было бы неплохо изолировать наши микросервисы. Этого можно достичь с помощью разнесения приложений по разным машинам (много денег, сложно), использования виртуальных машин (ресурсоемко, долгий запуск) или же с помощью контейнеризации. Ожидаемо выбираем третий вариант и Docker как инструмент для контейнеризации.

Docker

Если вкратце, то докер создает изолированные контейнеры, по одному на приложение. Чтобы использовать докер, требуется написать Dockerfile — инструкцию по сборке и запуску приложения. Далее можно будет собрать образ, загрузить его в реестр образов (№ DockerHub ) и в одну команду развернуть свой микросервис в любой докеризированной среде.

Dockerfile

Одна из важнейшей характеристик образа — это его размер. Компактный образ быстрее скачается с удаленного репозитория, займет меньше места, и ваш сервис быстрее стартует. Любой образ строится на основании базового образа, и рекомендуется выбирать наиболее минималистичный вариант. Хорошим вариантом является Alpine — полноценный дистрибутив Linux с минимумом пакетов.

Для начала попробуем написать Dockerfile «в лоб» (сразу скажу, что это плохой способ, не делайте так):

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine ADD . /src WORKDIR /src RUN ./mvnw package -DskipTests EXPOSE 8080 ENTRYPOINT ["java","-jar","target/microservices-gateway-1.0.0.jar"]

Здесь мы используем базовый образ на основе Alpine с уже установленным JDK для сборки нашего проекта. Командой ADD мы добавляем в образ текущую директорию src, отмечаем ее рабочей (WORKDIR) и запускаем сборку. Команда EXPOSE 8080 сигнализирует докеру, что приложение в контейнере будет использовать его порт 8080 (это не сделает приложение доступным извне, но позволит обратиться к приложению, например, из другого контейнера в той же сети докера).

Чтобы упаковать сервисы в образы надо выполнить команды из корня каждого проекта:

docker image build . -t msvc-backend:1.0.0

В результате получаем образ размером в 456 Мбайт (из них базовый образ JDK 340 занял Мбайт). И все притом, что классов в нашем проекте по пальцем пересчитать. Чтобы уменьшить размер нашего образа:

  • Используем многошаговую сборку. На первом шаге соберем проект, на втором установим JRE, а третим шагом скопируем все это в новый чистый Alpine образ. Итого в финальном образе окажутся только необходимые компоненты.
  • Воспользуемся модуляризацией java. Начиная с Java 9, можно с помощью инструмента jlink создать JRE только из нужных модулей

Для любознательных, вот хорошая статья про подходы уменьшения размеров образа https://habr.com/ru/company/ruvds/blog/485650/ .

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine as builder ADD . /src WORKDIR /src RUN ./mvnw package -DskipTests FROM alpine:3.10.3 as packager RUN apk --no-cache add openjdk11-jdk openjdk11-jmods ENV JAVA_MINIMAL="/opt/java-minimal" RUN /usr/lib/jvm/java-11-openjdk/bin/jlink --verbose --add-modules java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument --compress 2 --strip-debug --no-header-files --no-man-pages --release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE" --output "$JAVA_MINIMAL" FROM alpine:3.10.3 LABEL maintainer="Anton Shelenkov [email protected]" ENV JAVA_HOME=/opt/java-minimal ENV PATH="$PATH:$JAVA_HOME/bin" COPY --from=packager "$JAVA_HOME" "$JAVA_HOME" COPY --from=builder /src/target/microservices-backend-*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]

Пересоздаем образ, и он в итоге похудел в 6 раз, составив 77 МБайт. Неплохо. После, готовые образы можно загрузить в реестр образов, чтобы ваши образы были доступны для скачивания из интернета.

Совместный запуск сервисов в Docker

Для начала наши сервисы должны быть в одной сети. В докере существует несколько типов сетей, и мы используем самый примитивный из них — bridge, позволяющий объединять в сеть контейнеры, запущенные на одном хосте. Создадим сеть следующей командой:

docker network create msvc-network

Далее запустим контейнер бекенда с именем ‘backend’ с образом microservices-backend:1.0.0:

docker run -dit --name backend --network msvc-net microservices-backend:1.0.0

Стоит отметить, что bridge-сеть предоставляет из коробки service discovery для контейнеров по их именам. То есть сервис бекенда будет доступен внутри сети докера по адресу http://backend:8080 .

docker run -dit -p 80:8080 --env secret=my-real-secret --env BACKEND_URL=http://backend:8080/ --name gateway --network msvc-net microservices-gateway:1.0.0

В этой команде мы указываем, что мы пробрасываем 80 порт нашего хоста на 8080 порт контейнера. Опции env мы используем для установки переменных среды, которые автоматически будут вычитаны спрингом и переопределят свойства из application.properties.

После запуска вызываем http://localhost/ и убеждаемся, что все работает, как и в прошлом случае.

Заключение

В итоге мы создали два простеньких микросервиса, упаковали их в докер-контейнеры и совместно запустили на одной машине. У полученной системы, однако, есть ряд недостатков:

  • Плохая отказоустойчивость — у нас все работает на одном сервере
  • Плохая масштабируемость — при увеличении нагрузки было бы неплохо автоматически разворачивать дополнительные экземпляры сервисов и балансировать нагрузку между ними
  • Сложность запуска — нам понадобилось ввести как минимум 3 команды, причем с определенными параметрами (это только для 2 сервисов)

Для устранения вышеперечисленных проблем существует ряд решений, таких как Docker Swarm, Nomad, Kubernetes или OpenShift. Если вся система будет написана на Java можно посмотреть в сторону Spring Cloud ( хорошая статья ).

В следующей части я расскажу про то, как я настраивал Kubernetes и деплоил проект в Google Kubernetes Engine.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

5 лучших Java Frameworks для микросервисов в 2022 году

Это обзор пяти лучших Java-фреймворков для микросервисов. Для этого мы отобрали лучших кандидатов, аргументировав свой выбор перечислением плюсов и минусов каждого. Сегодня почти каждый современный вариант совместим с Docker и Kubernetes, имеет встроенную поддержку облаков типа AWS, а также бесшовную интеграцию с JVM и JDK.

Курс Python.

Цю мову програмування використовують від базових концепцій до складних застосувань у сферах штучного інтелекту. Після проходження курсу гарантовано отримай роботу в ІТ.

Этот пост — вольный перевод на русский вот этой оригинальной статьи (с нашими дополнениями в местах, где это показалось нужным), которую написал сервис Geeks4Geeks.

Введение

Микросервисы широко используются для создания сложных приложений с развитой многофункциональностью путем объединения всех частей и их послойной компоновки в единое целое. Многие из нас могут не знать, что микросервисы — это подход к созданию единого приложения в виде набора небольших сервисов, где каждый сервис работает сам по себе (автономный процесс), но которые коммуницируют между собой как единое целое через API.

Другими словами, микросервисы — это скорее сервис-ориентированная архитектура, которая позволяет постепенно собирать любое приложение небольшими частями-модулями, а не создавать сразу единое целое. Сегодня многие организации и разработчики любят работать по микросервисной схеме, поскольку она позволяет им работать независимо.

Курс Стратегический маркетинг.

Від хаосу до системного маркетингу разом із Тетяною Лукинюк, B2C-директором у Kyivstar, колишнім CMO у Coca-Cola, Mars Ukraine та генеральною директоркою у Red Bull Ukraine.

Основная причина этого — «зависимость от одного и того же языка программирования при таком подходе буквально заканчивается»! Это явно экономит средства на управлении затратами, а также повышает эффективность сопровождения и откладки.

Итак, давайте приступим к рассмотрению нашего топ пять лучших Java Frameworks для написания микросервисов в 2022 году.

Spring Boot

Возможно, один из лучших и самых простых в использовании фреймворков на Java для разработки микросервисов. Он с открытым исходным кодом, оснащен огромным количеством функций и возможностей. Кроме того, его можно легко развернуть на очень многих платформах (например, Docker). Он предлагает сильную поддержку обширной сети сообщества разработчиков, вы можете получить решение каждого запроса, и это, несомненно, огромный плюс.

Spring Boot также позволяет обеспечить некоторые интересные встроенные функции, такие как безопасность, автоконфигурация, стартовая зависимость (что способствует быстрой разработке приложений) и целый ряд других сервисов. Давайте рассмотрим некоторые ключевые особенности использования этого фреймворка:

  • Spring Boot помогает контролировать несколько компонентов одновременно.
  • Он обеспечивает максимальную пропускную способность и эффективность за счет использования метода балансировки нагрузки, когда трафик распределяется небольшими частями.

Курс Комерційний директор.

Зосередження на практичних завданнях та послідовному аналізі проектів замість великої теорії. Реалізуй свої мрії про керівну посаду після завершення курсу.

Quarkus

Был создан для современных, но высокофункциональных java-приложений, отвечающих ожиданиям облачной среды. Кроме того, это полностековая Kubernetes-native-платформа, предназначенная для JVM (Java Virtual Machine). Quarkus изначально предназначен для контейнеров, что позволяет его приложениям работать в целенаправленном облаке или бессерверной среде. Сам Quarkus был разработан с использованием таких Java-фреймворков, как Eclipse, Kafka, Spring и др.

Он предоставляет правильную контекстную информацию GraaIVM (высокопроизводительному дистрибутиву JDK) для поддержки нативной компиляции Java-приложений. Таким образом, работа с Quarkus может стать настоящим удовольствием, а еще он обеспечивает некоторые другие ключевые особенности:

  • Идеален для работы в среде с низким энергопотреблением, обеспечивая первоклассную поддержку Graal, обработку метаданных в реальном времени и так далее.
  • Модель разработки Quarkus может быть легко адаптирована к модели разработки вашего проекта, что может быть хорошим вариантом — это делает его идеальным решением для современной бессерверной архитектуры.
  • Quarkus также предлагает единую унифицированную систему конфигурации, что означает, что с помощью одного файла конфигурации приложения Quarkus можно легко настроить в каждом отдельном расширении. Это очень понравится вашему DevOps!

Курс Front-end Basic.

Оволодій навичками розробки веб-інтерфейсів та стань справжнім Front-end розробником! Заробляй від 800$ на початку карʼєри.

Главная цель Quarkus — сделать Java ведущей платформой в Kubernetes и бессерверных средах, предлагая разработчикам унифицированную реактивную и императивную модель программирования для оптимального решения максимально широкого спектра архитектур распределенных приложений.

Micronaut

Если вы хотите работать на AWS, то Micronaut — это то, что нужно. Это идеальное сочетание полного стека, основанного на JVM и предназначенного исключительно для создания бессерверных микросервисных приложений.

Приятная сторона использования Micronauts — не нужно беспокоиться о времени запуска или потреблении памяти, он предлагает скорость, несмотря на внушительную длину кода.

Micronaut — это действительно современный инструментарий разработчика, созданный для сегодняшних разработчиков, который помогает с инъекциями зависимостей, AOP, управлением конфигурациями и многим другим — все это делает его простым, но элегантным Java Framework.

Micronaut разработан создателями популярнейшего фреймворка Grails и черпает вдохновение из уроков, полученных за годы создания реальных приложений от монолитов до микросервисов с использованием Spring, Spring Boot и Grails.

Кроме того, ниже мы упомянем еще несколько важных элементов, которые могут быть полезны для вашего понимания:

    • Он предлагает как HTTP-клиент, так и сервер, построенный на Netty (клиент-серверный фреймворк), который также включает в себя широкий спектр инструментов, подходящих для облачной среды.
    • Он также обеспечивает AOT-компиляцию (опережающая компиляция — это акт компиляции языка программирования более высокого уровня в язык более низкого уровня перед выполнением программы), что способствует быстрой разработке приложений с малым объемом памяти, IoT, бессерверных приложений и многого другого.
    • Micronaut также поддерживает широкий спектр поддержки для создания приложений на Java, Groovy и Kotlin.

    Eclipse Vert.x

    Созданный на базе Eclipse, он является идеальным решением для проектирования приложений на основе виртуальной машины JVM (Java Virtual Machine). Eclipse Vert.x также является идеальным решением для выполнения всех видов ограниченных сред (таких как VM и контейнеры). Кроме того, Vert.x — это набор инструментов, который обеспечивает высокую гибкость и точность модульного построения блоков для любых компонент.

    Самое лучшее в Vert.x — это независимость создания любых компонентов с использованием всех обычных библиотек. Это делает выгодной работу с Eclipse Vert.x в вашем проекте.

    Eclipse Vert.x управляется событиями (событийно-ориентированный фреймворк) и не блокируется. Это означает, что ваше приложение может обрабатывать большое количество параллельных операций с помощью небольшого числа потоков ядра. Vert.x позволяет вашему приложению масштабироваться с минимальными аппаратными затратами.

    Также есть некоторые ключевые факторы, которые лучше рассмотреть заранее:

    • Разработчик получит возможность использовать несколько языков в своем проекте, используя базовые API для написания асинхронных сетевых приложений с помощью polyglot.
    • Эта модель часто известна как потоковая модель ввода-вывода, когда разработчик может писать код как однопоточное приложение, используя Vert.x.
    • Она помогает масштабировать аппаратное обеспечение малого или среднего сегмента, обрабатывая множество параллельных операций с помощью отдельных потоков для процессорных ядер.

    Ballerina

    Это не фреймворк, а язык распределенного программирования, который специально используется для создания распределенных приложений, а также позволяет программистам разрабатывать пользовательские сетевые приложения с помощью языка с открытым исходным кодом.

    Кроме того, Ballerina — это язык облачно-нативного программирования, который облегчает работу с фреймворками JVM, а также включает аннотации для Kubernetes и Docker, которые помогают разработчикам создавать приложения в среде с низким уровнем кодирования. Ниже перечислены некоторые другие особенности использования Ballerina:

    • Она позволяет выполнять интегрированные в язык запросы с помощью декларативной обработки JSON, табличных данных и XML.
    • Ballerina отличается высокой надежностью и легко справляется с ошибками, обеспечивает безопасность параллелизма благодаря удобному для чтения синтаксису.
    • Она также предлагает как текстовый, так и графический синтаксис, основанный на последовательных диаграммах.

    Итак, Ballerina — это не фреймворк, это язык распределенного программирования для написания полноценных распределенных приложений. На нем очень легко писать сложно-сетевые приложения. Ballerina — это язык программирования с открытым исходным кодом и платформа для программистов облачных приложений, позволяющая легко и быстро создавать ПО, которое работает под высокими нагрузками.

    Здесь существует множество других возможностей, таких как потоковая обработка, потоковая передача, безопасность и встроенная поддержка микросервисов, которые остались за кадром этого обзора.

    Главное напутствие

    Внедрение фреймворков сегодня — это расширение возможностей и предоставление более богатого пользовательского опыта, чем когда-либо. Идея проста: выберите подходящий именно вам из списка выше, и начните внедрять его в свой проект, остальное зависит от требований, которые вы выдвигаете, и возможностей, которые вам нужны.

    Что такое микросервисы java

    Отдел по работе с клиентами:
    +375 (44) 546 54 54
    +375 (29) 546 54 54

    Время работы: понедельник-пятница, 10:00 — 18:00

    Администрация, учебные классы:
    г. Минск, пер. 4-ый Загородный, д. 56а (ст.м. Молодежная)
    Учебные классы:
    г. Минск, ул. Коллекторная, 3а (ст.м. Немига)

    Об академии

    ООО «Европейский центр разработки программного обеспечения»
    г. Минск, пер. Загородный 4-й, дом 56А, пом.2, каб.60
    УНП 190681713 ОКПО 37683136
    р/счет
    BYN BY17MTBK30120001093300102585
    RUB BY77MTBK30120001064300102588
    USD BY69MTBK30120001084000102586
    EUR BY03MTBK30120001097800102587
    в ЗАО «МТБАНК» г. Минск, ул. Толстого, 10, ЦБУ «Корпоцентр» БИК MTBKBY22

    © 2023 Академия BELHARD

    Об академии

    • Наша команда
    • О нас пишут в СМИ
    • Подарочный сертификат
    • Вакансии
    • Обучение для граждан других стран
    • Статьи

    Микросервисы на Spring Cloud

    Микросервисы на Spring Cloud

    В микросервисах вы разбиваете весь функционал на микро-приложения, которые работают в общей шине (Spring Cloud) и взаимодействуют между собой.

    Сейчас это самая популярная архитектура для создания крупных приложений с большим функционалом.

    Сейчас уже многие компании поняли, что микросервисы находятся в тренде: они дают гибкость в разработке, скорость в обновлении ПО, правильный командный подход и многое другое.

    ЧТО ТАКОЕ SPRING CLOUD?

    Это готовые библиотеки и технологии, которые позволяют создавать микросервисные приложения быстро и легко.

    Вам нужно будет только подключить нужные направления и реализовать бизнес-логику.

    Всю остальную «грязную» работу сделает за вас Spring.

    НУЖНО ЛИ ЭТО ВАМ?

    Если вы привыкли к старым методикам разработки (монолит) и вас все устраивает — то можно не изучать микросервисы (без работы точно не останетесь).

    Но если хотите идти в ногу со временем — то нужно обязательно научиться работать со Spring Cloud и его внутренними проектами. Тогда вы будете «на коне» еще многие годы.

    Микросервисы для начинающих на Spring Cloud?

    SPRING/ CLOUD

    Можно все изучать самостоятельно и тратить на это много времени. А можно взять готовый материал и пошагово создать проект с нуля с применением всех нужных технологий Spring Cloud.

    Поэтому для вас был создан специальный курс на русском языке (возможно, единственный в РУНЕТЕ в таком объеме).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *