Aracılığıyla paylaş


Azure Container Apps'te Spring için yönetilen bir Yapılandırma Sunucusuna bağlanma

Spring için Yapılandırma Sunucusu, yapılandırma verilerini birden çok uygulamanın kullanımına sunmak için merkezi bir konum sağlar. Bu makalede, Azure Container Apps'te barındırılan bir uygulamayı Spring örneği için Java Config Server'a bağlamayı öğreneceksiniz.

Spring Java için Yapılandırma Sunucusu bileşeni, yapılandırma ayarları için kaynak olarak bir GitHub deposu kullanır. Yapılandırma değerleri, bileşen ile kapsayıcı uygulamanız arasında bir bağlama aracılığıyla kapsayıcı uygulamanız için kullanılabilir hale getirilir. Yapılandırma sunucusunda değerler değiştikçe, bunlar uygulamanızı yeniden derlemenize veya yeniden dağıtmanıza gerek kalmadan uygulamanıza otomatik olarak akar.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Spring Java bileşeni için yapılandırma sunucusu oluşturma
  • Spring için Yapılandırma Sunucusu'nu kapsayıcı uygulamanıza bağlama
  • Yapılandırma sunucusunu uygulamanıza bağlamadan önce ve sonra yapılandırma değerlerini gözlemleyin
  • Yapılandırma değerlerini simetrik anahtarla şifreleme ve şifresini çözme

Önemli

Bu öğreticide Azure faturanızı etkileyebilecek hizmetler kullanılır. Adım adım izlemeye karar verirseniz, beklenmeyen faturalamayı önlemek için bu makalede öne çıkan kaynakları sildiğinizden emin olun.

Önkoşullar

  • Etkin aboneliği olan bir Azure hesabı. Henüz bir hesabınız yoksa ücretsiz olarak oluşturabilirsiniz.
  • Azure CLI.

Dikkat edilmesi gereken noktalar

Azure Container Apps'te Spring için Config Server'da çalışırken aşağıdaki ayrıntılara dikkat edin:

Kalem Açıklama
Scope Spring için Yapılandırma Sunucusu, bağlı kapsayıcı uygulamasıyla aynı ortamda çalışır.
Ölçeklendirme Tek bir gerçek kaynağını korumak için Spring için Yapılandırma Sunucusu ölçeklendirilmiyor. Ölçeklendirme özellikleri minReplicas ve maxReplicas her ikisi de olarak 1ayarlanır.
Kaynaklar Spring için Yapılandırma Sunucusu için kapsayıcı kaynak ayırması sabittir, CPU çekirdeklerinin sayısı 0,5 ve bellek boyutu 1Gi'dir.
Fiyatlandırma Spring faturalaması için Yapılandırma Sunucusu tüketime dayalı fiyatlandırma kapsamındadır. Yönetilen Java bileşenleri tarafından tüketilen kaynaklar etkin/boşta kalma fiyatlarına göre faturalandırılır. Faturalamayı durdurmak için artık kullanımda olmayan bileşenleri silebilirsiniz.
Bağlama Kapsayıcı uygulaması, bağlama yoluyla Spring için bir Yapılandırma Sunucusuna bağlanır. Bağlama, yapılandırmaları kapsayıcı uygulaması ortam değişkenlerine ekler. Bağlama oluşturulduktan sonra kapsayıcı uygulaması ortam değişkenlerinden yapılandırma değerlerini okuyabilir.

Ayarlama

Spring için Yapılandırma Sunucusu ile çalışmaya başlamadan önce gerekli kaynakları oluşturmanız gerekir.

Kaynak grubunuzu ve Container Apps ortamınızı oluşturmak için aşağıdaki komutları yürütebilirsiniz.

  1. Uygulama yapılandırmanızı desteklemek için değişkenler oluşturun. Bu değerler, bu dersin amaçları doğrultusunda size sağlanır.

    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"
    
    Değişken Açıklama
    LOCATION Kapsayıcı uygulamanızı ve Java bileşenini oluşturduğunuz Azure bölgesi konumu.
    ENVIRONMENT Tanıtım uygulamanızın Azure Container Apps ortam adı.
    RESOURCE_GROUP Tanıtım uygulamanızın Azure kaynak grubu adı.
    JAVA_COMPONENT_NAME Kapsayıcı uygulamanız için oluşturulan Java bileşeninin adı. Bu durumda Spring Java bileşeni için bir Yapılandırma Sunucusu oluşturursunuz.
    IMAGE Kapsayıcı uygulamanızda kullanılan kapsayıcı görüntüsü.
    URI URI'yi Git depo URL'nizle değiştirebilirsiniz; özelse ve spring.cloud.config.server.git.passwordgibi spring.cloud.config.server.git.username ilgili kimlik doğrulama yapılandırmalarını ekleyebilirsiniz.
  2. Azure CLI ile Azure'da oturum açın.

    az login
    
  3. Kaynak grubu oluşturun.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Kapsayıcı uygulamaları ortamınızı oluşturun.

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

Bu ortam hem Spring java için Yapılandırma Sunucusu bileşenini hem de kapsayıcı uygulamanızı barındırmak için kullanılır.

Spring Java için Yapılandırma Sunucusu bileşenini oluşturma

Artık bir Container Apps ortamınız olduğuna göre, kapsayıcı uygulamanızı oluşturabilir ve spring java bileşeni için bir Yapılandırma Sunucusu'na bağlayabilirsiniz. Kapsayıcı uygulamanızı bağladığınızda yapılandırma değerleri Yapılandırma Sunucusu bileşeninden uygulamanıza otomatik olarak eşitlenir.

  1. Spring Java için Yapılandırma Sunucusu bileşenini oluşturun.

    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. Spring Java için Yapılandırma Sunucusu bileşenini güncelleştirin.

    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
    

    Burada bileşene, özelliği aracılığıyla uri yapılandırma bilgilerinizi barındıran depoyu nerede bulacağını anlatacaksınız. özelliği, refresh-rate Container Apps'e Git deponuzdaki değişiklikleri ne sıklıkta denetleyeceklerini bildirir.

Kapsayıcı uygulamanızı Spring Java için Yapılandırma Sunucusu bileşenine bağlama

  1. Yapılandırma verilerini kullanan kapsayıcı uygulamasını oluşturun.

    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
    

    Bu komut, yapılandırma verilerini kullanan kapsayıcı uygulamanızın URL'sini döndürür. Url'yi bir metin düzenleyicisine kopyalayarak gelecek adımda kullanabilirsiniz.

    Uygulamanızı tarayıcıda ziyaret ederseniz, connectTimeout döndürülen değer varsayılan değeridir 0.

  2. Spring için Yapılandırma Sunucusuna bağlanın.

    Artık kapsayıcı uygulaması ve Yapılandırma Sunucusu oluşturulduğuna göre, bunları kapsayıcı uygulamanıza komutuyla update bağlarsınız.

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

    parametresi, --bind $JAVA_COMPONENT_NAME kapsayıcı uygulamanızla yapılandırma bileşeni arasındaki bağlantıyı oluşturur.

Kapsayıcı uygulaması ve Yapılandırma Sunucusu bileşeni birbirine bağlandıktan sonra yapılandırma değişiklikleri otomatik olarak kapsayıcı uygulamasıyla eşitlenir.

Uygulamanın URL'sini yeniden ziyaret ettiğinizde değeri connectTimeout şimdi 10000olur. Bu değer, başlangıçta yapılandırma bileşeninin kaynağı olarak ayarlanan değişkende $URI ayarlanan Git deposundan gelir. Özel olarak, bu değer deponun connectionTimeoutapplication.yml dosyasındaki özelliğinden çekilir.

Bağlama isteği, uygulamaya ortam değişkenleri olarak yapılandırma ayarı ekler. Bu değerler artık yapılandırma sunucusundan yapılandırma ayarları getirilirken kullanılacak uygulama kodu tarafından kullanılabilir.

Bu durumda, aşağıdaki ortam değişkenleri uygulama tarafından kullanılabilir:

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

Kendi SPRING_CONFIG_IMPORTortamınızı özelleştirmek istiyorsanız ortam değişkenine SPRING_CLOUD_CONFIG_COMPONENT_URI başvurabilirsiniz. Örneğin, gibi Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=truekomut satırı bağımsız değişkenleriyle geçersiz kılabilirsiniz.

Bağlamayı uygulamanızdan da kaldırabilirsiniz.

(İsteğe bağlı) Spring Java için Yapılandırma Sunucusu bileşeninden kapsayıcı uygulamanızın bağlantısını kaldırın

Kapsayıcı uygulamasından bağlamayı kaldırmak için seçeneğini kullanın --unbind .

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

Uygulamanın URL'sini yeniden ziyaret ettiğinizde değeri connectTimeout olarak değişir 0.

Kaynakları temizleme

Bu öğreticide oluşturulan kaynakların Azure faturanız üzerinde etkisi vardır. Bu hizmetleri uzun süreli kullanmayacaksanız, bu öğreticide oluşturulan her şeyi kaldırmak için aşağıdaki komutu çalıştırın.

az group delete --resource-group $RESOURCE_GROUP

Yapılandırma seçenekleri

komutu, az containerapp update Spring için Yapılandırma Sunucusu'nu nasıl yapılandırıldığını denetlemek için parametresini kullanır --configuration . Bir boşlukla ayrıldığı sürece aynı anda birden çok parametre kullanabilirsiniz. Daha fazla bilgi için bkz . Spring Cloud Config Server.

Aşağıdaki tabloda, kullanılabilen farklı Git arka uç yapılandırma değerleri açıklanmaktadır:

Veri Akışı Adı Açıklama
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
Uzak deponun URI'sini seçin.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Uzak depo ile kimlik doğrulaması için kullanıcı adı.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Uzak depo ile kimlik doğrulaması parolası.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Yerel çalışma kopyası içinde kullanılacak arama yolları. Varsayılan olarak, yalnızca kökü arar.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Deponun çekmeyi zorlaması gerektiğini belirten bayrak. ise true, yerel değişiklikleri atıp uzak depodan alın.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Git için kullanılan varsayılan etiket ana etikettir. Ayarlamazsanız spring.cloud.config.server.git.default-label ve main adlı bir dal yoksa, yapılandırma sunucusu varsayılan olarak master adlı bir dalı da kullanıma almaya çalışır. Geri dönüş dalı davranışını devre dışı bırakmak isterseniz olarak ayarlayabilirsiniz spring.cloud.config.server.git.tryMasterBranchfalse.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Yapılandırma sunucusu varsayılan olarak master adlı bir dalı kullanıma almaya çalışır.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Özelliğini trueolarak ayarlayarak, yapılandırma sunucusunun Git sunucusunun TLS/SSL sertifikası doğrulamasını git.skipSslValidation devre dışı bırakabilirsiniz.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Deponun isteğe bağlı değil başlangıçta kopyalanması gerektiğini belirten bayrak. Genellikle daha yavaş başlatmaya ama ilk sorguyu daha hızlı çalıştırmaya yol açar.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Varsa HTTP veya SSH bağlantısı elde etmek için saniyeler içinde zaman aşımı. Varsayılan değer 5 saniyedir.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Yapılandırma sunucusunun Git arka ucunuzdan güncelleştirilmiş yapılandırma verilerini getirme sıklıkları.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Geçerli SSH özel anahtarı. Ise ve Git URI'sinin SSH biçiminde olması durumunda ignore-local-ssh-settingstrue ayarlanmalıdır.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Geçerli SSH ana bilgisayar anahtarı. Ayrıca ayarlandıysa host-key-algorithm ayarlanmalıdır.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
ssh-dss, , ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384veya ecdsa-sha2-nistp521. Ayrıca ayarlandıysa host-key ayarlanmalıdır.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true veya false. ise false, konak anahtarıyla ilgili hataları yoksayın.
spring.cloud.config.server.git.repos.{repoName} Uzak deponun URI'sini seçin.
spring.cloud.config.server.git.repos.{repoName}.pattern Desen biçimi, joker karakterler içeren virgülle ayrılmış bir ad listesidir {application}/{profile} . Desenlerden {application}/{profile} herhangi biriyle eşleşmezse altında tanımlanan varsayılan URI'yi kullanır.

Aşağıdaki listede yaygın yapılandırmalar açıklanmaktadır:

  • İlgili yapılandırmaları günlüğe kaydetme:

    • logging.level.*
    • logging.group.*
    • Ad alanı altındaki logging.* diğer tüm yapılandırmalar yasak olmalıdır; örneğin, kullanarak logging.file günlük dosyaları yazmak yasak olmalıdır.
  • spring.cloud.config.server.overrides

    • Koşulsuz olarak tüm istemcilere gönderilecek özellik kaynağı için ek eşleme.
  • spring.cloud.config.override-none

    • Uzak depodaki bayrağını (varsayılan değer false) ayarlayarak spring.cloud.config.override-none=true uygulamaların ortam değişkenlerinde veya Sistem özelliklerinde kendi değerlerini sağlamasına izin vererek istemcideki tüm geçersiz kılmaların önceliğini daha çok varsayılan değerlere benzer şekilde değiştirebilirsiniz.
  • spring.cloud.config.allow-override

    • Yapılandırmayı ilk bootstrap'ı etkinleştirirseniz, yapılandırma sunucusundan gelen uygulama yapılandırmasına iki özellik yerleştirerek istemci uygulamalarının yapılandırma sunucusundan yapılandırmayı geçersiz kılabilir.
  • spring.cloud.config.server.health.*

    • Özel profiller ve özel etiketlerle birlikte daha fazla uygulamayı denetlemek için Sistem Durumu Göstergesi'ni yapılandırabilirsiniz.
  • spring.cloud.config.server.accept-empty

    • Uygulama bulunamazsa sunucunun HTTP 404 durumu döndürmesi için olarak ayarlayabilirsiniz.spring.cloud.config.server.accept-emptyfalse Varsayılan olarak, bu bayrak olarak trueayarlanır.
  • Şifreleme ve şifre çözme (simetrik):

    • encrypt.key
      • Yapılandırılan tek bir özellik değeri olduğundan simetrik anahtar kullandığınızda kullanışlıdır.
    • spring.cloud.config.server.encrypt.enabled
      • Sunucu tarafı şifre çözmeyi devre dışı bırakmak için bu özelliği olarak false ayarlayın.

Yenile

Özellikleri kullanan hizmetlerin değişiklik gerçekleşmeden önce bunu bilmesi gerekir. Spring için Yapılandırma Sunucusu'nun varsayılan bildirim yöntemi, yenileme olayının el ile tetiklenmesini içerir; örneğin, çağrısıyla https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refreshyenileme, çok sayıda uygulama örneği varsa uygun olmayabilir.

Bunun yerine, yapılandırma istemcisinin bir yenileme iç öğesini temel alan değişiklikler için yoklamasına izin vererek yapılandırma sunucusundan değerleri otomatik olarak yenileyebilirsiniz. Yapılandırma Sunucusu'ndan değerleri otomatik olarak yenilemek için aşağıdaki adımları kullanın:

  1. Aşağıdaki örnekte gösterildiği gibi belirli bir aralıkta bağlamı yenilemek için zamanlanmış bir görevi kaydedin:

    @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. application.yml dosyasında uygun yenileme aralığını etkinleştirin autorefresh ve ayarlayın. Aşağıdaki örnekte istemci, yenileme aralığı için ayarlayabileceğiniz en düşük değer olan 60 saniyede bir yapılandırma değişikliğini yoklar.

    Varsayılan olarak, autorefresh olarak ayarlanır false ve refresh-interval 60 saniye olarak ayarlanır.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Kodunuzu ekleyin @RefreshScope . Aşağıdaki örnekte değişken connectTimeout her 60 saniyede bir otomatik olarak yenilenir:

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

Simetrik anahtarla şifreleme ve şifre çözme

Sunucu tarafı şifre çözme

Varsayılan olarak, sunucu tarafı şifreleme etkinleştirilir. Uygulamanızda şifre çözmeyi etkinleştirmek için aşağıdaki adımları kullanın:

  1. Şifrelenmiş özelliği Git deponuzdaki .properties dosyanıza ekleyin.

    Dosyanız aşağıdaki örneğe benzemelidir:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Spring Java için Yapılandırma Sunucusu bileşenini şifrelenmiş özelliğe sahip Git deposunu kullanacak şekilde güncelleştirin ve şifreleme anahtarını ayarlayın.

    Aşağıdaki komutu çalıştırmadan önce, ile çevrelenen <> yer tutucuları değerlerinizle değiştirin.

    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
    

İstemci tarafı şifre çözme

Aşağıdaki adımları izleyerek özelliklerin istemci tarafı şifre çözmesini kullanabilirsiniz:

  1. Şifrelenmiş özelliği Git deponuzdaki .properties dosyanıza ekleyin.

  2. Spring Java için Yapılandırma Sunucusu bileşenini şifrelenmiş özelliğe sahip Git deposunu kullanacak şekilde güncelleştirin ve sunucu tarafı şifre çözmeyi devre dışı bırakın.

    Aşağıdaki komutu çalıştırmadan önce, ile çevrelenen <> yer tutucuları değerlerinizle değiştirin.

    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. İstemci uygulamanızda, şifre çözme anahtarını ENCRYPT_KEY=randomKey ortam değişkeni olarak ekleyin.

    Alternatif olarak, öğesine eklerseniz spring-cloud-starter-bootstrapclasspathveya bir sistem özelliği olarak ayarlarsanızspring.cloud.bootstrap.enabled=true, içinde bootstrap.propertiesayarlayınencrypt.key.

    Aşağıdaki komutu çalıştırmadan önce, ile çevrelenen <> yer tutucuları değerlerinizle değiştirin.

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