عادةً ما يكون مصدر التكوين للتطبيق هو خادم التكوين عن بُعد. بشكل افتراضي ، تكون أولوية التكوين المحلية أقل من مستودع التكوين عن بُعد. إذا كنت ترغب في تنفيذ متغيرات نظام التطبيق المحلي وملفات التكوين للكتابة فوق قيم الخصائص في المستودع البعيد ، يمكنك تعيينها على النحو التالي:
الربيع: سحابة: التكوين: almotoverride: TrueOverridenone: TrueOverRidesystemProperties: false
من خلال التكوين أعلاه ، يمكن للعميل تحقيق أولوية أعلى في التكوين المحلي ولا يمكن الكتابة فوقه. نظرًا لأن الإصدار الحالي من Spring Cloud الذي نعتمد عليه هو Edgware.RELEASE ، فإن الإعدادات أعلاه لا تعمل ، ولكن تستخدم القيم الافتراضية في PropertySourceBootstrapProperties . للحصول على مواقف محددة ، راجع المشكلة: https://github.com/spring-cloud/spring-cloud-commons/pull/250. سوف نتحدث عن المصدر المحدد للخشب في التحليل التالي.
تحليل رمز المصدر
ConfigServicePropertySourcelocator
ترتبط خصائص التكوين عن بُعد في نهاية المطاف بالحصول على التكوين في بداية العميل. كيفية التعامل معها بعد الحصول على التكوين؟ دعنا نلقي نظرة على مخطط الفصل لفئة اكتساب الموارد ConfigServicePropertySourCorator في Spring Cloud Config.
ConfigRevicePropertySourCelocator هو في الأساس محدد موارد الممتلكات ، وطريقته الرئيسية هي الموقع (بيئة البيئة). أولاً ، استبدل العنصر النائب في ConfigClientProperties بالتطبيق والملف الشخصي والتسمية للبيئة التي يعمل فيها التطبيق حاليًا ، وتهيئة RestTemplate ، ثم التكرار من خلال صفيف التسميات حتى يتم الحصول على معلومات تكوين صالحة ، وأخيراً إعادة المحاولة بناءً على ما إذا كان يفشل بسرعة. العملية الرئيسية هي كما يلي:
تحديد موقع (البيئة) استدعاء طريقة getRemoteenVironment (RestTemplate ، الخصائص ، التسمية ، الحالة) للحصول على بيانات التكوين على الخادم البعيد من خلال HTTP. التنفيذ هو أيضا بسيط جدا. عرض العنصر النائب في مسار طلب الاستبدال ، ثم تجميع الرؤوس. بمجرد تجميعها ، يمكن إرسال الطلب وسيتم إرجاع النتيجة.
في التنفيذ أعلاه ، نرى أن معلومات التكوين التي تم الحصول عليها يتم تخزينها في compositepropertysource. كيف نستخدمه؟ فئة أخرى مهمة لإضافتها هنا هي PropertySourceBootSstrapConfiguration ، والتي تنفذ واجهة ApplicationContextInitializer. سيتم استدعاء هذه الواجهة () مرة أخرى قبل تحديث سياق التطبيق ، وبالتالي تنفيذ عملية التهيئة. مكدس المكالمات بعد بدء تشغيل التطبيق كما يلي:
springapplicationbuilder.run () -> springapplication.run () -> springapplication.createandrefreshcontext () -> springapplication.applyinitializers (
سيتم استدعاء طريقة الموقع الخاصة بـ ConfigReviceRVicePropertySourticOcator في التهيئة ، وذلك للتأكد من أن السياق يمكنه الحصول على معلومات التكوين اللازمة قبل التحديث. لنلقي نظرة على طريقة التهيئة:
propertysourceBOTSTRAPCONFIGIRIMPRINGEREMSIMPLEMSERMENTS ApplicationContInitializer <ConfigurableApplicationContext> ، تم طلب {private int order = order.highest_precedence + 10 ؛ @autowired (مطلوب = false) قائمة خاصة <PerpertySourCorator> propertySourcelOcators = new ArrayList <> () ؛ Override public void تهيئة (configurableApplicationContext ApplicationContext) {compositepropertysource composite = compositepropertysource (bootstrap_property_source_name) ؛ // فرز صفيف PropertySourcelocators واتبع التعليقات التوضيحية الافتراضية annotationAwareOrderComparator.sort (this.propertysourcelocators) ؛ منطقية فارغة = صواب ؛ // احصل على بيئة البيئة الجارية للتكوين البيئية = ApplicationContext.getenVironment () ؛ لـ (propertysourcorator locator: this.propertysourcelocators) {// transtraight this.propertysourcorocators propertySource <؟> source = null ؛ المصدر = locator.locate (البيئة) ؛ if (source == null) {contert ؛ } logger.info ("موقع خاصية مصدر:" + مصدر) ؛ // إضافة مصدر إلى القائمة المرتبطة بـ PropertySource Composite.AddPropertySource (Source) ؛ فارغ = خطأ ؛ } // فقط إذا لم يكن المصدر فارغًا ، فسيتم ضبطه على البيئة إذا كان (! فارغ) {// إرجاع النموذج المتغير للبيئة ، والذي يمكن تنفيذه مثل AddFirst و AddLast MutablePropertySources PropertySources = evely.getPropertySources () ؛ String logConfig = Environment.ResolvePlace Holders ("$ {logging.config:}") ؛ logfile logfile = logfile.get (البيئة) ؛ if (propertysources.contains (bootstrap_property_source_name)) {// إزالة properalsources.remove (bootstrap_property_source_name) ؛ }. reinitializeloggingsystem (البيئة ، logConfig ، logfile) ؛ setLoglevels (البيئة) ؛ // التخلص من معلومات تكوين Actives متعددة من ملفات التعريف المقبض (بيئة) ؛ }} // ...}دعونا نلقي نظرة على العمليات التي يتم تنفيذها في طريقة التهيئة.
إرجاع النموذج المتغير للبيئة ، والذي يمكن تنفيذه مثل AddFirst ، AddLast
إزالة bootstrapproperties في propertysources
وفقًا لقواعد تجاوز خادم التكوين ، قم بتعيين PropertySources
التعامل مع معلومات التكوين لملفات تعريف نشطة متعددة
عند تهيئة طريقة التهيئة ، اجتاز أولاً طريقة تحديد موقع جميع كائنات PropertySourcelOcator ، ثم ضع قيم الخصائص التي تم الحصول عليها بطرق مختلفة في CompositePropertysource ، وأخيراً استدعاء طريقة إدراجها (PropertySources ، Composite) لتعيينها في البيئة. يوفر Spring Cloud Context PropertySourceBootSstrapProperties التي تحدد خصائص عن بُعد ، وتستخدم فئة التكوين هذه لتحديد أولوية مصدر الخصائص.
private void insertPropertysources (propertysourtysources ageablepropertysources ، compositepropertysource composite) {mutablePropertySources invorming = newPropertysources () ؛ invod.addfirst (مركب) ؛ propertySourceBotStrapProperties Remoteproperties = propertySourceBotStrapProperties () ؛ New RelaxedDatabinder (Remoteproperties ، "spring.cloud.config") .bind (PropertySourcesPropertyValues (الواردة)) ؛ // إذا كان الكتابة فوق المحلية غير مسموح بها (! remoteproperties.isallowoverride () || (! Remoteproperties.isoverridenone () && remoteproperties.isoverRidesystemProperties ())) يعود؛ } // overridenone صحيح ، فإن التكوين الخارجي له أدنى أولوية إذا (remoteproperties.isoverridenone ()) {propertysources.addlast (مركب) ؛ يعود؛ } if (propertysources. contains (standardenvironment.system_environment_property_source_name))) standardenvironment.system_environment_property_source_name ، مركب) ؛ } آخر {propertysources.addbefore (standardenvironment.system_environment_property_source_name ، composite) ؛ }} آخر {propertysources.addlast (مركب) ؛ }}يقوم التنفيذ أعلاه بضبط أولوية مصادر التكوين المتعددة بناءً على الخصائص في PropertySourceBootSstrapProperties . من تنفيذها ، يمكننا أن نرى أن كائن PropertySourceBootStrapProperties تتم تهيئة مباشرة ، باستخدام قيمة الخاصية الافتراضية ولا يتم حقنه في ما حددناه في ملف التكوين.
التنفيذ الذي تم إصلاحه:
Autowired (مطلوب = خطأ) propertySourceBotStrapProperties remotepropertiesforerving ؛ Override public int getorder () {return this.order ؛ private void insertPropertysources (propertysourtysources ageablepropertysources ، compositepropertysource composite) {mutablePropertySources invorming = newPropertysources () ؛ invod.addfirst (مركب) ؛ PropertySourceBotStrapProperties Remoteproperties = RemotePropertiesForoverRiding == NULL؟ PropertySourceBootSstrapProperties (): remotepropertiesforoverroding ؛لخص
ما ورد أعلاه هو شرح مفصل لخصائص تكوين عن بُعد من سحابة الربيع التي تم تقديمها من قبل المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!