Подключение к управляемому шлюзу для Spring в приложениях контейнеров Azure (предварительная версия)
Шлюз для Spring предлагает эффективный и эффективный способ маршрутизации, управления и обработки запросов API в рамках архитектуры микрослужб. Он служит шлюзом API, который направляет внешние запросы в разные службы, добавляя различные возможности, такие как фильтрация, балансировка нагрузки и многое другое. Из этой статьи вы узнаете, как создать шлюз, который направляет запросы к приложениям контейнеров.
Из этого руководства вы узнаете, как:
- Создание компонента Шлюза для Spring Java
- Обновление шлюза для spring с помощью пользовательских маршрутов для перенаправления запросов к приложениям-контейнерам
Внимание
В этом руководстве используются службы, которые могут повлиять на счет Azure. Если вы решили выполнить пошаговые инструкции, удалите ресурсы, описанные в этой статье, чтобы избежать непредвиденных выставления счетов.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Если у вас еще нет, его можно создать бесплатно.
- Azure CLI.
Рекомендации
При запуске шлюза для Spring в приложениях контейнеров Azure помните о следующих сведениях:
Товар | Описание |
---|---|
Область применения | Шлюз for Spring выполняется в той же среде, что и подключенное приложение контейнера. |
Ресурсы | Распределение ресурсов контейнера для Шлюза для Spring исправлено, число ядер ЦП равно 0,5, а размер памяти — 1Gi. |
Цены | Выставление счетов на основе потребления в шлюзе для Spring не зависит от цен на основе потребления. Счета за ресурсы, используемые управляемыми компонентами Java, выставляются по тарифам "активный или простой". Вы можете удалить компоненты, которые больше не используются для остановки выставления счетов. |
Настройка
Прежде чем приступить к работе с шлюзом для Spring, сначала необходимо создать необходимые ресурсы.
Выполните следующие команды, чтобы создать группу ресурсов и среду приложений контейнеров.
Создайте переменные для поддержки конфигурации приложения. Эти значения предоставляются для вас в целях этого урока. В этом занятии мы используем конечную точку актатора администратора для примера приложения spring.
export LOCATION=eastus export RESOURCE_GROUP=my-spring-cloud-resource-group export ENVIRONMENT=my-spring-cloud-environment export JAVA_COMPONENT_NAME=mygateway export APP_NAME=myapp export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
«Переменная» Description LOCATION
Расположение региона Azure, в котором создается приложение контейнера и компонент Java. ENVIRONMENT
Имя среды "Приложения контейнеров Azure" для демонстрационного приложения. RESOURCE_GROUP
Имя группы ресурсов Azure для демонстрационного приложения. JAVA_COMPONENT_NAME
Имя компонента Java, созданного для приложения контейнера. В этом случае создается компонент Gateway for Spring Java. IMAGE
Образ контейнера, используемый в приложении контейнера. Войдите в Azure с помощью Azure CLI.
az login
Создать группу ресурсов.
az group create --name $RESOURCE_GROUP --location $LOCATION
Создайте среду приложений контейнеров.
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
Эта среда используется для размещения компонента Gateway for Spring и приложения контейнера.
Использование компонента Gateway for Spring Java
Теперь, когда у вас есть среда "Приложения контейнеров", вы можете создать приложение-контейнер с помощью шлюза для весенних компонентов Java для маршрутизации запросов к ним.
Создайте компонент Gateway for Spring Java.
az containerapp env java-component gateway-for-spring create \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \
Создайте приложение-контейнер с полным доменным именем (FQDN).
az containerapp create \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --environment $ENVIRONMENT \ --image $IMAGE \ --ingress external \ --target-port 8080 \ --query properties.configuration.ingress.fqdn
Эта команда возвращает URL-адрес приложения контейнера, использующее данные конфигурации. Скопируйте URL-адрес в текстовый редактор, чтобы его можно было использовать на следующем шаге.
Обновление маршрутов шлюза для маршрутизации запросов
Создайте ФАЙЛ YAML со следующим содержимым. Замените
<MYAPP_URL>
полное доменное имя приложения-контейнера на предыдущем шаге.springCloudGatewayRoutes: - id: "route1" uri: "<MYAPP_URL>" predicates: - "Path=/myapp/{path}" filters: - "SetPath=/actuator/{path}"
Выполните следующую команду, чтобы обновить компонент Gateway for Spring с конфигурацией маршрута.
az containerapp env java-component gateway-for-spring update \ --environment $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --name $JAVA_COMPONENT_NAME \ --route-yaml <PTAH_TO_ROUTE_YAML_FILE> \ --query properties.ingress.fqdn
Эта команда обновляет маршрут шлюза и возвращает URL-адрес шлюза, который использует данные конфигурации.
Команда возвращает URL-адрес шлюза. Посетите этот URL-адрес с путем
/myapp/health
, который должен направлять запрос к конечной точке приложенияactuator/health
, возвращая{"status":"UP","groups":["liveness","readiness"]}
его.
Очистка ресурсов
Ресурсы, созданные в этом руководстве, влияют на счет Azure. Если вы не собираетесь использовать эти службы в долгосрочной перспективе, выполните следующую команду, чтобы удалить все, созданное в этом руководстве.
az group delete --resource-group $RESOURCE_GROUP
Формат файла маршрута
Компонент Gateway for Spring поддерживает определение маршрутов через свойства с идентификаторами, URI, предикатами и фильтрами. Дополнительные сведения см. в документации по Spring Cloud Gateway. Ниже приведен пример YAML-файла, демонстрирующего настройку этих свойств.
springCloudGatewayRoutes:
- id: "route1"
uri: "https://otherjavacomponent.myenvironment.test.net"
predicates:
- "Path=/v1/{path}"
- "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
filters:
- "SetPath=/{path}"
- id: "route2"
uri: "https://otherjavacomponent.myenvironment.test.net"
predicates:
- "Path=/v2/{path}"
- "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
filters:
- "SetPath=/{path}"
Список разрешенных конфигураций для шлюза для Spring(#configurable-properties)
В следующей таблице описаны свойства компонента шлюза, которые можно настроить для приложения. Дополнительные сведения см. в разделе Свойств общего приложения Spring Cloud Gateway.
Имя свойства | Description | Default value |
---|---|---|
spring.cloud.gateway.default-filters |
Список определений фильтров, применяемых к каждому маршруту. | |
spring.cloud.gateway.enabled |
Включает функции шлюза. | true |
spring.cloud.gateway.fail-on-route-definition-error |
Параметр для сбоя ошибок определения маршрута по умолчанию имеет значение true. В противном случае регистрируется предупреждение. | true |
spring.cloud.gateway.handler-mapping.order |
Порядок RoutePredicateHandlerMapping . |
1 |
spring.cloud.gateway.loadbalancer.use404 |
false |
|
spring.cloud.gateway.discovery.locator.enabled |
Флаг, обеспечивающий интеграцию шлюза DiscoveryClient . |
false |
spring.cloud.gateway.discovery.locator.filters |
||
spring.cloud.gateway.discovery.locator.include-expression |
Выражение SpEL, которое оценивает, следует ли включать службу в интеграцию шлюза или нет. Значение по умолчанию — true . |
true |
spring.cloud.gateway.discovery.locator.lower-case-service-id |
Вариант нижнего регистра serviceId в предикаты и фильтры. Значение по умолчанию — false . Полезно при использовании Eureka при автоматическом вводе в верхние регистры serviceId . Таким образом, MYSERVICE будет соответствовать /myservice/** |
false |
spring.cloud.gateway.discovery.locator.predicates |
||
spring.cloud.gateway.discovery.locator.route-id-prefix |
Префикс для параметра routeId , по умолчанию — discoveryClient.getClass().getSimpleName() "_". Идентификатор службы добавляется для создания routeId . |
|
spring.cloud.gateway.discovery.locator.url-expression |
Выражение SpEL, создающее универсальный код ресурса (URI) для каждого маршрута. Значение по умолчанию — 'lb://'+serviceId . |
'lb://'+serviceId |
spring.cloud.gateway.filter.add-request-header.enabled |
add-request-header Включает фильтр. |
true |
spring.cloud.gateway.filter.add-request-parameter.enabled |
add-request-parameter Включает фильтр. |
true |
spring.cloud.gateway.filter.add-response-header.enabled |
add-response-header Включает фильтр. |
true |
spring.cloud.gateway.filter.circuit-breaker.enabled |
circuit-breaker Включает фильтр. |
true |
spring.cloud.gateway.filter.dedupe-response-header.enabled |
dedupe-response-header Включает фильтр. |
true |
spring.cloud.gateway.filter.fallback-headers.enabled |
fallback-headers Включает фильтр. |
true |
spring.cloud.gateway.filter.hystrix.enabled |
hystrix Включает фильтр. |
true |
spring.cloud.gateway.filter.json-to-grpc.enabled |
Включает фильтр JSON для gRPC. | true |
spring.cloud.gateway.filter.local-response-cache.enabled |
local-response-cache Включает фильтр. |
false |
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy |
||
spring.cloud.gateway.filter.local-response-cache.size |
Максимальный размер кэша для вытеснения записей для этого маршрута в КБ, МБ и ГБ. | |
spring.cloud.gateway.filter.local-response-cache.time-to-live |
Срок действия записи кэша, выраженный в s секундах, m в минутах и h в течение нескольких часов. |
5m |
spring.cloud.gateway.filter.map-request-header.enabled |
map-request-header Включает фильтр. |
true |
spring.cloud.gateway.filter.modify-request-body.enabled |
modify-request-body Включает фильтр. |
true |
spring.cloud.gateway.filter.modify-response-body.enabled |
modify-response-body Включает фильтр. |
true |
spring.cloud.gateway.filter.prefix-path.enabled |
prefix-path Включает фильтр. |
true |
spring.cloud.gateway.filter.preserve-host-header.enabled |
preserve-host-header Включает фильтр. |
true |
spring.cloud.gateway.filter.redirect-to.enabled |
redirect-to Включает фильтр. |
true |
spring.cloud.gateway.filter.remove-hop-by-hop.headers |
||
spring.cloud.gateway.filter.remove-hop-by-hop.order |
0 |
|
spring.cloud.gateway.filter.remove-request-header.enabled |
remove-request-header Включает фильтр. |
true |
spring.cloud.gateway.filter.remove-request-parameter.enabled |
remove-request-parameter Включает фильтр. |
true |
spring.cloud.gateway.filter.remove-response-header.enabled |
remove-response-header Включает фильтр. |
true |
spring.cloud.gateway.filter.request-header-size.enabled |
request-header-size Включает фильтр. |
true |
spring.cloud.gateway.filter.request-header-to-request-uri.enabled |
request-header-to-request-uri Включает фильтр. |
true |
spring.cloud.gateway.filter.request-rate-limiter.default-key-resolver |
||
spring.cloud.gateway.filter.request-rate-limiter.default-rate-limiter |
||
spring.cloud.gateway.filter.request-rate-limiter.enabled |
request-rate-limiter Включает фильтр. |
true |
spring.cloud.gateway.filter.request-size.enabled |
request-size Включает фильтр. |
true |
spring.cloud.gateway.filter.retry.enabled |
retry Включает фильтр. |
true |
spring.cloud.gateway.filter.rewrite-location-response-header.enabled |
rewrite-location-response-header Включает фильтр. |
true |
spring.cloud.gateway.filter.rewrite-location.enabled |
rewrite-location Включает фильтр. |
true |
spring.cloud.gateway.filter.rewrite-path.enabled |
rewrite-path Включает фильтр. |
true |
spring.cloud.gateway.filter.rewrite-request-parameter.enabled |
rewrite-request-parameter Включает фильтр. |
true |
spring.cloud.gateway.filter.rewrite-response-header.enabled |
rewrite-response-header Включает фильтр. |
true |
spring.cloud.gateway.filter.save-session.enabled |
save-session Включает фильтр. |
true |
spring.cloud.gateway.filter.secure-headers.content-security-policy |
default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline' |
|
spring.cloud.gateway.filter.secure-headers.content-type-options |
nosniff |
|
spring.cloud.gateway.filter.secure-headers.disable |
||
spring.cloud.gateway.filter.secure-headers.download-options |
noopen |
|
spring.cloud.gateway.filter.secure-headers.enabled |
secure-headers Включает фильтр. |
true |
spring.cloud.gateway.filter.secure-headers.frame-options |
DENY |
|
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies |
none |
|
spring.cloud.gateway.filter.secure-headers.referrer-policy |
no-referrer |
|
spring.cloud.gateway.filter.secure-headers.strict-transport-security |
max-age=631138519 |
|
spring.cloud.gateway.filter.secure-headers.xss-protection-header |
1 ; mode=block |
|
spring.cloud.gateway.filter.set-path.enabled |
set-path Включает фильтр. |
true |
spring.cloud.gateway.filter.set-request-header.enabled |
set-request-header Включает фильтр. |
true |
spring.cloud.gateway.filter.set-request-host-header.enabled |
set-request-host-header Включает фильтр. |
true |
spring.cloud.gateway.filter.set-response-header.enabled |
set-response-header Включает фильтр. |
true |
spring.cloud.gateway.filter.set-status.enabled |
set-status Включает фильтр. |
true |
spring.cloud.gateway.filter.strip-prefix.enabled |
strip-prefix Включает фильтр. |
true |
spring.cloud.gateway.forwarded.enabled |
ForwardedHeadersFilter Включает . |
true |
spring.cloud.gateway.global-filter.adapt-cached-body.enabled |
Включает глобальный adapt-cached-body фильтр. |
true |
spring.cloud.gateway.global-filter.forward-path.enabled |
Включает глобальный forward-path фильтр. |
true |
spring.cloud.gateway.global-filter.forward-routing.enabled |
Включает глобальный forward-routing фильтр. |
true |
spring.cloud.gateway.global-filter.load-balancer-client.enabled |
Включает глобальный load-balancer-client фильтр. |
true |
spring.cloud.gateway.global-filter.local-response-cache.enabled |
local-response-cache Включает фильтр для всех маршрутов, что позволяет добавлять определенную конфигурацию на уровне маршрута с помощью LocalResponseCache фильтра. |
true |
spring.cloud.gateway.global-filter.netty-routing.enabled |
netty-routing global Включает фильтр. |
true |
spring.cloud.gateway.global-filter.netty-write-response.enabled |
Включает глобальный netty-write-response фильтр. |
true |
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled |
Включает глобальный reactive-load-balancer-client фильтр. |
true |
spring.cloud.gateway.global-filter.remove-cached-body.enabled |
Включает глобальный remove-cached-body фильтр. |
true |
spring.cloud.gateway.global-filter.route-to-request-url.enabled |
Включает глобальный route-to-request-url фильтр. |
true |
spring.cloud.gateway.global-filter.websocket-routing.enabled |
Включает глобальный websocket-routing фильтр. |
true |
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping |
Если глобальная конфигурация CORS должна быть добавлена в обработчик URL-адресов. | false |
spring.cloud.gateway.globalcors.cors-configurations |
||
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header |
Имя заголовка, возвращающего конфигурацию емкости всплеска. | X-RateLimit-Burst-Capacity |
spring.cloud.gateway.redis-rate-limiter.config |
||
spring.cloud.gateway.redis-rate-limiter.include-headers |
Следует ли включать заголовки, содержащие сведения об ограничении скорости. Значение по умолчанию — true . |
true |
spring.cloud.gateway.redis-rate-limiter.remaining-header |
Имя заголовка, возвращающего количество оставшихся запросов во время текущей секунды. | X-RateLimit-Remaining |
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header |
Имя заголовка, возвращающего конфигурацию частоты пополнения. | X-RateLimit-Replenish-Rate |
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header |
Имя заголовка, возвращающего запрошенную конфигурацию маркеров. | X-RateLimit-Requested-Tokens |
spring.cloud.gateway.restrictive-property-accessor.enabled |
Ограничивает доступ к методу и свойству в SpEL. | true |
spring.cloud.gateway.predicate.after.enabled |
after Включает предикат. |
true |
spring.cloud.gateway.predicate.before.enabled |
before Включает предикат. |
true |
spring.cloud.gateway.predicate.between.enabled |
between Включает предикат. |
true |
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled |
cloud-foundry-route-service Включает предикат. |
true |
spring.cloud.gateway.predicate.cookie.enabled |
cookie Включает предикат. |
true |
spring.cloud.gateway.predicate.header.enabled |
header Включает предикат. |
true |
spring.cloud.gateway.predicate.host.enabled |
host Включает предикат. |
true |
spring.cloud.gateway.predicate.host.include-port |
Включите порт в соответствие имени узла. | true |
spring.cloud.gateway.predicate.method.enabled |
method Включает предикат. |
true |
spring.cloud.gateway.predicate.path.enabled |
path Включает предикат. |
true |
spring.cloud.gateway.predicate.query.enabled |
query Включает предикат. |
true |
spring.cloud.gateway.predicate.read-body.enabled |
read-body Включает предикат. |
true |
spring.cloud.gateway.predicate.remote-addr.enabled |
remote-addr Включает предикат. |
true |
spring.cloud.gateway.predicate.weight.enabled |
weight Включает предикат. |
true |
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled |
xforwarded-remote-addr Включает предикат. |
true |
spring.cloud.gateway.set-status.original-status-header-name |
Имя заголовка, содержащего HTTP-код прокси-запроса. | |
spring.cloud.gateway.streaming-media-types |
||
spring.cloud.gateway.x-forwarded.enabled |
Если этот параметр XForwardedHeadersFilter включен. |
true |
spring.cloud.gateway.x-forwarded.for-append |
Если добавление X-Forwarded-For в качестве списка включено. |
true |
spring.cloud.gateway.x-forwarded.for-enabled |
Если X-Forwarded-For этот параметр включен. |
true |
spring.cloud.gateway.x-forwarded.host-append |
Если добавление X-Forwarded-Host в качестве списка включено. |
true |
spring.cloud.gateway.x-forwarded.host-enabled |
Если X-Forwarded-Host этот параметр включен. |
true |
spring.cloud.gateway.x-forwarded.order |
Порядок XForwardedHeadersFilter . |
0 |
spring.cloud.gateway.x-forwarded.port-append |
Если добавление X-Forwarded-Port в качестве списка включено. |
true |
spring.cloud.gateway.x-forwarded.port-enabled |
Если X-Forwarded-Port этот параметр включен. |
true |
spring.cloud.gateway.x-forwarded.prefix-append |
Если добавление X-Forwarded-Prefix в качестве списка включено. |
true |
spring.cloud.gateway.x-forwarded.prefix-enabled |
Если X-Forwarded-Prefix этот параметр включен. |
true |
spring.cloud.gateway.x-forwarded.proto-append |
Если добавление X-Forwarded-Proto в качестве списка включено. |
true |
spring.cloud.gateway.x-forwarded.proto-enabled |
Если X-Forwarded-Proto этот параметр включен. |
true |
spring.cloud.gateway.httpclient.compression |
Включает сжатие для Netty HttpClient . |
false |
spring.cloud.gateway.httpclient.connect-timeout |
Подключенная тайм-аут в милли. Значение по умолчанию — 30s . |
|
spring.cloud.gateway.httpclient.max-header-size |
Максимальный размер заголовка ответа. | |
spring.cloud.gateway.httpclient.max-initial-line-length |
Максимальная начальная длина строки. | |
spring.cloud.gateway.httpclient.pool.acquire-timeout |
Только для типа FIXED , максимальное время в милли, чтобы ждать получения. |
|
spring.cloud.gateway.httpclient.pool.eviction-interval |
Выполняйте регулярные проверки вытеснения в фоновом режиме с заданным интервалом. Отключено по умолчанию ({@link Duration#ZERO} ). |
0 |
spring.cloud.gateway.httpclient.pool.max-connections |
Только для типа FIXED, максимальное количество подключений перед началом ожидающего приобретения для существующих. | |
spring.cloud.gateway.httpclient.pool.max-idle-time |
Время в милли, после которого канал закрыт. Если NULL нет максимального времени простоя. |
|
spring.cloud.gateway.httpclient.pool.max-life-time |
Длительность, после которой канал закрыт. Если NULL нет максимального времени жизни. |
|
spring.cloud.gateway.httpclient.pool.metrics |
Позволяет собирать и регистрировать метрики пулов каналов в Micrometer. Выключено по умолчанию. | false |
spring.cloud.gateway.httpclient.pool.name |
Имя карты пула каналов по умолчанию используется для прокси-сервера. | proxy |
spring.cloud.gateway.httpclient.pool.type |
Тип пула для HttpClient использования по умолчанию ELASTIC . |
|
spring.cloud.gateway.httpclient.response-timeout |
Время ожидания отклика. | |
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout |
Время ожидания очистки SSL close_notify . Значение 3000 ms по умолчанию. |
3000ms |
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout |
Время ожидания чтения SSL close_notify . Значение по умолчанию — 0 ms . |
0 |
spring.cloud.gateway.httpclient.ssl.handshake-timeout |
Время ожидания подтверждения SSL. Значение по умолчанию — 10000 ms. . |
10000ms |
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager |
Устанавливает netty InsecureTrustManagerFactory . Это небезопасно и не подходит для рабочей среды. |
false |
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length |
Максимальная длина полезных данных кадра. | |
spring.cloud.gateway.httpclient.websocket.proxy-ping |
Кадры ping прокси-сервера к подчиненным службам. Значение по умолчанию — true . |
true |
spring.cloud.gateway.httpclient.wiretap |
Включает отладку проволочной передачи для Netty HttpClient . |
false |
spring.cloud.gateway.httpserver.wiretap |
Включает отладку проволочной передачи для Netty HttpServer . |
false |
spring.cloud.gateway.metrics.enabled |
Включает сбор данных метрик. | false |
spring.cloud.gateway.metrics.prefix |
Префикс всех метрик, создаваемых шлюзом. | spring.cloud.gateway |
spring.cloud.gateway.metrics.tags |
Карта тегов, добавленная в метрики. | |
spring.cloud.gateway.observability.enabled |
Если должна быть включена поддержка наблюдаемости Micrometer. | true |
Распространенные способы конфигурирования
В следующем списке описаны распространенные конфигурации:
- Связанные с ведением журнала конфигурации:
logging.level.*
logging.group.*
- Любые другие конфигурации в
logging.*
пространстве имен должны быть запрещены. Например, запись файлов журналов с помощьюlogging.file
не должна быть запрещена.