Bagikan melalui


Menyambungkan ke Server Konfigurasi terkelola untuk Spring di Azure Container Apps

Config Server for Spring menyediakan lokasi terpusat untuk membuat data konfigurasi tersedia untuk beberapa aplikasi. Dalam artikel ini, Anda belajar menyambungkan aplikasi yang dihosting di Azure Container Apps ke Java Config Server untuk instans Spring.

Komponen Config Server for Spring Java menggunakan repositori GitHub sebagai sumber untuk pengaturan konfigurasi. Nilai konfigurasi tersedia untuk aplikasi kontainer Anda melalui pengikatan antara komponen dan aplikasi kontainer Anda. Saat nilai berubah di server konfigurasi, nilai tersebut secara otomatis mengalir ke aplikasi Anda, semuanya tanpa mengharuskan Anda untuk mengkombinasi ulang atau menyebarkan ulang aplikasi Anda.

Dalam tutorial ini, Anda mempelajari caranya:

  • Buat Config Server untuk komponen Spring Java
  • Mengikat Server Konfigurasi untuk Spring ke aplikasi kontainer Anda
  • Amati nilai konfigurasi sebelum dan sesudah menyambungkan server konfigurasi ke aplikasi Anda
  • Mengenkripsi dan mendekripsi nilai konfigurasi dengan kunci simetris.

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 Config Server for Spring di Azure Container Apps, ketahui detail berikut:

Barang Penjelasan
Cakupan Server Konfigurasi untuk Spring berjalan di lingkungan yang sama dengan aplikasi kontainer yang terhubung.
Skalabilitas Untuk mempertahankan satu sumber kebenaran, Server Konfigurasi untuk Spring tidak dapat diskalakan. Properti penskalaan minReplicas dan maxReplicas diatur keduanya ke 1.
Sumber Alokasi sumber daya kontainer untuk Config Server for Spring diperbaiki, jumlah inti CPU adalah 0,5, dan ukuran memorinya adalah 1Gi.
Penetapan Harga Server Konfigurasi untuk penagihan Spring menggunakan 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.
Pengikatan Aplikasi kontainer terhubung ke Server Konfigurasi untuk Spring melalui pengikatan. Pengikatan menyuntikkan konfigurasi ke dalam variabel lingkungan aplikasi kontainer. Setelah pengikatan dibuat, aplikasi kontainer dapat membaca nilai konfigurasi dari variabel lingkungan.

Pengaturan

Sebelum Anda mulai bekerja dengan Config Server 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.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export JAVA_COMPONENT_NAME=configserver
    export APP_NAME=my-config-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-config-client:latest"
    export URI="https://github.com/Azure-Samples/azure-spring-cloud-config-java-aca.git"
    
    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 Config Server for Spring Java.
    IMAGE Gambar kontainer yang digunakan di aplikasi kontainer Anda.
    URI Anda dapat mengganti URI dengan URL repositori Git Anda, jika bersifat privat, tambahkan konfigurasi autentikasi terkait seperti spring.cloud.config.server.git.username dan spring.cloud.config.server.git.password.
  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 Config Server for Spring java dan aplikasi kontainer Anda.

Buat Server Konfigurasi untuk komponen Spring Java

Setelah memiliki lingkungan Container Apps, Anda dapat membuat aplikasi kontainer dan mengikatnya ke komponen java Config Server for Spring. Saat Anda mengikat aplikasi kontainer, nilai konfigurasi secara otomatis disinkronkan dari komponen Config Server ke aplikasi Anda.

  1. Buat komponen Config Server for Spring Java.

    az containerapp env java-component config-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 1 \
        --max-replicas 1 \
        --configuration spring.cloud.config.server.git.uri=$URI
    
  2. Perbarui komponen Config Server for Spring Java.

    az containerapp env java-component config-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 2 \
        --max-replicas 2 \
        --configuration spring.cloud.config.server.git.uri=$URI spring.cloud.config.server.git.refresh-rate=60
    

    Di sini, Anda memberi tahu komponen tempat menemukan repositori yang menyimpan informasi konfigurasi Anda melalui uri properti . Properti refresh-rate menginformasikan kepada Aplikasi Kontainer seberapa sering perlu memeriksa perubahan di repositori Git Anda.

Mengikat aplikasi kontainer Anda ke komponen Config Server for Spring Java

  1. Buat aplikasi kontainer yang menggunakan data konfigurasi.

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --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 dalam langkah mendatang.

    Jika Anda mengunjungi aplikasi di browser, nilai connectTimeout yang dikembalikan adalah nilai default0.

  2. Hubungkan ke Server Konfigurasi untuk Spring.

    Setelah aplikasi kontainer dan Config Server dibuat, Anda mengikatnya bersama dengan update perintah ke aplikasi kontainer Anda.

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $JAVA_COMPONENT_NAME
    

    Parameter --bind $JAVA_COMPONENT_NAME membuat tautan antara aplikasi kontainer Anda dan komponen konfigurasi.

Setelah aplikasi kontainer dan komponen Config Server terikat bersama, perubahan konfigurasi secara otomatis disinkronkan ke aplikasi kontainer.

Saat Anda mengunjungi URL aplikasi lagi, nilainya connectTimeout sekarang 10000. Nilai ini berasal dari repositori Git yang ditetapkan dalam variabel yang $URI awalnya ditetapkan sebagai sumber komponen konfigurasi. Secara khusus, nilai ini diambil dari properti connectionTimeout dalam file application.yml repositori.

Permintaan pengikatan menyuntikkan pengaturan konfigurasi ke dalam aplikasi sebagai variabel lingkungan. Nilai-nilai ini sekarang tersedia untuk kode aplikasi yang akan digunakan saat mengambil pengaturan konfigurasi dari server konfigurasi.

Dalam hal ini, variabel lingkungan berikut tersedia untuk aplikasi:

SPRING_CLOUD_CONFIG_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CLOUD_CONFIG_COMPONENT_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CONFIG_IMPORT=optional:configserver:$SPRING_CLOUD_CONFIG_URI

Jika Anda ingin menyesuaikan SPRING_CONFIG_IMPORT, Anda dapat merujuk ke variabel lingkungan SPRING_CLOUD_CONFIG_COMPONENT_URI - misalnya, Anda dapat menggantikan dengan argumen baris perintah, seperti Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

Anda juga dapat menghapus pengikatan dari aplikasi Anda.

(Opsional) Batalkan ikatan aplikasi kontainer Anda dari komponen Config Server for Spring Java

Untuk menghapus pengikatan dari aplikasi kontainer, gunakan --unbind opsi .

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

Saat Anda mengunjungi URL aplikasi lagi, nilai connectTimeout kembali berubah menjadi 0.

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

Opsi konfigurasi

Perintah az containerapp update menggunakan --configuration parameter untuk mengontrol bagaimana Config Server for Spring dikonfigurasi. Anda dapat menggunakan beberapa parameter sekaligus selama dipisahkan oleh spasi. Untuk informasi selengkapnya, lihat Spring Cloud Config Server.

Tabel berikut ini menjelaskan nilai konfigurasi backend Git yang berbeda yang tersedia:

Nama Deskripsi
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI repositori jarak jauh.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Nama pengguna untuk autentikasi dengan repositori jarak jauh.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Kata sandi untuk autentikasi dengan repositori jarak jauh.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Cari jalur untuk digunakan dalam salinan kerja lokal. Secara default, hanya mencari akar.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Indikator untuk menunjukkan bahwa repositori harus melakukan force pull. Jika true, buang perubahan lokal apa pun dan ambil dari repositori jarak jauh.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Label default yang digunakan untuk Git adalah utama. Jika Anda tidak mengatur spring.cloud.config.server.git.default-label dan cabang bernama utama tidak ada, server konfigurasi secara default juga mencoba memeriksa cabang bernama master. Jika Anda ingin menonaktifkan perilaku cabang fallback, Anda dapat mengatur spring.cloud.config.server.git.tryMasterBranch ke false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Server konfigurasi secara default mencoba memeriksa cabang bernama master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Anda dapat menonaktifkan validasi server konfigurasi dari sertifikat TLS/SSL server Git dengan mengatur git.skipSslValidation properti ke true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Bendera untuk menunjukkan bahwa repositori harus dikloning saat startup, bukan sesuai permintaan. Umumnya mengarah ke waktu startup sistem yang lebih lambat tetapi kueri pertama yang lebih cepat.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Batas waktu dalam detik untuk mendapatkan koneksi HTTP atau SSH, jika berlaku. Nilai default-nya adalah 5 detik.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Seberapa sering server konfigurasi mengambil data konfigurasi yang diperbarui dari backend Git Anda.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Kunci privat SSH yang valid. Harus diatur jika ignore-local-ssh-settings adalah true dan URI Git dalam format SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Kunci host SSH yang valid. Diperlukan pengaturan jika host-key-algorithm juga telah diatur.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Salah satu dari ssh-dss, , ssh-rsassh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, atau ecdsa-sha2-nistp521. Harus diatur jika host-key juga diatur.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true atau false. Jika false, abaikan kesalahan dengan tombol host.
spring.cloud.config.server.git.repos.{repoName} URI repositori jarak jauh.
spring.cloud.config.server.git.repos.{repoName}.pattern Format pola adalah daftar {application}/{profile} nama-nama yang dipisahkan koma dengan karakter pengganti. Jika {application}/{profile} tidak cocok dengan salah satu pola, pola tersebut menggunakan URI default yang ditentukan di bawah.

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.
  • spring.cloud.config.server.overrides

    • Peta tambahan untuk sumber properti yang akan dikirim ke semua klien secara tanpa syarat.
  • spring.cloud.config.override-none

    • Anda dapat mengubah prioritas semua penimpaan di klien agar lebih mirip nilai default, memungkinkan aplikasi menyediakan nilainya sendiri dalam variabel lingkungan atau properti Sistem, dengan mengatur flag spring.cloud.config.override-none=true (defaultnya adalah false) di repositori jarak jauh.
  • spring.cloud.config.allow-override

    • Jika Anda mengaktifkan bootstrap konfigurasi pertama, Anda dapat memungkinkan aplikasi klien untuk menggantikan konfigurasi dari server konfigurasi. Penimpaan dilakukan dengan menempatkan dua properti ke dalam konfigurasi aplikasi yang diambil dari server konfigurasi.
  • spring.cloud.config.server.health.*

    • Anda dapat mengonfigurasi Indikator Kesehatan untuk memeriksa lebih banyak aplikasi bersama dengan profil kustom dan label kustom.
  • spring.cloud.config.server.accept-empty

    • Anda dapat mengatur spring.cloud.config.server.accept-empty ke false sehingga server mengembalikan status HTTP 404 jika aplikasi tidak ditemukan. Secara default, bendera ini diatur ke true.
  • Enkripsi dan dekripsi (simetris):

    • encrypt.key
      • Nyaman saat Anda menggunakan kunci simetris karena merupakan nilai properti tunggal untuk dikonfigurasi.
    • spring.cloud.config.server.encrypt.enabled
      • Atur properti ini ke false untuk menonaktifkan dekripsi sisi server.

Muat Ulang

Layanan yang menggunakan properti perlu mengetahui tentang perubahan sebelum terjadi. Metode pemberitahuan default untuk Config Server for Spring melibatkan pemicu peristiwa refresh secara manual, seperti refresh dengan panggilan https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, yang mungkin tidak layak jika ada banyak instans aplikasi.

Sebagai gantinya, Anda dapat secara otomatis menyegarkan nilai dari Config Server dengan membiarkan klien konfigurasi memeriksa perubahan berdasarkan interval penyegaran. Gunakan langkah-langkah berikut untuk menyegarkan nilai secara otomatis dari Config Server:

  1. Daftarkan tugas terjadwal untuk merefresh konteks dalam interval tertentu, seperti yang ditunjukkan dalam contoh berikut:

    @Configuration
    @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class})
    @EnableScheduling
    public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer {
        @Value("${spring.cloud.config.refresh-interval:60}")
        private long refreshInterval;
        @Value("${spring.cloud.config.auto-refresh:false}")
        private boolean autoRefresh;
        private final RefreshEndpoint refreshEndpoint;
        public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) {
            this.refreshEndpoint = refreshEndpoint;
        }
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            if (autoRefresh) {
                // set minimal refresh interval to 5 seconds
                refreshInterval = Math.max(refreshInterval, 5);
                scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh,  Duration.ofSeconds(refreshInterval));
            }
        }
    }
    
  2. Aktifkan autorefresh dan atur interval refresh yang sesuai dalam file application.yml . Dalam contoh berikut, klien melakukan polling untuk perubahan konfigurasi setiap 60 detik, yang merupakan nilai minimum yang dapat Anda atur untuk interval refresh.

    Secara default, autorefresh diatur ke false dan refresh-interval diatur ke 60 detik.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Tambahkan @RefreshScope dalam kode Anda. Dalam contoh berikut, variabel connectTimeout secara otomatis di-refresh setiap 60 detik:

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

Enkripsi dan dekripsi dengan kunci simetris

Dekripsi pada sisi server

Secara default, enkripsi sisi server diaktifkan. Gunakan langkah-langkah berikut untuk mengaktifkan dekripsi di aplikasi Anda:

  1. Tambahkan properti terenkripsi di file .properties Anda di repositori Git Anda.

    File Anda harus menyerupai contoh berikut:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Perbarui komponen Config Server for Spring Java untuk menggunakan repositori Git yang memiliki properti terenkripsi dan atur kunci enkripsi.

    Sebelum Anda menjalankan perintah berikut, gantikan tempat penampung yang dikelilingi oleh <> dengan nilai Anda.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
    

Dekripsi sisi klien

Anda dapat mendekripsi properti di sisi klien dengan mengikuti langkah-langkah berikut:

  1. Tambahkan properti terenkripsi di file .properties Anda di repositori Git Anda.

  2. Perbarui komponen Config Server for Spring Java untuk menggunakan repositori Git yang memiliki properti terenkripsi dan menonaktifkan dekripsi sisi server.

    Sebelum Anda menjalankan perintah berikut, ganti placeholder yang dibatasi oleh <> dengan nilai Anda.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=false
    
  3. Di aplikasi klien Anda, tambahkan kunci ENCRYPT_KEY=randomKey dekripsi sebagai variabel lingkungan.

    Atau, jika Anda menyertakan spring-cloud-starter-bootstrap pada classpath, atau ditetapkan spring.cloud.bootstrap.enabled=true sebagai properti sistem, atur encrypt.key dalam bootstrap.properties.

    Sebelum Anda menjalankan perintah berikut, gantikan tempat penampung yang dikelilingi oleh <> dengan nilai Anda.

    az containerapp update \
        --name <APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey