Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Шлюз для Spring предлагает эффективный и эффективный способ маршрутизации, управления и обработки запросов API в рамках архитектуры микрослужб. Он служит шлюзом API, который направляет внешние запросы в разные службы, добавляя различные возможности, такие как фильтрация, балансировка нагрузки и многое другое. Из этой статьи вы узнаете, как создать шлюз, который направляет запросы к приложениям контейнеров.
Из этого руководства вы узнаете, как:
- Создание компонента Шлюза для Spring Java
- Обновление шлюза Spring с помощью пользовательских маршрутов для перенаправления запросов к контейнерным приложениям.
Внимание
В этом руководстве используются службы, которые могут повлиять на счет Azure. Если вы решили выполнить пошаговые инструкции, удалите ресурсы, описанные в этой статье, чтобы избежать непредвиденных выставления счетов.
Предварительные требования
- Учетная запись Azure с активной подпиской. Если у вас еще нет, его можно создать бесплатно.
- Azure CLI.
Рекомендации
При запуске шлюза для Spring в Контейнеры приложений Azure помните о следующих сведениях:
| Товар | Пояснение |
|---|---|
| Область применения | Шлюз Spring работает в той же среде, что и подключенное контейнерное приложение. |
| Ресурсы | Распределение ресурсов контейнера для Шлюза Spring задано: число ядер ЦП — 0,5, размер памяти — 1 Ги. |
| Цены | Выставление счетов для шлюза 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"Переменная Описание 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 Spring для маршрутизации запросов к ним.
Создайте компонент 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.
| Имя свойства | Описание | Значение по умолчанию |
|---|---|---|
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 |
Возможность преобразования в нижний регистр для предикатов и фильтров. Значение по умолчанию — 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. |
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 |
Указывает, следует ли включить поддержку наблюдаемости микрометра. | true |
Распространенные способы конфигурирования
В следующем списке описаны распространенные конфигурации:
- Конфигурации ведения журналов:
logging.level.*logging.group.*- Любые другие конфигурации в
logging.*пространстве имен должны быть запрещены. Например, запись файлов журналов с помощьюlogging.fileдолжна быть запрещена.