1. Обзор
В этой статье мы начнем с приложения Spring Cloud Gateway и приложения Spring Boot . Затем мы обновим его, чтобы использовать вместо него Dapr (среда выполнения распределенного приложения) . Наконец, мы обновим конфигурацию Dapr, чтобы показать гибкость, которую Dapr обеспечивает при интеграции с облачными компонентами .
2. Введение в Дапр
С помощью Dapr мы можем управлять развертыванием облачного приложения без какого-либо влияния на само приложение. Dapr использует шаблон sidecar, чтобы снять с приложения проблемы развертывания, что позволяет нам развертывать его в других средах (таких как локальные, различные проприетарные облачные платформы, Kubernetes и другие) без каких-либо изменений в самом приложении . Для получения более подробной информации ознакомьтесь с этим обзором на веб-сайте Dapr.
3. Создайте примеры приложений
Мы начнем с создания примера приложения Spring Cloud Gateway и Spring Boot. В соответствии с великой традицией примеров «Hello world» шлюз будет проксировать запросы к внутреннему приложению Spring Boot для стандартного приветствия «Hello world».
3.1. Служба приветствия
Во-первых, давайте создадим приложение Spring Boot для службы приветствия. Это стандартное приложение Spring Boot с spring-boot-starter-web
в качестве единственной зависимости, стандартным основным классом и портом сервера, настроенным как 3001.
Давайте добавим контроллер для ответа на приветственную
конечную точку:
@RestController
public class GreetingController {
@GetMapping(value = "/hello")
public String getHello() {
return "Hello world!";
}
}
После создания нашего приложения службы приветствия мы запустим его:
java -jar greeting/target/greeting-1.0-SNAPSHOT.jar
Мы можем проверить это, используя curl
, чтобы вернуть «Hello world!» сообщение:
curl http://localhost:3001/hello
3.2. Весенний облачный шлюз
Теперь мы создадим Spring Cloud Gateway на порту 3000 в качестве стандартного приложения Spring Boot с spring-cloud-starter-gateway
в качестве единственной зависимости и стандартным основным классом. Мы также настроим маршрутизацию для доступа к службе приветствия:
spring:
cloud:
gateway:
routes:
- id: greeting-service
uri: http://localhost:3001/
predicates:
- Path=/**
filters:
- RewritePath=/?(?<segment>.*), /$\{segment}
Как только мы создадим приложение шлюза, мы можем запустить шлюз:
java -Dspring.profiles.active=no-dapr -jar gateway/target/gateway-1.0-SNAPSHOT.jar
Мы можем проверить это, используя curl
, чтобы вернуть «Hello world!» Сообщение от службы приветствия:
curl http://localhost:3000/hello
4. Добавьте дапр
Теперь, когда у нас есть базовый пример, давайте добавим к нему Dapr.
Мы делаем это, настроив шлюз для связи с вспомогательной машиной Dapr, а не напрямую со службой приветствия. Затем Dapr будет отвечать за поиск службы приветствия и переадресацию запроса к ней; путь связи теперь будет проходить от шлюза, через коляски Dapr и к службе приветствия.
4.1. Развертывание коляски Dapr
Во-первых, нам нужно развернуть два экземпляра sidecar Dapr — один для шлюза и один для службы приветствия. Мы делаем это с помощью интерфейса командной строки Dapr .
Мы будем использовать стандартный файл конфигурации Dapr:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec: {}
Запустим sidecar Dapr для шлюза на порту 4000 с помощью команды dapr
:
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/basic-config.yaml
Далее запустим sidecar Dapr для службы приветствия на порту 4001 с помощью команды dapr
:
dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/basic-config.yaml
Теперь, когда сайдкары работают, мы можем видеть, как они заботятся о перехвате и пересылке запросов в службу приветствия. Когда мы проверим его с помощью curl
, он должен вернуть «Hello world!» приветствие:
curl http://localhost:4001/v1.0/invoke/greeting/method/hello
Давайте попробуем тот же тест, используя боковую панель шлюза, чтобы убедиться, что она также возвращает «Hello world!» приветствие:
curl http://localhost:4000/v1.0/invoke/greeting/method/hello
Что здесь происходит за кулисами? Sidecar Dapr для шлюза использует обнаружение службы (в данном случае mDNS для локальной среды), чтобы найти sidecar Dapr для службы приветствия. Затем он использует вызов службы для вызова указанной конечной точки в службе приветствия.
4.2. Обновление конфигурации шлюза
Следующим шагом является настройка маршрутизации шлюза для использования вместо этого вспомогательной машины Dapr:
spring:
cloud:
gateway:
routes:
- id: greeting-service
uri: http://localhost:4000/
predicates:
- Path=/**
filters:
- RewritePath=//?(?<segment>.*), /v1.0/invoke/greeting/method/$\{segment}
Затем мы перезапустим шлюз с обновленной маршрутизацией:
java -Dspring.profiles.active=with-dapr -jar gateway/target/gateway-1.0-SNAPSHOT.jar
Мы можем проверить это с помощью команды curl
, чтобы еще раз получить приветствие «Hello world» от службы приветствия:
curl http://localhost:3000/hello
Когда мы смотрим на то, что происходит в сети с помощью Wireshark , мы видим, что трафик между шлюзом и сервисом идет через sidecars Dapr .
Поздравляем! Теперь мы успешно добавили Dapr в картину. Давайте посмотрим, что это нам дало: шлюз больше не нужно настраивать для поиска службы приветствия (то есть номер порта для службы приветствия больше не нужно указывать в конфигурации маршрутизации), а шлюзу больше не нужно чтобы узнать подробности того, как запрос перенаправляется в службу приветствия.
5. Обновите конфигурацию Dapr
Теперь, когда у нас есть Dapr, мы можем настроить Dapr для использования других облачных компонентов.
5.1. Используйте Consul для обнаружения служб
Давайте использовать Consul for Service Discovery вместо mDNS.
Во- первых, нам нужно установить и запустить Consul на порту по умолчанию 8500, а затем обновить конфигурацию sidecar Dapr, чтобы использовать Consul:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
nameResolution:
component: "consul"
configuration:
selfRegister: true
Затем мы перезапустим обе коляски Dapr с новой конфигурацией:
dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/consul-config.yaml
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/consul-config.yaml
После перезапуска коляски мы можем получить доступ к странице «Сервисы» в пользовательском интерфейсе консула и увидеть перечисленные шлюзы и приложения-приветствия. Обратите внимание, что нам не нужно было перезапускать само приложение.
Видишь, как это было легко? Простое изменение конфигурации коляски Dapr теперь дает нам поддержку Consul и, что наиболее важно, не влияет на базовое приложение . Это отличается от использования Spring Cloud Consul , которое требует обновления самого приложения.
5.2. Используйте Zipkin для отслеживания
Dapr также поддерживает интеграцию с Zipkin для отслеживания вызовов между приложениями.
Сначала установите и запустите Zipkin на порту по умолчанию 9411, а затем обновите конфигурацию вспомогательного модуля Dapr, чтобы добавить Zipkin:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
nameResolution:
component: "consul"
configuration:
selfRegister: true
tracing:
samplingRate: "1"
zipkin:
endpointAddress: "http://localhost:9411/api/v2/spans"
Нам нужно будет перезапустить обе коляски Dapr, чтобы подобрать новую конфигурацию:
dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/consul-zipkin-config.yaml
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/consul-zipkin-config.yaml
После перезапуска Dapr вы можете выполнить команду curl
и проверить пользовательский интерфейс Zipkin, чтобы увидеть трассировку вызовов.
Опять же, нет необходимости перезапускать шлюз и службу приветствия. Требуется только простое обновление конфигурации Dapr . Сравните это с использованием Spring Cloud Zipkin .
5.3. Другие компоненты
Существует множество компонентов, которые Dapr поддерживает для решения других проблем, таких как безопасность, мониторинг и отчетность . Полный список смотрите в документации Dapr .
6. Заключение
Мы добавили Dapr в простой пример Spring Cloud Gateway, взаимодействующий с серверной службой Spring Boot. Мы показали, как настроить и запустить вспомогательный модуль Dapr, а также как он затем позаботится об облачных проблемах, таких как обнаружение сервисов, обмен данными и отслеживание.
Хотя это происходит за счет развертывания и управления дополнительным приложением, Dapr обеспечивает гибкость для развертывания в различных облачных средах и облачных задачах, не требуя изменений в приложениях после интеграции с Dapr.
Этот подход также означает, что разработчикам не нужно быть обремененными облачными заботами во время написания кода, что позволяет им сосредоточиться на бизнес-функциях. Как только приложение настроено на использование вспомогательного модуля Dapr, различные проблемы развертывания могут быть решены без какого-либо воздействия на приложение — нет необходимости в перекодировании, повторной сборке или повторном развертывании приложений. Dapr обеспечивает четкое разделение задач приложения и развертывания .
Как всегда, полный код для этой статьи можно найти на GitHub .