Bagikan melalui


Menyambungkan ke Gateway terkelola untuk Spring di Azure Container Apps (pratinjau)

Gateway untuk Spring menawarkan cara yang efisien dan kuat untuk merutekan, mengelola, dan menangani permintaan API sebagai bagian dari arsitektur layanan mikro. Ini berfungsi sebagai API Gateway yang merutekan permintaan eksternal ke layanan yang berbeda, menambahkan berbagai kemampuan seperti pemfilteran, penyeimbangan beban, dan banyak lagi. Dalam artikel ini, Anda mempelajari cara membuat gateway yang mengarahkan permintaan ke aplikasi kontainer Anda.

Dalam tutorial ini, Anda mempelajari caranya:

  • Membuat gateway untuk komponen Spring Java
  • Memperbarui gateway untuk spring dengan rute kustom untuk mengalihkan permintaan ke aplikasi kontainer

Penting

Tutorial ini menggunakan layanan yang dapat memengaruhi tagihan Azure Anda. Jika Anda memutuskan untuk mengikuti langkah demi langkah, pastikan Anda menghapus sumber daya yang ditampilkan dalam artikel ini untuk menghindari penagihan yang tidak terduga.

Prasyarat

Pertimbangan

Saat berjalan di Gateway untuk Spring di Azure Container Apps, ketahui detail berikut:

Item Penjelasan
Cakupan Gateway untuk Spring berjalan di lingkungan yang sama dengan aplikasi kontainer yang terhubung.
Sumber Alokasi sumber daya kontainer untuk Gateway untuk Spring diperbaiki, jumlah inti CPU adalah 0,5, dan ukuran memorinya adalah 1Gi.
Harga Tagihan Gateway untuk Spring berada di bawah harga berbasis konsumsi. Sumber daya yang digunakan oleh komponen Java terkelola ditagih dengan tarif aktif/diam. Anda dapat menghapus komponen yang tidak lagi digunakan untuk menghentikan penagihan.

Siapkan

Sebelum Anda mulai bekerja dengan Gateway untuk Spring, Anda harus terlebih dahulu membuat sumber daya yang diperlukan.

Jalankan perintah berikut untuk membuat grup sumber daya dan lingkungan Container Apps Anda.

  1. Buat variabel untuk mendukung konfigurasi aplikasi Anda. Nilai-nilai ini disediakan untuk Anda untuk tujuan pelajaran ini. Kami menggunakan titik akhir aktuator admin untuk aplikasi sampel spring dalam pelajaran ini.

    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"
    
    Variabel Deskripsi
    LOCATION Lokasi wilayah Azure tempat Anda membuat aplikasi kontainer dan komponen Java.
    ENVIRONMENT Nama lingkungan Azure Container Apps untuk aplikasi demo Anda.
    RESOURCE_GROUP Nama grup sumber daya Azure untuk aplikasi demo Anda.
    JAVA_COMPONENT_NAME Nama komponen Java yang dibuat untuk aplikasi kontainer Anda. Dalam hal ini, Anda membuat komponen Gateway untuk Spring Java.
    IMAGE Gambar kontainer yang digunakan di aplikasi kontainer Anda.
  2. Masuk ke Azure dengan Azure CLI.

    az login
    
  3. Buat grup sumber daya.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Buat lingkungan aplikasi kontainer Anda.

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

    Lingkungan ini digunakan untuk menghosting komponen Gateway for Spring dan aplikasi kontainer Anda.

Menggunakan komponen Gateway untuk Spring Java

Setelah memiliki lingkungan Container Apps, Anda dapat membuat aplikasi kontainer menggunakan gateway untuk komponen spring java untuk merutekan permintaan ke aplikasi tersebut.

  1. Buat komponen Gateway untuk Spring Java.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Buat aplikasi kontainer yang memiliki nama domain yang sepenuhnya memenuhi syarat (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
    

    Perintah ini mengembalikan URL aplikasi kontainer Anda yang menggunakan data konfigurasi. Salin URL ke editor teks sehingga Anda dapat menggunakannya di langkah berikutnya.

Memperbarui Rute Gateway untuk merutekan permintaan

  1. Buat file YAML dengan konten berikut. Ganti <MYAPP_URL> dengan FQDN aplikasi kontainer dari langkah sebelumnya.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Jalankan perintah berikut untuk memperbarui komponen Gateway for Spring dengan konfigurasi rute Anda.

    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
    

    Perintah ini memperbarui rute gateway dan mengembalikan URL gateway Anda yang menggunakan data konfigurasi.

    Perintah mengembalikan URL gateway. Mengunjungi URL ini dengan jalur /myapp/health harus merutekan permintaan ke titik akhir aplikasi actuator/health Anda, mengembalikan {"status":"UP","groups":["liveness","readiness"]}.

Membersihkan sumber daya

Sumber daya yang dibuat dalam tutorial ini berpengaruh pada tagihan Azure Anda. Jika Anda tidak akan menggunakan layanan ini dalam jangka panjang, jalankan perintah berikut untuk menghapus semua yang dibuat dalam tutorial ini.

az group delete --resource-group $RESOURCE_GROUP

Format file rute

Komponen Gateway untuk Spring mendukung menentukan rute melalui properti dengan ID, URI, predikat, dan filter. Untuk informasi selengkapnya, lihat dokumentasi Spring Cloud Gateway. Berikut ini adalah contoh file YAML yang menunjukkan cara mengonfigurasi properti ini.

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

Daftar konfigurasi yang diizinkan untuk Gateway anda untuk Spring(#configurable-properties)

Tabel berikut ini menjelaskan properti komponen gateway yang bisa Anda konfigurasi untuk aplikasi Anda. Untuk informasi selengkapnya, lihat Properti aplikasi Umum Spring Cloud Gateway.

Nama properti Deskripsi Nilai default
spring.cloud.gateway.default-filters Daftar definisi filter yang diterapkan ke setiap rute.
spring.cloud.gateway.enabled Mengaktifkan fungsionalitas gateway. true
spring.cloud.gateway.fail-on-route-definition-error Opsi untuk gagal pada kesalahan definisi rute, default ke true. Jika tidak, peringatan dicatat. true
spring.cloud.gateway.handler-mapping.order Urutan RoutePredicateHandlerMapping. 1
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.discovery.locator.enabled Bendera yang memungkinkan DiscoveryClient integrasi gateway. false
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression Ekspresi SpEL yang mengevaluasi apakah akan menyertakan layanan dalam integrasi gateway atau tidak. Nilai defaultnya adalah true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Opsi untuk menurunkan huruf serviceId besar/kecil dalam predikat dan filter. Nilai defaultnya adalah false. Berguna dengan Eureka ketika secara otomatis huruf besar serviceId. Jadi, MYSERVICE akan cocok /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix Awalan routeIduntuk , default ke discoveryClient.getClass().getSimpleName() + "_". ID Layanan ditambahkan untuk membuat routeId.
spring.cloud.gateway.discovery.locator.url-expression Ekspresi SpEL yang membuat URI untuk setiap rute. Nilai defaultnya adalah 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled add-request-header Mengaktifkan filter. true
spring.cloud.gateway.filter.add-request-parameter.enabled add-request-parameter Mengaktifkan filter. true
spring.cloud.gateway.filter.add-response-header.enabled add-response-header Mengaktifkan filter. true
spring.cloud.gateway.filter.circuit-breaker.enabled circuit-breaker Mengaktifkan filter. true
spring.cloud.gateway.filter.dedupe-response-header.enabled dedupe-response-header Mengaktifkan filter. true
spring.cloud.gateway.filter.fallback-headers.enabled fallback-headers Mengaktifkan filter. true
spring.cloud.gateway.filter.hystrix.enabled hystrix Mengaktifkan filter. true
spring.cloud.gateway.filter.json-to-grpc.enabled Mengaktifkan filter JSON ke gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled local-response-cache Mengaktifkan filter. false
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy
spring.cloud.gateway.filter.local-response-cache.size Ukuran maksimum cache untuk mengeluarkan entri untuk rute ini di KB, MB, dan GB.
spring.cloud.gateway.filter.local-response-cache.time-to-live Waktu untuk kedaluwarsa entri cache, dinyatakan dalam s selama detik, m selama menit, dan h selama berjam-jam. 5m
spring.cloud.gateway.filter.map-request-header.enabled map-request-header Mengaktifkan filter. true
spring.cloud.gateway.filter.modify-request-body.enabled modify-request-body Mengaktifkan filter. true
spring.cloud.gateway.filter.modify-response-body.enabled modify-response-body Mengaktifkan filter. true
spring.cloud.gateway.filter.prefix-path.enabled prefix-path Mengaktifkan filter. true
spring.cloud.gateway.filter.preserve-host-header.enabled preserve-host-header Mengaktifkan filter. true
spring.cloud.gateway.filter.redirect-to.enabled redirect-to Mengaktifkan filter. 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 Mengaktifkan filter. true
spring.cloud.gateway.filter.remove-request-parameter.enabled remove-request-parameter Mengaktifkan filter. true
spring.cloud.gateway.filter.remove-response-header.enabled remove-response-header Mengaktifkan filter. true
spring.cloud.gateway.filter.request-header-size.enabled request-header-size Mengaktifkan filter. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled request-header-to-request-uri Mengaktifkan filter. 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 Mengaktifkan filter. true
spring.cloud.gateway.filter.request-size.enabled request-size Mengaktifkan filter. true
spring.cloud.gateway.filter.retry.enabled retry Mengaktifkan filter. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled rewrite-location-response-header Mengaktifkan filter. true
spring.cloud.gateway.filter.rewrite-location.enabled rewrite-location Mengaktifkan filter. true
spring.cloud.gateway.filter.rewrite-path.enabled rewrite-path Mengaktifkan filter. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled rewrite-request-parameter Mengaktifkan filter. true
spring.cloud.gateway.filter.rewrite-response-header.enabled rewrite-response-header Mengaktifkan filter. true
spring.cloud.gateway.filter.save-session.enabled save-session Mengaktifkan filter. 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 Mengaktifkan filter. 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 Mengaktifkan filter. true
spring.cloud.gateway.filter.set-request-header.enabled set-request-header Mengaktifkan filter. true
spring.cloud.gateway.filter.set-request-host-header.enabled set-request-host-header Mengaktifkan filter. true
spring.cloud.gateway.filter.set-response-header.enabled set-response-header Mengaktifkan filter. true
spring.cloud.gateway.filter.set-status.enabled set-status Mengaktifkan filter. true
spring.cloud.gateway.filter.strip-prefix.enabled strip-prefix Mengaktifkan filter. true
spring.cloud.gateway.forwarded.enabled ForwardedHeadersFilterMengaktifkan . true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled adapt-cached-body Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.forward-path.enabled forward-path Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.forward-routing.enabled forward-routing Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled load-balancer-client Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.local-response-cache.enabled local-response-cache Mengaktifkan filter untuk semua rute, yang memungkinkan Anda menambahkan konfigurasi tertentu di tingkat rute menggunakan LocalResponseCache filter. true
spring.cloud.gateway.global-filter.netty-routing.enabled netty-routing global Mengaktifkan filter. true
spring.cloud.gateway.global-filter.netty-write-response.enabled netty-write-response Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled reactive-load-balancer-client Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled remove-cached-body Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled route-to-request-url Mengaktifkan filter global. true
spring.cloud.gateway.global-filter.websocket-routing.enabled websocket-routing Mengaktifkan filter global. true
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping Jika konfigurasi CORS global harus ditambahkan ke handler URL. false
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header Nama header yang mengembalikan konfigurasi kapasitas ledakan. X-RateLimit-Burst-Capacity
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers Apakah menyertakan header yang berisi informasi pembatas tarif atau tidak. Nilai defaultnya adalah true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header Nama header yang mengembalikan jumlah permintaan yang tersisa selama detik saat ini. X-RateLimit-Remaining
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header Nama header yang mengembalikan konfigurasi laju pengisian ulang. X-RateLimit-Replenish-Rate
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header Nama header yang mengembalikan konfigurasi token yang diminta. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Membatasi metode dan akses properti di SpEL. true
spring.cloud.gateway.predicate.after.enabled after Mengaktifkan predikat. true
spring.cloud.gateway.predicate.before.enabled before Mengaktifkan predikat. true
spring.cloud.gateway.predicate.between.enabled between Mengaktifkan predikat. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled cloud-foundry-route-service Mengaktifkan predikat. true
spring.cloud.gateway.predicate.cookie.enabled cookie Mengaktifkan predikat. true
spring.cloud.gateway.predicate.header.enabled header Mengaktifkan predikat. true
spring.cloud.gateway.predicate.host.enabled host Mengaktifkan predikat. true
spring.cloud.gateway.predicate.host.include-port Sertakan port dalam pencocokan nama host. true
spring.cloud.gateway.predicate.method.enabled method Mengaktifkan predikat. true
spring.cloud.gateway.predicate.path.enabled path Mengaktifkan predikat. true
spring.cloud.gateway.predicate.query.enabled query Mengaktifkan predikat. true
spring.cloud.gateway.predicate.read-body.enabled read-body Mengaktifkan predikat. true
spring.cloud.gateway.predicate.remote-addr.enabled remote-addr Mengaktifkan predikat. true
spring.cloud.gateway.predicate.weight.enabled weight Mengaktifkan predikat. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled xforwarded-remote-addr Mengaktifkan predikat. true
spring.cloud.gateway.set-status.original-status-header-name Nama header yang berisi kode HTTP permintaan yang diproksi.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled XForwardedHeadersFilter Jika diaktifkan. true
spring.cloud.gateway.x-forwarded.for-append Jika penambung X-Forwarded-For sebagai daftar diaktifkan. true
spring.cloud.gateway.x-forwarded.for-enabled Jika X-Forwarded-For diaktifkan. true
spring.cloud.gateway.x-forwarded.host-append Jika penambung X-Forwarded-Host sebagai daftar diaktifkan. true
spring.cloud.gateway.x-forwarded.host-enabled Jika X-Forwarded-Host diaktifkan. true
spring.cloud.gateway.x-forwarded.order Urutan XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Jika penambung X-Forwarded-Port sebagai daftar diaktifkan. true
spring.cloud.gateway.x-forwarded.port-enabled Jika X-Forwarded-Port diaktifkan. true
spring.cloud.gateway.x-forwarded.prefix-append Jika penambung X-Forwarded-Prefix sebagai daftar diaktifkan. true
spring.cloud.gateway.x-forwarded.prefix-enabled Jika X-Forwarded-Prefix diaktifkan. true
spring.cloud.gateway.x-forwarded.proto-append Jika penambung X-Forwarded-Proto sebagai daftar diaktifkan. true
spring.cloud.gateway.x-forwarded.proto-enabled Jika X-Forwarded-Proto diaktifkan. true
spring.cloud.gateway.httpclient.compression Mengaktifkan kompresi untuk Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout Batas waktu yang terhubung dalam milis. Nilai defaultnya adalah 30s.
spring.cloud.gateway.httpclient.max-header-size Ukuran header respons maks.
spring.cloud.gateway.httpclient.max-initial-line-length Panjang garis awal maksimum.
spring.cloud.gateway.httpclient.pool.acquire-timeout Hanya untuk jenis FIXED, waktu maksimum dalam milis untuk menunggu untuk memperoleh.
spring.cloud.gateway.httpclient.pool.eviction-interval Lakukan pemeriksaan pengeluaran reguler di latar belakang pada interval tertentu. Dinonaktifkan secara default ({@link Duration#ZERO}). 0
spring.cloud.gateway.httpclient.pool.max-connections Hanya untuk jenis FIXED, jumlah maksimum koneksi sebelum memulai akuisisi tertunda pada yang sudah ada.
spring.cloud.gateway.httpclient.pool.max-idle-time Waktu dalam milis setelah saluran ditutup. Jika NULL, tidak ada waktu diam maksimum.
spring.cloud.gateway.httpclient.pool.max-life-time Durasi setelah saluran ditutup. Jika NULL, tidak ada waktu hidup maksimum.
spring.cloud.gateway.httpclient.pool.metrics Memungkinkan metrik kumpulan saluran dikumpulkan dan didaftarkan di Micrometer. Dinonaktifkan secara default. false
spring.cloud.gateway.httpclient.pool.name Nama peta kumpulan saluran, default ke proksi. proxy
spring.cloud.gateway.httpclient.pool.type Jenis kumpulan untuk HttpClient digunakan, default ke ELASTIC.
spring.cloud.gateway.httpclient.response-timeout Waktu respons habis.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Batas waktu flush SSL close_notify . Nilai 3000 msdefault . 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Batas waktu baca SSL close_notify . Nilai defaultnya adalah 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Batas waktu jabat tangan SSL. Nilai defaultnya adalah 10000 ms. 10000ms
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager Menginstal netty InsecureTrustManagerFactory. Ini tidak aman dan tidak cocok untuk produksi. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Panjang payload bingkai maks.
spring.cloud.gateway.httpclient.websocket.proxy-ping Bingkai ping proksi ke layanan hilir. Nilai defaultnya adalah true. true
spring.cloud.gateway.httpclient.wiretap Mengaktifkan penelusuran kesalahan wiretap untuk Netty HttpClient. false
spring.cloud.gateway.httpserver.wiretap Mengaktifkan penelusuran kesalahan wiretap untuk Netty HttpServer. false
spring.cloud.gateway.metrics.enabled Mengaktifkan pengumpulan data metrik. false
spring.cloud.gateway.metrics.prefix Awalan semua metrik yang dipancarkan oleh gateway. spring.cloud.gateway
spring.cloud.gateway.metrics.tags Peta tag yang ditambahkan ke metrik.
spring.cloud.gateway.observability.enabled Jika dukungan Pengamatan Micrometer harus diaktifkan. true

Konfigurasi umum

Daftar berikut ini menjelaskan konfigurasi umum:

  • Konfigurasi terkait pengelogan:
    • logging.level.*
    • logging.group.*
    • Konfigurasi lain di bawah logging.* namespace harus dilarang. Misalnya, menulis file log dengan menggunakan logging.file harus dilarang.