Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В обзоре собраны краткие описания каждого компонента экосистемы, чтобы дать понимание – как выглядит мир Spring, и ориентиры – что из этого стоит изучить глубже и применять в проекте.
Первая часть обзора доступна по ссылке – «Обзор Spring-компонентов. Часть 1 – Spring Boot и фреймворк интеграции».
Вступление
Создав приложение и освоив контейнеризацию, вы увидите, как легко, одной цифрой в конфиг-файле, настраивается запуск контейнеров во множестве экземпляров, для отказоустойчивости и масштабирования.
Но возникает проблема, – потребитель сервисов не умеет работать с множеством экземпляров. Для связи прикладных сервисов в целостное приложение, необходимы инфраструктурные сервисы.
Подсистема Spring Cloud состоит из:
Инфраструктурных сервисов, в виде готовых Spring-приложений, переносимых между облачными платформами.
Клиентов сетей Service Mesh, реализующих инфраструктурные сервисы.
Клиентов облачных платформ, реализующих инфраструктурные и коммерческие сервисы.
Микрофреймворков для разработки микросервисов и их оркестровки.
Термины
Чтобы ориентироваться в тексте, важно понимать отличие нового термина «инфраструктурные сервисы» от «облачных платформ» и «прикладных сервисов».
Прикладные сервисы - реализуют бизнес-логику распределенного приложения.
Инфраструктурные сервисы – координируют взаимодействие экземпляров прикладных сервисов.
Подробнее:
Основные функции:
Маршрутизация – распределение запросов между типами сервисов;
Балансировка – распределение запросов между экземплярами сервисов;
Проброс пользовательской аутентификации из шлюза в сервисы;
Защита межсервисных запросов от взлома и повреждения техническими сбоями;
Механизмы отказоустойчивости;
Реализация манифеста 12-факторных приложений.
Service Mesh – комплекс инфраструктурных сервисов, реализованный как самостоятельное ПО, не привязанное ни к облачным платформам, ни к фреймворкам разработки.
Облачные платформы – распределяют по физическим серверам docker-контейнеры или поды (pod).
Подробнее:
Основные функции:
Деплой на физические серверы комплекса контейнеров, реализующих микросервисные приложения.
Контроль и поддержка работоспособности контейнеров, путем удаления неработоспособного контейнера и создания нового экземпляра.
Обновление версий микросервисного приложения, путем удаления устаревших контейнеров и создания новых экземпляров.
Опционально:
Инфраструктурные сервисы;
Коммерческие сервисы. (встроенные MQ-брокеры, базы данных, сервисы отправки SMS и т.п.)
Под (pod) – минимальный юнит развертывания в Kubernetes, содержит произвольное количество docker-контейнеров.
Список компонентов и ссылки на главы обзора
Для общего видения, ниже представлено распределение проектов Spring по типам. Некоторые проекты Spring Cloud-раздела не содержат в названии Cloud, но осмысленные варианты использования их в монолитных системах не были найдены.
Компоненты из первой части обзора – «Spring Boot и фреймворк интеграции»
Компоненты Spring Boot приложений | |
1.1 Уровень интеграции компонентов 2. Уровень обмена данными с хранилищами | Поддержка NoSQL БД 3. Уровень сетевого обмена данными |
4. Фреймворк корпоративной интеграции | |
Spring Integration |
Компоненты Spring Cloud приложений | |
5.1 Инфраструктурные сервисы, переносимые между облачными платформами | 6. Инфраструктурные сервисы, интегрированные в облачные платформы (только клиенты подключения) 7.1 Микро-фреймворки для разработки микросервисов |
Компоненты Spring Cloud приложений
Инфраструктурные сервисы, переносимые между облачными платформами
Сервис с ролью Gateway
1. Spring Cloud Gateway
Сервис для маршрутизации входящих запросов между микросервисами и балансировки между экземплярами микросервисов.
Заменяет устаревший Zuul и, в отличии от Zuul, поддерживает реактивность и WebSockets.
Сервисы с ролью Config Server
Сервисы с ролью Config Server (сервер конфигураций) являются внешним хранилищем настроек всех сервисов приложения для реализации третьего принципа 12-факторных приложений. Настройки хранятся в виде текстовых properties файлов, которые рассылаются сервисам по запросу.
2. Spring Cloud Config
Сервер конфигураций по умолчанию.
3. Spring Cloud Vault
Обертка над Spring Vault для использования коммерческого хранилища секретов HashiCorp в роли сервера конфигураций.
4. Spring Cloud Bus
Механизм доставки конфигураций через брокеры Kafka или AMQP.
Позволяет организовать централизованное хранение конфигураций в GitHub и других источниках.
Сервисы с ролью Service Discovery
Бывают ситуации, когда некоторые контейнеры не работают. На это может быть несколько причин:
На хост-сервере занята память и Linux, в рамках штатного поведения, удалил один из процессов для ее высвобождения;
Сервисы облачной платформы, в рамках штатного поведения, удалили неработоспособный или устаревший сервис и еще не запустили новый экземпляр.
Service Discovery отслеживает доступность сервисов, их ip-адреса, роли и предоставляет эту информацию другим компонентам распределенного приложения.
5. Spring Cloud Netflix (Eureka)
Сервис с ролью Service Discovery. Унаследован от Netflix и рекомендован по умолчанию.
6. Spring Cloud Zookeeper
Клиент интеграции для Zookeeper.
Zookeeper это Service Discovery по умолчанию для Apache Kafka. Если в проекте используется Kafka с Zookeeper, отдельный Service Discovery не требуется, достаточно подключиться к уже используемому.
Интеграция с Service Mesh
7. Spring Cloud Consul
Клиент для использования Config Server и Service Discovery, встроенных в Consul.
Consul – одна из реализаций концепции Service Mesh.
Примечание: в главах 24.9 и 24.10 отражены клиенты интеграции с Istilo, – еще одной реализаций концепции Service Mesh.
Зависимости, встраиваемые в приложения
8. Spring Cloud
Это раздел вступительной документации, не описывающий какой-либо конкретный компонент.
Из полезной информации, он содержит описание 850 properties настроек Cloud компонентов. Логически, эти настройки дополняют документацию к следующему компоненту «Spring Cloud Commons».
9. Spring Cloud Commons
Транзитивная зависимость, не требующая явной загрузки. Расширяет Spring Boot, содержит две библиотеки:
9.1. Spring Cloud Context – клиент для загрузки properties файлов с Config Server и загрузки в DI-контейнер бинов, специфичных для Spring Cloud компонентов. Поддерживает шифрование, при передаче properties файлов.
9.2. Spring Cloud Commons (Commons в Commons, да) – для настройки абстракций Service Discovery, Circuit Breaker, LoadBalancer и ServiceRegistry независимо от имплементации.
LoadBalancer – абстракция «клиентского» балансировщика запросов.
Ribbon – его базовая имплементация.Клиентский балансировщик используется, когда ваш прикладной сервис обращается к другим сервисам напрямую, в обход Gateway. Логика работы – запрашивает в Service Discovery ip-адреса подходящих запросу экземпляров сервисов и обеспечивает «веерную» рассылку запросов – каждый следующий запрос передается на следующий в списке ip и далее по кругу.
LoadBalancer задокументирован только в «Spring Cloud Commons».
Документация для Ribbon, возможно по ошибке, удалена из содержания портала, но еще гуглится.
10. Spring Cloud OpenFeign
Декларативный REST клиент – позволяет одной-двумя аннотациями организовать отправку HTTP запросов. Добавляется в прикладные сервисы, как maven зависимость.
Используется для взаимодействия с инфраструктурными и прикладными микросервисами. Поддерживает интеграцию с Service Discovery, Circuit Breaker и LoadBalancer.
Недостаток: может принимать только текстовые данные, но не двоичные, – загружать файлы не получится.
11. Spring Cloud Circuit Breaker
Компонент для повышения отказоустойчивости сервисов, путем временного прерывания отправки запросов. Добавляется в прикладные сервисы, как maven зависимость.
При перегрузке вызываемого сервиса, когда запросы завершаются ошибкой «превышен таймаут ожидания ответа», Circuit Breaker временно прерывает повторную отправку исходящих запросов, чтобы вызываемый сервис мог восстановить работоспособность. Также экономятся ресурсы отправляющего запросы сервиса.
Является универсальным API для имплементаций: Netfix Hystrix, Alibaba Sentinel, Spring Retry, Resilience4J.
12. Spring Cloud Security
Расширение Spring Security, реализует:
Единый вход OAuth2, с ретрансляцией токенов (проброс токенов извне, через Gateway).
Защиту ресурсов токенами OAuth2.
13. Spring Cloud Schema Registry
Компонент для форматно-логического контроля сообщений Kafka на уровне библиотеки сериализации Apache Avro.
Подробнее о сериализации в Kafka
При работе с Kafka, из приложения-отправителя передаются java классы, и приложение-потребитель получает те же java классы. Сам Kafka хранит только массивы байтов. Поэтому, при передаче классов, используется сериализация – извлечение из классов полезных данных и преобразование в массив байтов. А при получении классов из Kafka, обратный процесс – десериализация.
Apache Avro – популярная библиотека сериализации для Kafka, с поддержкой схем форматно-логического контроля. Может на этапе сериализации валидировать сообщения на соответствие схеме – проверять имена атрибутов, типы, структуру вложенности, наличие обязательных атрибутов и прочие параметры.
14. Spring Cloud Sleuth
Реализует трассировку и логирование запросов для анализа проблем в распределенной системе.
15. Spring Cloud Contract
Зонтичный проект для реализации подхода Consumer Driven Contracts. Пока содержит один подпроект:
Spring Cloud Contract Verifier – поддержка разработки потребительских контрактов (CDC) для приложений на основе JVM.
16. Spring Cloud Cluster
Компонент для встраивания в распределенную систему кластерных функций: выбор лидера, хранение состояния кластера, глобальные блокировки, одноразовые токены.
Spring Session
17. Spring Session Core
Компонент для межсервисного обмена данными об аутентификации и другими атрибутами HTTP сессии. Поддерживает несколько сессий в одном браузере и отправку сессий в заголовке.
Репозитории Session
Надстройки к «Spring Session Core» для хранения атрибутов сессий в БД.
18. Spring Session Data Redis
Стандартный и реактивный репозитории сессий для Redis.
19. Spring Session MongoDB
Репозиторий сессий для MongoDB.
20. Spring Session JDBC
Репозиторий сессий для JDBC.
21. Spring Session Hazelcast
Репозиторий сессий для Hazelcast.
Hazelcast – облегченный In-Memory Data Grid. В нем отсутствует функционал распределенных вычислений. Этот функционал вынесен в отдельный модуль Hazelcast Jet.
22. Spring Session for Apache Geode
Репозиторий сессий для Apache Geode.
Apache Geode – полнофункциональный In-Memory Data Grid.
Отличия Grid от БД описаны в первой части обзора.
Инфраструктурные сервисы, интегрированные в облачные платформы (только клиенты подключения)
23. Spring Cloud Alibaba
В проект включены два типа компонентов:
Инфраструктурные сервисы от Alibaba, переносимые между облачными платформами.
Клиенты для коммерческих сервисов в облаке Alibaba.
Подробнее:
Инфраструктурные сервисы:
23.1. Nacos Config – сервис с ролью Config Server;
23.2. Nacos Discovery – сервис с ролью Service Discovery;
23.3. Sentinel – сервис с ролью Circuit Breaker;
23.4. Dubbo – RPC фреймворк для взаимодействия сервисов по протоколам: Dubbo, RMI, Hessian, HTTP, Web Service, Thrift, Memcached, Redis.
Поддерживает: четыре стратегии балансировки нагрузки и пять стратегий отказоустойчивости.
23.5. RocketMQ Binder – клиент интеграции с RocketMQ.
Клиенты для коммерческих сервисов в облаке Alibaba:
23.6. Cloud ANS (Application Naming Service) – Service Discovery;
23.7. Cloud ACM (Application Configuration Management) – Config Server;
23.8. Cloud OSS (Object Storage Service) – хранилище данных;
23.9. Cloud SchedulerX – планировщик заданий;
23.10. Cloud SMS – отправка и прием SMS.
24. Spring Cloud Kubernetes
Клиенты подключения Spring приложений к инфраструктурным сервисам, интегрированным в Kubernetes. Не являются обязательными для развертывания приложения Spring Boot в Kubernetes.
Подробнее:
Роль LoadBalancer:
24.1 LoadBalancer for Kubernetes – клиент для использования Load Balancer встроенного в Kubernetes.
Роль Config Server:
24.2 Kubernetes PropertySource – реализация роли Config Server на основе ConfigMap и PropertySource.
24.3 Spring Cloud Kubernetes Config Server – расширение инфраструктурного сервиса «Spring Cloud Config» с поддержкой хранения конфигурации в Kubernetes Config Maps и Secrets.
24.4 Spring Cloud Kubernetes Configuration Watcher – компонент для обновления настроек сервисов без их перезапуска.
Роль Service Discovery:
24.5 DiscoveryClient for Kubernetes – клиент для использования Service Discovery встроенного в Kubernetes.
24.6 Spring Cloud Kubernetes Discovery Server – инфраструктурный сервис с ролью Service Discovery и поддержкой поиска сервисов в кластере Kubernetes.
Интеграция с Spring Boot Actuator:
24.7 Pod Health Indicator – передает информацию о работоспособности сервисов в Spring Boot Actuator.
24.8 Info Contributor – передает информацию о подах в Spring Boot Actuator.
Интеграция с Istilo:
Istilo – одна из реализаций концепции Service Mesh.
24.9 Kubernetes native service discovery – клиент для передачи данных в Istilo из Service Discovery, встроенного в Kubernetes.
24.10 Kubernetes Ecosystem Awareness – передает информацию о кластере в Istilo.
Прочее:
24.11 Leader Election – API выбора лидера Spring Integration с использованием Kubernetes ConfigMap.
24.12 Service Account – зависимости для доступа к кластеру на основе ролей.
25. Spring Cloud for Amazon Web Services
Клиенты подключения Spring приложений к инфраструктурным сервисам в AWS.
Подробнее:
25.1 Spring Cloud AWS Core – клиент для базовой настройки безопасности и конфигурации через «Amazon EC2» и «AWS CloudFormation».
25.2 Spring Cloud AWS Context – клиент для сервисов:
Amazon S3 (Simple Storage Service) – загрузка ресурсов через абстракцию загрузчика ресурсов Spring.
Amazon Simple Email Service – отправка почты через абстракцию почты Spring.
Amazon ElastiCache – декларативное кэширование через абстракцию кэширования Spring.
25.3 Spring Cloud AWS JDBC – клиент для автоматического поиска и настройка источника данных в «Amazon RDS» (Relational Database Service).
25.4 Spring Cloud AWS Messaging – клиент для обмена сообщениями через:
Amazon SQS (Simple Queue Service) – точка-точка,
Amazon SNS (Simple Notification Service) – издатель-подписчик.
25.5 Spring Cloud AWS Parameter Store Configuration – клиент для использования в роли Config Server, сервиса «Amazon SMPS» (Systems Manager Parameter Store).
25.6 Spring Cloud AWS Secrets Manager Configuration – клиент для использования в роли Config Server, сервиса «Amazon Secrets Manager».
26. Spring Cloud Azure
Клиенты подключения приложений Spring к инфраструктурным сервисам в Microsoft Azure.
Клиентов много, они представлены в виде maven зависимостей и не выделены в именованные компоненты. Maven зависимости могут иметь несколько вариантов использования. Документация к «Spring Cloud Azure» достаточно качественная, чтобы изучать возможности проекта непосредственно по ней, как минимум по составу глав документации.
Прим. Одной из причин появления этого материала была предельно некачественная документация по большинству компонентов Spring.
Кроме того, в облачной платформе Microsoft Azure есть сервис «Azure Spring Apps», именуемый в Spring-документации «Azure Spring Cloud». Сервис создан и поддерживается командой проекта «Spring Cloud Azure» и рекомендован к использованию по умолчанию.
27. Spring Cloud GCP
Клиенты подключения приложений Spring к инфраструктурным сервисам в Google Cloud Platform.
Клиентов много, они представлены в виде maven зависимостей и не выделены в именованные компоненты. Maven зависимости могут иметь несколько вариантов использования. Документация к «Spring Cloud GCP» достаточно качественная, чтобы изучать возможности проекта непосредственно по ней, как минимум по составу глав документации.
28. Spring Cloud for Cloud Foundry
Реализует три maven зависимости:
Клиент службы единого входа (SSO – Single Sign On) для привязки учетных данных Cloud Foundry к функциям Spring Boot.
Клиент для использования Service Discovery, встроенного в Cloud Foundry.
13 properties настроек, специфичных для Cloud Foundry.
29. Spring CredHub
Клиент интеграции с CredHub.
CredHub – сервер учетных данных в Cloud Foundry.
30. Spring Vault
Клиент интеграции с HashiCorp Vault.
HashiCorp Vault – защищенный сервер для хранения конфиденциальной информации. Компонент также интегрирован в «Spring Cloud Vault», в роли Config Server с шифрованием.
31. Spring Cloud Connectors (развитие планируется в рамках другого проекта)
Компонент для автоматического подключения к службам в облаке. Поддерживает облака: Cloud Foundry и Heroku. Для других облачных платформ, имеет 7 community-версий.
Проект в статусе поддержки без развития, – планируются обновления безопасности, но не функционала. Развитие функционала планируется в рамках нового проекта Java CFEnv.
Администрирование приложений в облачных платформах
32. Spring Cloud CLI
Приложение командной строки под Linux, Mac и Windows для развертывания, запуска и автонастройки микросервисов скриптами YAML и Groovy и командами CLI.
33. Spring Cloud Skipper
Компонент для обнаружения Spring приложений в облачных платформах, их обновления и отката между разными версиями без необходимости повторно собирать приложения из исходного кода. Может использоваться в CI/CD как версионный «единый источник достоверной информации».
Разрабатывался для «Spring Cloud Data Flow», но может использоваться для других Cloud приложений. Поддерживает платформы: Local, Cloud Foundry и Kubernetes.
34. Spring Cloud Pipelines (устарел)
Клиент интеграции с CI/CD системами Jenkins и Concourse.
Устарел, не рекомендован к использованию.
Сервисы администрирования с ролью Open Service Broker
Open Service Broker – сервис с REST API с ограниченной функциональностью по администрированию микросервисов в облачной платформе.
Реализует:
1. Регистрацию сервисов в каталоге облачной платформы.
2. Создание и удаление экземпляров сервиса в облачной платформе.
3. Привязку вашего клиентского приложения к сервисам в облаке и отвязку его.
Ограниченность возможностей гарантирует безопасность передачи клиентам облачной платформы описанных функций администрирования. Это дает ряд преимуществ:
Администратор со стороны клиента может скриптами «динамически собирать» приложения из множества сервисов, генерируя набор HTTP запросов. Функции администрирования выполняются за секунды.
Администраторы коммерческого облака разгружаются от большого объема работы, облачные сервисы становятся дешевле по себестоимости. Исключены проблемы, связанные с недопониманием при передаче запросов на выполнение этих функций, так как нет самих запросов в техподдержку.
35. Spring Cloud App Broker
Готовый сервис, реализующий API Open Service Broker.
Поддержка облачных платформ пока ограничена Cloud Foundry.
36. Spring Cloud Open Service Broker
Набор зависимостей для разработки сервиса, реализующего API Open Service Broker (OSB). Требует ручного программирования логики OSB (пример). Позволяет расширить функциональность брокера, если у вас частное облако. Поддерживает все облачные платформы, реализующие клиент для OSB: Cloud Foundry, Kubernetes и OpenShift и т.п.
37. Spring Cloud – Cloud Foundry Service Broker (устарел)
Набор зависимостей для разработки сервиса, реализующего API Open Service Broker (OSB).
Устарел, дальнейшее развитие перенесено в описанный выше проект «Spring Cloud Open Service Broker».
Микро-фреймворки для разработки микросервисов
38. Spring Cloud Function
Микрофреймворк для разработки переносимых между облаками сервисов, с автогенерацией REST (опционально RSocket) интерфейсов.
Позволяет сосредоточиться на бизнес-логике. Для этого реализован механизм автоматического оборачивания REST-интерфейсами бинов, реализующих функциональные интерфейсы Supplier, Function или Consumer. Для этого, бины должны быть созданы одним из двух способов:
@Component класс метода реализует функциональный интерфейс Supplier, Function или Consumer;
Ответ @Bean метода оборачивается в тип функционального интерфейса Supplier, Function или Consumer.
Поддерживает реактивный, императивный и комбинированный стили программирования. Может запускать сервисы – «Spring Cloud Stream».
Поддерживает платформы: Local, AWS Lambda, Microsoft Azure, Google Cloud Functions, Apache OpenWhisk.
39. Spring Cloud Stream
Микрофреймворк для разработки переносимых между облаками сервисов, с автогенерацией MQ-интерфейсов (Kafka или AMQP). Допускает встраивание в конвейеры средствами компонента «Spring Cloud Data Flow».
Позволяет сосредоточиться на бизнес-логике. Для этого реализован механизм автоматического оборачивания MQ-интерфейсами бинов, реализующих функциональные интерфейсы Supplier, Function или Consumer.
Stream сервисы могут быть трех типов:
Source – получает данные из внешних ресурсов и передает в MQ-канал.
Processor – получает данные из «входного» MQ-канала, обрабатывает их и передает в «выходной» MQ-канал.
Sink – получает данные из MQ-канала и передает во внешние ресурсы.
Конвейеры данных – представляют множество Stream сервисов, выстроенных в цепочку и связанные MQ-интерфейсами для пошагового преобразования данных. Конвейер может иметь один Source-сервис, произвольное количество Processor-сервисов и один Sink-сервис.
Может вызываться из сервисов – Spring Cloud Function.
Может запускать сервисы – Spring Cloud Task.
Поддерживает MQ брокеры для взаимодействия в рамках конвейера: RabbitMQ, Apache Kafka, Kafka Streams, RocketMQ, Amazon Kinesis, AWS SQS, AWS SNS, Azure Event Hubs, Azure Service Bus, Google PubSub, Solace PubSub+.
40. Spring Cloud Stream Applications
Коллекция из 57 готовых сервисов Spring Cloud Stream (список), с поддержкой около 30 протоколов взаимодействия с внешними ресурсами.
Кроме базовой функциональности, проект содержит сервисы обработки видео:
Image Recognition – нейронная сеть для анализа графических изображений;
Semantic Segmentation – сегментирует графические изображения по модели DeepLab Tensorflow;
Object Detection – идентифицирует объекты на графических изображениях.
41. Spring Cloud Task
Микрофреймворк для разработки переносимых между облаками краткосрочных сервисов.
Жизненный цикл сервиса состоит из старта, выполнения задачи и завершения работы. Сервис сам опрашивает источник данных (БД, CSV, XML и т.п.) и сохраняет результат в этот или другой источник.
Поддерживает Spring Batch для выполнения пакета однотипных задач.
Поддерживает источники данных: File, JDBC, Kafka, AMQP.
Может запускаться:
из сервисов «Spring Cloud Stream»,
на сервере администрирования «Spring Cloud Data Flow».
Поддерживает платформы: Local, Spring Cloud Data Flow (разворачивает сервисы в Cloud Foundry и Kubernetes), Cloud Foundry.
42. Spring Cloud Task App Starters
Коллекция из двух готовых сервисов Spring Cloud Task:
Timestamp Task – печатает метку времени в stdout. Предназначен в первую очередь для тестирования.
Timestamp Batch Task – выполняет 2 Task, каждое печатает имя задания и метку времени в stdout. Предназначен в первую очередь для тестирования.
Оркестровка конвейеров из Stream и Task сервисов
43. Spring Cloud Data Flow
Инструментарий для развертывания конвейеров данных из сервисов Spring Cloud Stream и Spring Cloud Task, на платформах Cloud Foundry, Kubernetes или локально (пример).
Поддерживает проектирование и развертывание конвейеров тремя способами:
В графическом интерфейсе. Графический интерфейс также поддерживает мониторинг с использованием Wavefront, Prometheus, Influx DB или других систем.
DSL командами,
Через REST API.
Проектирование конвейера в графическом интерфейсе и его запуск представлены в видео (8 минут):
«Spring Cloud Data Flow» рекомендован к использованию в связке с «Spring Cloud Skipper»:
44. Spring Flo
Графический интерфейс, встроенный в «Spring Cloud Data Flow», для создания и мониторинга конвейеров данных.
Заключение
Это была заключительная часть обзора. Рассмотрены 85 проектов, включающие 156 компонентов. Поправки и уточнения приветствуются.
---
Владимир Мальзам.
Должности нет, в поиске (Java разработчик, монолит/микросервисы).