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


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

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

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

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

Внимание

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

Предварительные требования

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

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

Товар Пояснение
Область применения Шлюз Spring работает в той же среде, что и подключенное контейнерное приложение.
Ресурсы Распределение ресурсов контейнера для Шлюза Spring задано: число ядер ЦП — 0,5, размер памяти — 1 Ги.
Цены Выставление счетов для шлюза 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"
    
    Переменная Описание
    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 Spring для маршрутизации запросов к ним.

  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.

Имя свойства Описание Значение по умолчанию
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 должна быть запрещена.