مشاركة عبر


الاتصال بخادم تكوين مدار ل Spring في Azure Container Apps

يوفر خادم التكوين ل Spring موقعا مركزيا لتوفير بيانات التكوين لتطبيقات متعددة. في هذه المقالة، ستتعلم كيفية توصيل تطبيق مستضاف في Azure Container Apps بخادم تكوين Java لمثيل Spring.

يستخدم مكون Config Server for Spring Java مستودع GitHub كمصدر لإعدادات التكوين. يتم توفير قيم التكوين لتطبيق الحاوية الخاص بك عبر ربط بين المكون تطبيق الحاوية. مع تغير القيم في خادم التكوين، فإنها تتدفق تلقائيا إلى التطبيق الخاص بك، كل ذلك دون مطالبتك بإعادة التحويل البرمجي أو إعادة توزيع التطبيق الخاص بك.

ستتعرف في هذا البرنامج التعليمي على:

  • إنشاء خادم تكوين لمكون Spring Java
  • ربط خادم التكوين ل Spring بتطبيق الحاوية
  • مراقبة قيم التكوين قبل وبعد توصيل خادم التكوين بتطبيقك
  • تشفير قيم التكوين وفك تشفيرها باستخدام مفتاح متماثل

هام

يستخدم هذا البرنامج التعليمي الخدمات التي يمكن أن تؤثر على فاتورة Azure. إذا قررت المتابعة خطوة بخطوة، فتأكد من حذف الموارد المميزة في هذه المقالة لتجنب الفوترة غير المتوقعة.

المتطلبات الأساسية

الاعتبارات

عند التشغيل في Config Server for Spring في Azure Container Apps، كن على دراية بالتفاصيل التالية:

العنصر الشرح
النطاق يعمل خادم التكوين ل Spring في نفس بيئة تطبيق الحاوية المتصلة.
تغيير الحجم للحفاظ على مصدر واحد للحقيقة، لا يتوسع خادم التكوين ل Spring. يتم تعيين خصائص minReplicas التحجيم و maxReplicas على 1.
الموارد تم إصلاح تخصيص موارد الحاوية لخادم التكوين ل Spring، وعدد الذاكرات الأساسية لوحدة المعالجة المركزية هو 0.5، وحجم الذاكرة هو 1Gi.
التسعير يقع خادم التكوين لفواتير Spring ضمن التسعير المستند إلى الاستهلاك. تتم فوترة الموارد التي تستهلكها مكونات Java المدارة بأسعار نشطة/خبيثة. يمكنك حذف المكونات التي لم تعد قيد الاستخدام لإيقاف الفوترة.
الربط يتصل تطبيق الحاوية بخادم التكوين ل Spring عبر ربط. يقوم الربط بإدخال التكوينات في متغيرات بيئة تطبيق الحاوية. بعد إنشاء ربط، يمكن لتطبيق الحاوية قراءة قيم التكوين من متغيرات البيئة.

الإعداد

قبل البدء في العمل مع خادم التكوين ل Spring، تحتاج أولا إلى إنشاء الموارد المطلوبة.

نفذ الأوامر التالية لإنشاء مجموعة الموارد وبيئة Container Apps.

  1. إنشاء متغيرات لدعم تكوين التطبيق الخاص بك. يتم توفير هذه القيم لك لأغراض هذا الدرس.

    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"
    
    المتغير ‏‏الوصف
    LOCATION موقع منطقة Azure حيث تقوم بإنشاء تطبيق الحاوية ومكون Java.
    ENVIRONMENT اسم بيئة Azure Container Apps لتطبيق العرض التوضيحي الخاص بك.
    RESOURCE_GROUP اسم مجموعة موارد Azure لتطبيق العرض التوضيحي الخاص بك.
    JAVA_COMPONENT_NAME اسم مكون Java الذي تم إنشاؤه لتطبيق الحاوية. في هذه الحالة، يمكنك إنشاء خادم تكوين لمكون Spring Java.
    IMAGE صورة الحاوية المستخدمة في تطبيق الحاوية.
    URI يمكنك استبدال URI بعنوان URL الخاص بمستودع Git، إذا كان خاصا، أضف تكوينات المصادقة ذات الصلة مثل spring.cloud.config.server.git.username و spring.cloud.config.server.git.password.
  2. سجل الدخول إلى Azure باستخدام Azure CLI.

    az login
    
  3. قم بإنشاء مجموعة موارد.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. إنشاء بيئة تطبيقات الحاوية.

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

يتم استخدام هذه البيئة لاستضافة كل من مكون Config Server for Spring java وحاوية التطبيق الخاص بك.

إنشاء مكون خادم التكوين ل Spring Java

الآن بعد أن أصبح لديك بيئة Container Apps، يمكنك إنشاء تطبيق الحاوية الخاص بك وربطه بخادم التكوين لمكون Spring java. عند ربط تطبيق الحاوية، تتم مزامنة قيم التكوين تلقائيا من مكون Config Server إلى التطبيق الخاص بك.

  1. إنشاء مكون 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. تحديث مكون Config Server ل 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
    

    هنا، أنت تخبر المكون بمكان العثور على المستودع الذي يحتوي على معلومات التكوين الخاصة بك عبر الخاصية uri . refresh-rate تخبر الخاصية Container Apps بمدى تكرار التحقق من وجود تغييرات في مستودع Git الخاص بك.

ربط تطبيق الحاوية الخاص بك بخادم التكوين لمكون Spring Java

  1. إنشاء تطبيق الحاوية الذي يستهلك بيانات التكوين.

    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
    

    يقوم هذا الأمر بإرجاع عنوان URL لتطبيق الحاوية الذي يستهلك بيانات التكوين. انسخ عنوان URL إلى محرر نص حتى تتمكن من استخدامه في خطوة قادمة.

    إذا قمت بزيارة تطبيقك في مستعرض، فإن القيمة التي connectTimeout تم إرجاعها هي القيمة الافتراضية ل 0.

  2. اربط بخادم التكوين ل Spring.

    الآن بعد إنشاء تطبيق الحاوية وخادم التكوين، يمكنك ربطهما مع update الأمر إلى تطبيق الحاوية الخاص بك.

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

    --bind $JAVA_COMPONENT_NAME تنشئ المعلمة الارتباط بين تطبيق الحاوية ومكون التكوين.

بعد ربط تطبيق الحاوية ومكون Config Server معا، تتم مزامنة تغييرات التكوين تلقائيا مع تطبيق الحاوية.

عند زيارة عنوان URL للتطبيق مرة أخرى، تكون قيمة connectTimeout الآن 10000. تأتي هذه القيمة من مجموعة مستودع Git في المتغير الذي $URI تم تعيينه في الأصل كمصدر لمكون التكوين. على وجه التحديد، يتم سحب هذه القيمة من الخاصية connectionTimeout في ملف application.yml المستودع.

يقوم طلب الربط بإدخال إعداد التكوين في التطبيق كمتغيرات بيئة. تتوفر هذه القيم الآن للتعليمات البرمجية للتطبيق لاستخدامها عند إحضار إعدادات التكوين من خادم التكوين.

في هذه الحالة، تتوفر متغيرات البيئة التالية للتطبيق:

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

إذا كنت ترغب في تخصيص الخاص SPRING_CONFIG_IMPORTبك ، يمكنك الرجوع إلى متغير SPRING_CLOUD_CONFIG_COMPONENT_URI البيئة - على سبيل المثال، يمكنك تجاوز بواسطة وسيطات سطر الأوامر، مثل Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

يمكنك أيضا إزالة ربط من التطبيق الخاص بك.

(اختياري) إلغاء ربط تطبيق الحاوية من مكون Config Server for Spring Java

لإزالة ربط من تطبيق حاوية، استخدم --unbind الخيار .

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

عند زيارة عنوان URL للتطبيق مرة أخرى، يتم إرجاع قيمة connectTimeout التغييرات إلى 0.

تنظيف الموارد

الموارد التي تم إنشاؤها في هذا البرنامج التعليمي لها تأثير على فاتورة Azure. إذا كنت لن تستخدم هذه الخدمات على المدى الطويل، فقم بتشغيل الأمر التالي لإزالة كل شيء تم إنشاؤه في هذا البرنامج التعليمي.

az group delete --resource-group $RESOURCE_GROUP

خيارات الإعداد

az containerapp update يستخدم الأمر المعلمة --configuration للتحكم في كيفية تكوين خادم التكوين ل Spring. يمكنك استخدام معلمات متعددة في وقت واحد طالما أنها مفصولة بمسافة. لمزيد من المعلومات، راجع خادم تكوين Spring Cloud.

يصف الجدول التالي قيم تكوين الواجهة الخلفية ل Git المختلفة المتوفرة:

Name ‏‏الوصف
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI للمستودع البعيد.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
اسم المستخدم للمصادقة مع المستودع البعيد.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
كلمة المرور للمصادقة مع المستودع البعيد.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
مسارات البحث لاستخدامها ضمن نسخة العمل المحلية. بشكل افتراضي، يبحث في الجذر فقط.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
ضع علامة للإشارة إلى أن المستودع يجب أن يفرض السحب. إذا true، تجاهل أي تغييرات محلية وأخذها من المستودع البعيد.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
التسمية الافتراضية المستخدمة ل Git رئيسية. إذا لم تقم بتعيين spring.cloud.config.server.git.default-label وفرع يسمى main غير موجود، يحاول خادم التكوين بشكل افتراضي أيضا سحب فرع يسمى الفرع الرئيسي. إذا كنت ترغب في تعطيل سلوك الفرع الاحتياطي، يمكنك تعيين spring.cloud.config.server.git.tryMasterBranch إلى false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
يحاول خادم التكوين بشكل افتراضي سحب فرع يسمى master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
يمكنك تعطيل التحقق من صحة خادم التكوين لشهادة TLS/SSL لخادم Git عن طريق تعيين الخاصية git.skipSslValidation إلى true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
ضع علامة للإشارة إلى أنه يجب استنساخ المستودع عند بدء التشغيل، وليس عند الطلب. بشكل عام يؤدي إلى بدء تشغيل أبطأ ولكن استعلام أول أسرع.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
المهلة بالثوان للحصول على اتصال HTTP أو SSH، إذا كان ذلك ممكنا. قيمة الافتراضية هي 5 ثوانٍ.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
عدد المرات التي يجلب فيها خادم التكوين بيانات التكوين المحدثة من خلفية Git.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
مفتاح SSH خاص صالح. يجب تعيين إذا كان ignore-local-ssh-settings هو true وكان Git URI بتنسيق SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
مفتاح مضيف SSH صالح. يجب تعيين إذا تم host-key-algorithm تعيين أيضا.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
واحد من ssh-dssأو ssh-rsassh-ed25519أو ecdsa-sha2-nistp256أو ecdsa-sha2-nistp384أو أو ecdsa-sha2-nistp521. يجب تعيين إذا تم host-key تعيين أيضا.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true أو false. إذا false، تجاهل الأخطاء باستخدام مفتاح المضيف.
spring.cloud.config.server.git.repos.{repoName} URI للمستودع البعيد.
spring.cloud.config.server.git.repos.{repoName}.pattern تنسيق النمط هو قائمة {application}/{profile} أسماء مفصولة بفواصل مع أحرف بدل. إذا {application}/{profile} لم يتطابق مع أي من الأنماط، فإنه يستخدم URI الافتراضي المحدد ضمن.

تصف القائمة التالية التكوينات الشائعة:

  • تسجيل التكوينات ذات الصلة:

    • logging.level.*
    • logging.group.*
    • يجب منع أي تكوينات أخرى تحت logging.* مساحة الاسم - على سبيل المثال، يجب حظر كتابة ملفات السجل باستخدام logging.file .
  • spring.cloud.config.server.overrides

    • خريطة إضافية لمصدر خاصية ليتم إرسالها إلى جميع العملاء دون شروط.
  • spring.cloud.config.override-none

    • يمكنك تغيير أولوية جميع التجاوزات في العميل لتكون أكثر مثل القيم الافتراضية، ما يسمح للتطبيقات بتوفير قيمها الخاصة في متغيرات البيئة أو خصائص النظام، عن طريق تعيين العلامة spring.cloud.config.override-none=true - الافتراضي خطأ - في المستودع البعيد.
  • spring.cloud.config.allow-override

    • إذا قمت بتمكين تمهيد التكوين الأول، يمكنك السماح لتطبيقات العميل بتجاوز التكوين من خادم التكوين عن طريق وضع خاصيتين داخل تكوين التطبيقات القادمة من خادم التكوين.
  • spring.cloud.config.server.health.*

    • يمكنك تكوين مؤشر الصحة للتحقق من المزيد من التطبيقات جنبا إلى جنب مع ملفات التعريف المخصصة والتسميات المخصصة.
  • spring.cloud.config.server.accept-empty

    • يمكنك التعيين spring.cloud.config.server.accept-empty إلى false بحيث يقوم الخادم بإرجاع حالة HTTP 404 إذا لم يتم العثور على التطبيق. بشكل افتراضي، يتم تعيين هذه العلامة إلى true.
  • التشفير وفك التشفير (متماثل):

    • encrypt.key
      • مناسب عند استخدام مفتاح متماثل لأنه قيمة خاصية واحدة لتكوينها.
    • spring.cloud.config.server.encrypt.enabled
      • قم بتعيين هذه الخاصية إلى false لتعطيل فك التشفير من جانب الخادم.

تحديث

تحتاج الخدمات التي تستهلك الخصائص إلى معرفة التغيير قبل حدوثه. تتضمن طريقة الإعلام الافتراضية لخادم التكوين ل Spring تشغيل حدث التحديث يدويا، مثل التحديث عن طريق استدعاء https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh، والذي قد لا يكون ممكنا إذا كان هناك العديد من مثيلات التطبيق.

بدلا من ذلك، يمكنك تحديث القيم تلقائيا من خادم التكوين عن طريق السماح لاستطلاع عميل التكوين للتغييرات استنادا إلى تحديث داخلي. استخدم الخطوات التالية لتحديث القيم تلقائيا من خادم التكوين:

  1. تسجيل مهمة مجدولة لتحديث السياق في فاصل زمني معين، كما هو موضح في المثال التالي:

    @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. تمكين autorefresh الفاصل الزمني للتحديث المناسب وتعيينه في ملف application.yml . في المثال التالي، يستقصي العميل تغيير التكوين كل 60 ثانية، وهو الحد الأدنى للقيمة التي يمكنك تعيينها لفاصل زمني للتحديث.

    بشكل افتراضي، autorefresh يتم تعيين إلى false ويتم refresh-interval تعيينه إلى 60 ثانية.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. أضف @RefreshScope في التعليمات البرمجية لديك. في المثال التالي، يتم تحديث المتغير connectTimeout تلقائيا كل 60 ثانية:

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

التشفير وفك التشفير باستخدام مفتاح متماثل

فك التشفير من جانب الخادم

بشكل افتراضي، يتم تمكين التشفير من جانب الخادم. استخدم الخطوات التالية لتمكين فك التشفير في التطبيق الخاص بك:

  1. أضف الخاصية المشفرة في ملف .properties في مستودع Git الخاص بك.

    يجب أن يشبه الملف المثال التالي:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. قم بتحديث مكون Config Server for Spring Java لاستخدام مستودع Git الذي يحتوي على الخاصية المشفرة وتعيين مفتاح التشفير.

    قبل تشغيل الأمر التالي، استبدل العناصر النائبة المحيطة <> بالقيم الخاصة بك.

    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
    

فك التشفير من جانب العميل

يمكنك استخدام فك تشفير العميل للخصائص باتباع الخطوات التالية:

  1. أضف الخاصية المشفرة في ملف .properties في مستودع Git الخاص بك.

  2. قم بتحديث مكون Config Server for Spring Java لاستخدام مستودع Git الذي يحتوي على الخاصية المشفرة وتعطيل فك التشفير من جانب الخادم.

    قبل تشغيل الأمر التالي، استبدل العناصر النائبة المحيطة <> بالقيم الخاصة بك.

    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. في تطبيق العميل، أضف مفتاح ENCRYPT_KEY=randomKey فك التشفير كمتغير بيئة.

    بدلا من ذلك، إذا قمت بتضمين spring-cloud-starter-bootstrap على classpath، أو تعيين spring.cloud.bootstrap.enabled=true كخاصية نظام، فقم بتعيين encrypt.key في bootstrap.properties.

    قبل تشغيل الأمر التالي، استبدل العناصر النائبة المحيطة <> بالقيم الخاصة بك.

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