Поделиться через


Подключение к управляемому шлюзу для Spring в приложениях контейнеров Azure (предварительная версия)

Шлюз для Spring предлагает эффективный и эффективный способ маршрутизации, управления и обработки запросов API в рамках архитектуры микрослужб. Он служит шлюзом API, который направляет внешние запросы в разные службы, добавляя различные возможности, такие как фильтрация, балансировка нагрузки и многое другое. Из этой статьи вы узнаете, как создать шлюз, который направляет запросы к приложениям контейнеров.

Из этого руководства вы узнаете, как:

  • Создание компонента Шлюза для Spring Java
  • Обновление шлюза для spring с помощью пользовательских маршрутов для перенаправления запросов к приложениям-контейнерам

Внимание

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

Необходимые компоненты

Рекомендации

При запуске шлюза для Spring в приложениях контейнеров Azure помните о следующих сведениях:

Товар Описание
Область применения Шлюз for Spring выполняется в той же среде, что и подключенное приложение контейнера.
Ресурсы Распределение ресурсов контейнера для Шлюза для Spring исправлено, число ядер ЦП равно 0,5, а размер памяти — 1Gi.
Цены Выставление счетов на основе потребления в шлюзе для Spring не зависит от цен на основе потребления. Счета за ресурсы, используемые управляемыми компонентами Java, выставляются по тарифам "активный или простой". Вы можете удалить компоненты, которые больше не используются для остановки выставления счетов.

Настройка

Прежде чем приступить к работе с шлюзом для Spring, сначала необходимо создать необходимые ресурсы.

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

  1. Создайте переменные для поддержки конфигурации приложения. Эти значения предоставляются для вас в целях этого урока. В этом занятии мы используем конечную точку актатора администратора для примера приложения 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 Образ контейнера, используемый в приложении контейнера.
  2. Войдите в Azure с помощью Azure CLI.

    az login
    
  3. Создать группу ресурсов.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Создайте среду приложений контейнеров.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

    Эта среда используется для размещения компонента Gateway for Spring и приложения контейнера.

Использование компонента Gateway for Spring Java

Теперь, когда у вас есть среда "Приложения контейнеров", вы можете создать приложение-контейнер с помощью шлюза для весенних компонентов Java для маршрутизации запросов к ним.

  1. Создайте компонент Gateway for Spring Java.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Создайте приложение-контейнер с полным доменным именем (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-адрес в текстовый редактор, чтобы его можно было использовать на следующем шаге.

Обновление маршрутов шлюза для маршрутизации запросов

  1. Создайте ФАЙЛ YAML со следующим содержимым. Замените <MYAPP_URL> полное доменное имя приложения-контейнера на предыдущем шаге.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Выполните следующую команду, чтобы обновить компонент 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 не должна быть запрещена.