الاتصال بخادم تكوين مدار ل Spring في Azure Container Apps
يوفر خادم التكوين ل Spring موقعا مركزيا لتوفير بيانات التكوين لتطبيقات متعددة. في هذه المقالة، ستتعلم كيفية توصيل تطبيق مستضاف في Azure Container Apps بخادم تكوين Java لمثيل Spring.
يستخدم مكون Config Server for Spring Java مستودع GitHub كمصدر لإعدادات التكوين. يتم توفير قيم التكوين لتطبيق الحاوية الخاص بك عبر ربط بين المكون تطبيق الحاوية. مع تغير القيم في خادم التكوين، فإنها تتدفق تلقائيا إلى التطبيق الخاص بك، كل ذلك دون مطالبتك بإعادة التحويل البرمجي أو إعادة توزيع التطبيق الخاص بك.
ستتعرف في هذا البرنامج التعليمي على:
- إنشاء خادم تكوين لمكون Spring Java
- ربط خادم التكوين ل Spring بتطبيق الحاوية
- مراقبة قيم التكوين قبل وبعد توصيل خادم التكوين بتطبيقك
- تشفير قيم التكوين وفك تشفيرها باستخدام مفتاح متماثل
هام
يستخدم هذا البرنامج التعليمي الخدمات التي يمكن أن تؤثر على فاتورة Azure. إذا قررت المتابعة خطوة بخطوة، فتأكد من حذف الموارد المميزة في هذه المقالة لتجنب الفوترة غير المتوقعة.
المتطلبات الأساسية
- حساب Azure مع اشتراك نشط. إذا لم يكن لديك حساب بالفعل، يمكنك إنشاء حساب مجانا.
- Azure CLI.
الاعتبارات
عند التشغيل في Config Server for Spring في Azure Container Apps، كن على دراية بالتفاصيل التالية:
العنصر | الشرح |
---|---|
النطاق | يعمل خادم التكوين ل Spring في نفس بيئة تطبيق الحاوية المتصلة. |
تغيير الحجم | للحفاظ على مصدر واحد للحقيقة، لا يتوسع خادم التكوين ل Spring. يتم تعيين خصائص minReplicas التحجيم و maxReplicas على 1 . |
الموارد | تم إصلاح تخصيص موارد الحاوية لخادم التكوين ل Spring، وعدد الذاكرات الأساسية لوحدة المعالجة المركزية هو 0.5، وحجم الذاكرة هو 1Gi. |
التسعير | يقع خادم التكوين لفواتير Spring ضمن التسعير المستند إلى الاستهلاك. تتم فوترة الموارد التي تستهلكها مكونات Java المدارة بأسعار نشطة/خبيثة. يمكنك حذف المكونات التي لم تعد قيد الاستخدام لإيقاف الفوترة. |
الربط | يتصل تطبيق الحاوية بخادم التكوين ل Spring عبر ربط. يقوم الربط بإدخال التكوينات في متغيرات بيئة تطبيق الحاوية. بعد إنشاء ربط، يمكن لتطبيق الحاوية قراءة قيم التكوين من متغيرات البيئة. |
الإعداد
قبل البدء في العمل مع خادم التكوين ل Spring، تحتاج أولا إلى إنشاء الموارد المطلوبة.
نفذ الأوامر التالية لإنشاء مجموعة الموارد وبيئة Container Apps.
إنشاء متغيرات لدعم تكوين التطبيق الخاص بك. يتم توفير هذه القيم لك لأغراض هذا الدرس.
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
.سجل الدخول إلى Azure باستخدام Azure CLI.
az login
قم بإنشاء مجموعة موارد.
az group create --name $RESOURCE_GROUP --location $LOCATION
إنشاء بيئة تطبيقات الحاوية.
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 إلى التطبيق الخاص بك.
إنشاء مكون 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
تحديث مكون 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
إنشاء تطبيق الحاوية الذي يستهلك بيانات التكوين.
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
.اربط بخادم التكوين ل 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-rsa ssh-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
بحيث يقوم الخادم بإرجاع حالة HTTP404
إذا لم يتم العثور على التطبيق. بشكل افتراضي، يتم تعيين هذه العلامة إلىtrue
.
- يمكنك التعيين
التشفير وفك التشفير (متماثل):
encrypt.key
- مناسب عند استخدام مفتاح متماثل لأنه قيمة خاصية واحدة لتكوينها.
spring.cloud.config.server.encrypt.enabled
- قم بتعيين هذه الخاصية إلى
false
لتعطيل فك التشفير من جانب الخادم.
- قم بتعيين هذه الخاصية إلى
تحديث
تحتاج الخدمات التي تستهلك الخصائص إلى معرفة التغيير قبل حدوثه. تتضمن طريقة الإعلام الافتراضية لخادم التكوين ل Spring تشغيل حدث التحديث يدويا، مثل التحديث عن طريق استدعاء https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh
، والذي قد لا يكون ممكنا إذا كان هناك العديد من مثيلات التطبيق.
بدلا من ذلك، يمكنك تحديث القيم تلقائيا من خادم التكوين عن طريق السماح لاستطلاع عميل التكوين للتغييرات استنادا إلى تحديث داخلي. استخدم الخطوات التالية لتحديث القيم تلقائيا من خادم التكوين:
تسجيل مهمة مجدولة لتحديث السياق في فاصل زمني معين، كما هو موضح في المثال التالي:
@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)); } } }
تمكين
autorefresh
الفاصل الزمني للتحديث المناسب وتعيينه في ملف application.yml . في المثال التالي، يستقصي العميل تغيير التكوين كل 60 ثانية، وهو الحد الأدنى للقيمة التي يمكنك تعيينها لفاصل زمني للتحديث.بشكل افتراضي،
autorefresh
يتم تعيين إلىfalse
ويتمrefresh-interval
تعيينه إلى 60 ثانية.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refresh
أضف
@RefreshScope
في التعليمات البرمجية لديك. في المثال التالي، يتم تحديث المتغيرconnectTimeout
تلقائيا كل 60 ثانية:@RestController @RefreshScope public class HelloController { @Value("${timeout:4000}") private String connectTimeout; }
التشفير وفك التشفير باستخدام مفتاح متماثل
فك التشفير من جانب الخادم
بشكل افتراضي، يتم تمكين التشفير من جانب الخادم. استخدم الخطوات التالية لتمكين فك التشفير في التطبيق الخاص بك:
أضف الخاصية المشفرة في ملف .properties في مستودع Git الخاص بك.
يجب أن يشبه الملف المثال التالي:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
قم بتحديث مكون 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
فك التشفير من جانب العميل
يمكنك استخدام فك تشفير العميل للخصائص باتباع الخطوات التالية:
أضف الخاصية المشفرة في ملف .properties في مستودع Git الخاص بك.
قم بتحديث مكون 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
في تطبيق العميل، أضف مفتاح
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