Nawiązywanie połączenia z usługą Managed Gateway dla platformy Spring w Azure Container Apps (wersja zapoznawcza)

Usługa Gateway for Spring oferuje wydajny i zaawansowany sposób kierowania żądań interfejsu API oraz zarządzania nimi w ramach architektury mikrousług. Służy jako brama interfejsu API, która kieruje żądania zewnętrzne do różnych usług, dodając różne możliwości, takie jak filtrowanie, równoważenie obciążenia i inne. Z tego artykułu dowiesz się, jak utworzyć bramę, która kieruje żądania do aplikacji kontenera.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Tworzenie bramy dla składnika Spring Java
  • Zaktualizuj bramę Spring za pomocą tras niestandardowych, aby przekierować żądania do aplikacji kontenerowych

Ważne

W tym samouczku używane są usługi, które mogą wpłynąć na Twój rachunek za Azure. Jeśli zdecydujesz się wykonać kroki krok po kroku, upewnij się, że usunięto zasoby opisane w tym artykule, aby uniknąć nieoczekiwanych rozliczeń.

Wymagania wstępne

  • Konto Azure z aktywną subskrypcją. Jeśli jeszcze go nie masz, możesz go utworzyć bezpłatnie.
  • Azure CLI.

Kwestie wymagające rozważenia

Podczas uruchamiania Gateway for Spring w Azure Container Apps należy pamiętać o następujących detalach:

Towar Wyjaśnienie
Scope Gateway dla Spring działa w tym samym środowisku co połączona aplikacja kontenerowa.
Zasoby Alokacja zasobów kontenera dla usługi Gateway dla platformy Spring jest stała, liczba rdzeni procesora CPU wynosi 0,5, a rozmiar pamięci to 1Gi.
Cennik Rozliczanie Gateway dla platformy Spring podlega cenom opartym na zużyciu. Zasoby używane przez zarządzane składniki Java są rozliczane według stawek aktywnych/bezczynnych. Możesz usunąć składniki, które nie są już używane do zatrzymywania rozliczeń.

Ustawienia

Przed rozpoczęciem pracy z Spring Gateway, najpierw należy utworzyć wymagane zasoby.

Wykonaj następujące polecenia, aby utworzyć grupę zasobów i środowisko usługi Container Apps.

  1. Utwórz zmienne do obsługi konfiguracji aplikacji. Te wartości są udostępniane na potrzeby tej lekcji. W tej lekcji użyjemy punktu końcowego siłownika administratora dla przykładowej aplikacji 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"
    
    Zmienna opis
    LOCATION Lokalizacja regionu Azure, w którym tworzysz aplikację kontenera i komponent Java.
    ENVIRONMENT Nazwa środowiska Azure Container Apps dla aplikacji demonstracyjnej.
    RESOURCE_GROUP Nazwa grupy zasobów Azure dla aplikacji demonstracyjnej.
    JAVA_COMPONENT_NAME Nazwa składnika Java utworzonego dla aplikacji kontenera. W tym przypadku utworzysz składnik Gateway for Spring Java.
    IMAGE Obraz kontenera używany w aplikacji kontenera.
  2. Zaloguj się do Azure przy użyciu Azure CLI.

    az login
    
  3. Utwórz grupę zasobów.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Utwórz środowisko aplikacji kontenera.

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

    To środowisko służy do hostowania zarówno składnika Gateway for Spring, jak i aplikacji kontenera.

Używanie składnika Gateway for Spring Java

Teraz, gdy masz środowisko usługi Container Apps, możesz utworzyć aplikację kontenera przy użyciu bramy dla składników spring java w celu kierowania żądań do nich.

  1. Utwórz składnik Gateway for Spring Java.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Utwórz aplikację kontenera, która ma w pełni kwalifikowaną nazwę domeny (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
    

    To polecenie zwraca adres URL aplikacji kontenera, która korzysta z danych konfiguracji. Skopiuj adres URL do edytora tekstów, aby można było go użyć w następnym kroku.

Aktualizowanie tras bramy w celu kierowania żądań

  1. Utwórz plik YAML z następującą zawartością. Zamień <MYAPP_URL> na nazwę FQDN aplikacji kontenerowej z poprzedniego kroku.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Uruchom następujące polecenie, aby zaktualizować składnik Gateway dla Spring za pomocą konfiguracji tras.

    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
    

    To polecenie aktualizuje ścieżkę routingu bramy i zwraca adres URL bramy, który pobiera dane konfiguracyjne.

    Polecenie zwraca adres URL bramy. Odwiedzanie tego adresu URL ze ścieżką /myapp/health powinno kierować żądanie do punktu końcowego aplikacji actuator/health, zwracając {"status":"UP","groups":["liveness","readiness"]}.

Czyszczenie zasobów

Zasoby utworzone w tym samouczku mają wpływ na rachunek za Azure. Jeśli nie zamierzasz korzystać z tych usług długoterminowych, uruchom następujące polecenie, aby usunąć wszystkie elementy utworzone w tym samouczku.

az group delete --resource-group $RESOURCE_GROUP

Format pliku trasy

Komponent Gateway for Spring pozwala definiować trasy poprzez właściwości z użyciem identyfikatora, URI, predykatów i filtrów. Aby uzyskać więcej informacji, zobacz dokumentację usługi Spring Cloud Gateway. Poniżej przedstawiono przykładowy plik YAML, który pokazuje, jak skonfigurować te właściwości.

  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}"

Lista dozwolonych konfiguracji bramy dla platformy Spring(#configurable-properties)

W poniższej tabeli opisano właściwości składnika bramy, które można skonfigurować dla aplikacji. Aby uzyskać więcej informacji, zobacz Typowe właściwości aplikacji usługi Spring Cloud Gateway.

Nazwa właściwości opis Domyślna wartość
spring.cloud.gateway.default-filters Lista definicji filtrów, które są stosowane do każdej trasy.
spring.cloud.gateway.enabled Umożliwia korzystanie z funkcji bramy. true
spring.cloud.gateway.fail-on-route-definition-error Opcja niepowodzenia w przypadku błędów definicji trasy, wartość domyślna to true. W przeciwnym razie jest rejestrowane ostrzeżenie. true
spring.cloud.gateway.handler-mapping.order Kolejność RoutePredicateHandlerMapping. 1
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.discovery.locator.enabled Flaga umożliwiająca integrację bramy DiscoveryClient. false
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression Wyrażenie SpEL, które wyraża, czy należy uwzględnić usługę w integracji bramy, czy nie. Domyślna wartość to true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Opcja zmiany na małe litery serviceId w predykatach i filtrach. Domyślna wartość to false. Przydatne w Eureka, gdy automatycznie zamienia na wielkie litery serviceId. Tak więc, MYSERVICE byłoby zgodne /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix Prefiks dla routeId domyślnie to discoveryClient.getClass().getSimpleName() + "_". Identyfikator usługi jest dodawany, aby utworzyć element routeId.
spring.cloud.gateway.discovery.locator.url-expression Wyrażenie SpEL, które tworzy URI dla każdej trasy. Domyślna wartość to 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled add-request-header Włącza filtr. true
spring.cloud.gateway.filter.add-request-parameter.enabled add-request-parameter Włącza filtr. true
spring.cloud.gateway.filter.add-response-header.enabled add-response-header Włącza filtr. true
spring.cloud.gateway.filter.circuit-breaker.enabled circuit-breaker Włącza filtr. true
spring.cloud.gateway.filter.dedupe-response-header.enabled dedupe-response-header Włącza filtr. true
spring.cloud.gateway.filter.fallback-headers.enabled fallback-headers Włącza filtr. true
spring.cloud.gateway.filter.hystrix.enabled hystrix Włącza filtr. true
spring.cloud.gateway.filter.json-to-grpc.enabled Włącza filtr konwersji JSON na gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled local-response-cache Włącza filtr. false
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy
spring.cloud.gateway.filter.local-response-cache.size Maksymalny rozmiar pamięci podręcznej w celu usuwania wpisów dla tej ścieżki w KB, MB i GB.
spring.cloud.gateway.filter.local-response-cache.time-to-live Czas wygaśnięcia wpisu pamięci podręcznej, wyrażony w s sekundach, m przez minuty i h przez godziny. 5m
spring.cloud.gateway.filter.map-request-header.enabled map-request-header Włącza filtr. true
spring.cloud.gateway.filter.modify-request-body.enabled modify-request-body Włącza filtr. true
spring.cloud.gateway.filter.modify-response-body.enabled modify-response-body Włącza filtr. true
spring.cloud.gateway.filter.prefix-path.enabled prefix-path Włącza filtr. true
spring.cloud.gateway.filter.preserve-host-header.enabled preserve-host-header Włącza filtr. true
spring.cloud.gateway.filter.redirect-to.enabled redirect-to Włącza filtr. 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 Włącza filtr. true
spring.cloud.gateway.filter.remove-request-parameter.enabled remove-request-parameter Włącza filtr. true
spring.cloud.gateway.filter.remove-response-header.enabled remove-response-header Włącza filtr. true
spring.cloud.gateway.filter.request-header-size.enabled request-header-size Włącza filtr. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled request-header-to-request-uri Włącza filtr. 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 Włącza filtr. true
spring.cloud.gateway.filter.request-size.enabled request-size Włącza filtr. true
spring.cloud.gateway.filter.retry.enabled retry Włącza filtr. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled rewrite-location-response-header Włącza filtr. true
spring.cloud.gateway.filter.rewrite-location.enabled rewrite-location Włącza filtr. true
spring.cloud.gateway.filter.rewrite-path.enabled rewrite-path Włącza filtr. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled rewrite-request-parameter Włącza filtr. true
spring.cloud.gateway.filter.rewrite-response-header.enabled rewrite-response-header Włącza filtr. true
spring.cloud.gateway.filter.save-session.enabled save-session Włącza filtr. 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 Włącza filtr. 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 Włącza filtr. true
spring.cloud.gateway.filter.set-request-header.enabled set-request-header Włącza filtr. true
spring.cloud.gateway.filter.set-request-host-header.enabled set-request-host-header Włącza filtr. true
spring.cloud.gateway.filter.set-response-header.enabled set-response-header Włącza filtr. true
spring.cloud.gateway.filter.set-status.enabled set-status Włącza filtr. true
spring.cloud.gateway.filter.strip-prefix.enabled strip-prefix Włącza filtr. true
spring.cloud.gateway.forwarded.enabled Włącza element ForwardedHeadersFilter. true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled adapt-cached-body Włącza filtr globalny. true
spring.cloud.gateway.global-filter.forward-path.enabled forward-path Włącza filtr globalny. true
spring.cloud.gateway.global-filter.forward-routing.enabled forward-routing Włącza filtr globalny. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled load-balancer-client Włącza filtr globalny. true
spring.cloud.gateway.global-filter.local-response-cache.enabled local-response-cache Włącza filtr dla wszystkich tras, co umożliwia dodanie określonej konfiguracji na poziomie trasy przy użyciu filtruLocalResponseCache. true
spring.cloud.gateway.global-filter.netty-routing.enabled netty-routing global Włącza filtr. true
spring.cloud.gateway.global-filter.netty-write-response.enabled netty-write-response Włącza filtr globalny. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled reactive-load-balancer-client Włącza filtr globalny. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled remove-cached-body Włącza filtr globalny. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled route-to-request-url Włącza filtr globalny. true
spring.cloud.gateway.global-filter.websocket-routing.enabled websocket-routing Włącza filtr globalny. true
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping Jeśli globalna konfiguracja mechanizmu CORS powinna zostać dodana do obsługi URL. false
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header Nazwa nagłówka zwracającego konfigurację przepustowości w trybie burst. X-RateLimit-Burst-Capacity
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers Określa, czy nagłówki zawierają informacje o ogranicznikach szybkości. Domyślna wartość to true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header Nazwa nagłówka zwracającego liczbę pozostałych żądań w ciągu bieżącej sekundy. X-RateLimit-Remaining
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header Nazwa nagłówka zwracającego konfigurację współczynnika uzupełniania. X-RateLimit-Replenish-Rate
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header Nazwa nagłówka zwracającego żądaną konfigurację tokenów. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Ogranicza dostęp do metody i właściwości w systemie SpEL. true
spring.cloud.gateway.predicate.after.enabled after Włącza predykat. true
spring.cloud.gateway.predicate.before.enabled before Włącza predykat. true
spring.cloud.gateway.predicate.between.enabled between Włącza predykat. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled cloud-foundry-route-service Włącza predykat. true
spring.cloud.gateway.predicate.cookie.enabled cookie Włącza predykat. true
spring.cloud.gateway.predicate.header.enabled header Włącza predykat. true
spring.cloud.gateway.predicate.host.enabled host Włącza predykat. true
spring.cloud.gateway.predicate.host.include-port Uwzględnij port przy dopasowywaniu nazwy hosta. true
spring.cloud.gateway.predicate.method.enabled method Włącza predykat. true
spring.cloud.gateway.predicate.path.enabled path Włącza predykat. true
spring.cloud.gateway.predicate.query.enabled query Włącza predykat. true
spring.cloud.gateway.predicate.read-body.enabled read-body Włącza predykat. true
spring.cloud.gateway.predicate.remote-addr.enabled remote-addr Włącza predykat. true
spring.cloud.gateway.predicate.weight.enabled weight Włącza predykat. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled xforwarded-remote-addr Włącza predykat. true
spring.cloud.gateway.set-status.original-status-header-name Nazwa nagłówka, który zawiera kod HTTP zaproksowanego żądania.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Wskazuje, czy XForwardedHeadersFilter jest włączona. true
spring.cloud.gateway.x-forwarded.for-append Jeśli dołączanie X-Forwarded-For jako listy jest włączone. true
spring.cloud.gateway.x-forwarded.for-enabled Wskazuje, czy X-Forwarded-For jest włączona. true
spring.cloud.gateway.x-forwarded.host-append Jeśli dołączanie X-Forwarded-Host jako listy jest włączone. true
spring.cloud.gateway.x-forwarded.host-enabled Wskazuje, czy X-Forwarded-Host jest włączona. true
spring.cloud.gateway.x-forwarded.order Kolejność XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Jeśli dołączanie X-Forwarded-Port jako listy jest włączone. true
spring.cloud.gateway.x-forwarded.port-enabled Wskazuje, czy X-Forwarded-Port jest włączona. true
spring.cloud.gateway.x-forwarded.prefix-append Jeśli dołączanie X-Forwarded-Prefix jako listy jest włączone. true
spring.cloud.gateway.x-forwarded.prefix-enabled Wskazuje, czy X-Forwarded-Prefix jest włączona. true
spring.cloud.gateway.x-forwarded.proto-append Jeśli dołączanie X-Forwarded-Proto jako listy jest włączone. true
spring.cloud.gateway.x-forwarded.proto-enabled Wskazuje, czy X-Forwarded-Proto jest włączona. true
spring.cloud.gateway.httpclient.compression Włącza kompresję dla Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout Limit czasu połączenia w milisekundach. Domyślna wartość to 30s.
spring.cloud.gateway.httpclient.max-header-size Maksymalny rozmiar nagłówka odpowiedzi.
spring.cloud.gateway.httpclient.max-initial-line-length Maksymalna długość linii początkowej.
spring.cloud.gateway.httpclient.pool.acquire-timeout Tylko dla typu FIXED, maksymalny czas w milisekundach oczekiwania na uzyskanie dostępu.
spring.cloud.gateway.httpclient.pool.eviction-interval Wykonaj regularne kontrole eksmisji w tle w określonym interwale. Wyłączone domyślnie ({@link Duration#ZERO}). 0
spring.cloud.gateway.httpclient.pool.max-connections Tylko dla typu FIXED, maksymalna liczba połączeń, zanim rozpocznie się oczekujące nabycie dla istniejących połączeń.
spring.cloud.gateway.httpclient.pool.max-idle-time Czas w milisekundach, po którym kanał jest zamknięty. Jeśli NULL, nie ma maksymalnego czasu bezczynności.
spring.cloud.gateway.httpclient.pool.max-life-time Czas trwania, po którym kanał jest zamknięty. Jeśli NULL, nie ma maksymalnego czasu życia.
spring.cloud.gateway.httpclient.pool.metrics Umożliwia zbieranie i rejestrowanie metryk pul kanałów w mikrometrze. Wyłączone domyślnie. false
spring.cloud.gateway.httpclient.pool.name Nazwa mapy puli kanałów. Domyślna wartość to proxy. proxy
spring.cloud.gateway.httpclient.pool.type Typ puli do użycia dla HttpClient, domyślnie ELASTIC.
spring.cloud.gateway.httpclient.response-timeout Limit czasu odpowiedzi.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Limit czasu opróżniania PROTOKOŁU SSL close_notify . Domyślna wartość to 3000 ms. 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Przekroczenie limitu czasu odczytu SSL close_notify. Domyślna wartość to 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Przekroczenie czasu uzgadniania SSL. Domyślna wartość to 10000 ms. 10000ms
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager Instaluje Netty InsecureTrustManagerFactory. Ta wartość jest niezabezpieczona i nie jest odpowiednia dla środowiska produkcyjnego. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Maksymalna długość ładunku ramki.
spring.cloud.gateway.httpclient.websocket.proxy-ping Ramki ping serwera proxy do usług podrzędnych. Domyślna wartość to true. true
spring.cloud.gateway.httpclient.wiretap Włącza debugowanie podsłuchów dla Netty HttpClient. false
spring.cloud.gateway.httpserver.wiretap Włącza debugowanie podsłuchów dla Netty HttpServer. false
spring.cloud.gateway.metrics.enabled Umożliwia zbieranie danych metryk. false
spring.cloud.gateway.metrics.prefix Prefiks wszystkich metryk emitowanych przez bramę. spring.cloud.gateway
spring.cloud.gateway.metrics.tags Mapa tagów dodana do metryk.
spring.cloud.gateway.observability.enabled Wskazuje, czy należy włączyć obsługę obserwacji mikrometrów. true

Typowe konfiguracje

Poniższa lista zawiera opis typowych konfiguracji:

  • Rejestrowanie powiązanych konfiguracji:
    • logging.level.*
    • logging.group.*
    • Wszelkie inne konfiguracje w przestrzeni nazw logging.* powinny być zabronione. Na przykład zapisywanie plików dziennika przy użyciu polecenia logging.file powinno być zabronione.