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:

  • Membuat 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 konten

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:

Item Penjelasan
Cakupan Server Konfigurasi untuk Spring berjalan di lingkungan yang sama dengan aplikasi kontainer yang terhubung.
Penskalaan Untuk mempertahankan satu sumber kebenaran, Server Konfigurasi untuk Spring tidak menskalakan. Properti minReplicas penskalakan dan maxReplicas keduanya diatur ke 1.
Sumber Alokasi sumber daya kontainer untuk Config Server for Spring diperbaiki, jumlah inti CPU adalah 0,5, dan ukuran memorinya adalah 1Gi.
Harga Config Server untuk penagihan 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.
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.

Siapkan

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.

Membuat komponen Config Server for 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 memberi refresh-rate tahu Aplikasi Kontainer seberapa sering 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 yang connectTimeout dikembalikan adalah nilai default .0

  2. Ikat 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 connectionTimeout properti 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 sendiri SPRING_CONFIG_IMPORT, Anda dapat merujuk ke variabel SPRING_CLOUD_CONFIG_COMPONENT_URI lingkungan - misalnya, Anda dapat mengambil alih berdasarkan 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 perubahan menjadi kembali ke 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
Bendera untuk menunjukkan bahwa repositori harus menarik paksa. 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 startup 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. Harus diatur jika host-key-algorithm juga 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 kunci 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 yang dipisahkan koma dengan kartubebas. 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 menjadi lebih seperti nilai default, memungkinkan aplikasi menyediakan nilainya sendiri dalam variabel lingkungan atau properti Sistem, dengan mengatur spring.cloud.config.override-none=true bendera - defaultnya adalah false - di repositori jarak jauh.
  • spring.cloud.config.allow-override

    • Jika Anda mengaktifkan bootstrap pertama konfigurasi, Anda dapat mengizinkan aplikasi klien untuk mengambil alih konfigurasi dari server konfigurasi dengan menempatkan dua properti dalam konfigurasi aplikasi yang berasal 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 konten karena merupakan nilai properti tunggal untuk dikonfigurasi.
    • spring.cloud.config.server.encrypt.enabled
      • Atur properti ini ke false untuk menonaktifkan dekripsi sisi server.

Refresh

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 polling klien konfigurasi untuk perubahan berdasarkan refresh internal. 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 konten

Dekripsi 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, ganti tempat penampung yang dikelilingi 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 menggunakan dekripsi sisi klien properti 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 tempat penampung yang dikelilingi 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, ganti tempat penampung yang dikelilingi dengan <> nilai Anda.

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