الإعداد المركزي
الإعداد المركزي
في التطبيق الأحادي (Monolith) تدير ملف application.properties واحدًا. انشر عشر خدمات مصغّرة عبر ثلاث بيئات وستجد نفسك فجأة أمام ثلاثين ملف إعداد تحتاج إلى تناسق مستمر. غيّر عنوان URL مشتركًا لقاعدة البيانات وستضطر إلى تحديث كل خدمة وإعادة بناء كل منها ونشرها من جديد. تحل Spring Cloud Config هذه المشكلة بتقديم خادم إعداد مخصص يعمل مصدرًا وحيدًا للحقيقة لجميع الإعدادات، إذ يخدم الخصائص لكل خدمة مصغّرة عبر HTTP عند بدء التشغيل — وبشكل اختياري في وقت التشغيل دون إعادة تشغيل.
كيف تعمل Spring Cloud Config
يتكوّن المعمار من جزأين رئيسيين:
- Config Server — تطبيق Spring Boot مستقل يقرأ الإعداد من مخزن خلفي (عادةً مستودع Git) ويعرضه عبر واجهة REST.
- Config Client — أي خدمة مصغّرة تحتوي تبعية
spring-cloud-starter-config. يتصل بـ Config Server أثناء بدء التشغيل، ويُنزّل خصائصه، ثم يدمجها فيEnvironmentقبل إنشاء أي Bean.
إعداد Config Server
أنشئ مشروع Spring Boot جديدًا وأضف تبعية الخادم:
فعّل الخادم بتوضيع تعليق توضيحي واحد على الفئة الرئيسية:
اضبط مصدر قراءة الخصائص في ملف application.yml الخاص به:
يخدم الخادم الإعداد الآن عبر نمط URL التالي: /{application}/{profile}/{label}. مثلًا، يُعيد GET /order-service/production/main الخصائص المدمجة لتطبيق order-service في بروفايل production على الفرع main.
تنظيم مستودع الإعداد
يبدو هيكل مستودع Git النموذجي للإعداد كالتالي:
تدمج Spring Cloud Config هذه الملفات وفق أولوية واضحة (الأكثر تحديدًا يفوز):
- خاص بالخدمة + البروفايل (مثل
order-service/application-production.yml) - خاص بالخدمة الافتراضي (مثل
order-service/application.yml) - المشترك + البروفايل (مثل
application-production.yml) - المشترك الافتراضي (
application.yml)
application.yml في الجذر. أما عناوين URL الخاصة بالخدمة وبيانات الاعتماد فتنتمي إلى ملفات الخدمات الفردية. هذا يُبقي إعدادات كل خدمة صغيرة ومركّزة.
إعداد Config Client
في كل خدمة مصغّرة، أضف تبعية Config Client:
أضف إعداد Bootstrap الأدنى. في Spring Boot 3 / Spring Cloud 2022+ معالجة bootstrap معطّلة افتراضيًا؛ يمكن إعادة تفعيلها بتبعية spring-cloud-starter-bootstrap، أو — وهو النهج الحديث المفضّل — ضع إحداثيات Config Server مباشرةً في application.yml:
عند بدء تشغيل التطبيق، تعالج Spring Boot إدخال spring.config.import قبل إنشاء أي Bean، وتجلب الخصائص البعيدة، وتحقنها في سياق التطبيق تمامًا كأنها ملفات .yml محلية.
تأمين Config Server
يمكن أن يعرض Config Server كلمات مرور قواعد البيانات ومفاتيح API وأسرارًا أخرى. احمه بشكل صحيح:
- HTTP Basic / OAuth2: أضف
spring-boot-starter-securityإلى Config Server واضبط بيانات الاعتماد. يُمرّرها العملاء في خصائصspring.cloud.config.usernameوspring.cloud.config.password(مخزّنة في مدير أسرار محلي، ليس في المستودع). - التشفير المتماثل: يدعم Config Server تشفير القيم بمفتاح مشترك. خزّن القيمة المشفّرة في Git بصيغة
{cipher}AQA...— يفكّ الخادم تشفيرها قبل التقديم. عيّنENCRYPT_KEYكمتغير بيئي على مضيف الخادم، وليس في ملفات الإعداد أبدًا. - التشفير غير المتماثل: استخدم زوج مفاتيح RSA مخزّنًا في JKS keystore لأمان أعلى. يحتفظ الخادم بالمفتاح الخاص؛ يحتوي مستودع Git على النص المشفّر فقط.
طوبولوجيا الشبكة في مجموعة حقيقية
في الإنتاج يعمل Config Server نفسه كخدمة مسجّلة في Eureka (تناولناها في الدرس الثاني). يكتشفه العملاء بمعرّف الخدمة بدلًا من عنوان URL مُرمَّز:
يُزيل هذا آخر عنوان URL مُرمَّز من عملاءك. يصبح تسلسل بدء التشغيل: اتصل بـ Eureka ← اكتشف Config Server ← اجلب الإعداد ← أكمل بدء التشغيل. المقايضة هي أن Eureka يجب أن يكون متاحًا قبل أن تبدأ أي خدمة أخرى؛ لهذا السبب يُنشر Eureka عادةً بنسخ متعددة وعنوان ثابت ومعروف.
الخلاصة
تستبدل Spring Cloud Config فوضى ملفات application.yml لكل خدمة بخادم وحيد مدعوم بـ Git يخدم إعدادًا ذا إصدار وواعيًا بالبيئة وخاصًا بالبروفايل لكل خدمة مصغّرة. يتصل العملاء عند بدء التشغيل عبر spring.config.import، يدمج الخادم الخصائص وفق الأولوية، ويمكن تشفير القيم الحساسة في حالة السكون. في الدرس القادم ستتعلّم كيفية دفع الإعداد المحدَّث إلى الخدمات الجارية دون إعادة تشغيلها.