فيما يتعلق بالاستخدام الأساسي لـ Spring Cloud Config ، تم ذكره في المدونة السابقة. إذا كنت لا تفهم ، يرجى قراءة المدونة السابقة أولاً.
يدمج Cloud Config Spring Gitlab لإنشاء مركز تكوين موزع
توافر عالي لمركز التكوين الموزع للتكوين السحابي الربيعي
اليوم ، ينصب تركيزنا على كيفية تحقيق النشر الساخن لمصادر البيانات.
1. قم بتكوين مصدر البيانات على العميل
refreshscope @configuration // تكوين مصدر بيانات الفئة العامة dataSourCeConfigure {bean @refreshscope // تحديث ملف configuration fileConfigurationProperties (prepix = "spring.dataSource") }} من خلال الخطوات المذكورة أعلاه ، يمكنك تعديل ملف التكوين على gitlab. بعد التحديث ، لا يحتاج الخادم إلى إعادة تشغيله ، وسيصبح مصدر البيانات الجديد ساري المفعول.
2. النشر الساخن لمصادر البيانات المخصصة
عندما نستخدم SPRING BOOT لدمج DRUID ، نحتاج إلى تكوين مصدر البيانات يدويًا ، يكون الرمز كما يلي:
حزمة com.chhliu.springcloud.config ؛ استيراد java.sql.sqlexception ؛ استيراد javax.sql.datasource ؛ استيراد org.springframework.beans.factory.annotation.value ؛ استيراد org.springframework.cloud.context.config.annotation.refreshscope ؛ استيراد org.springframework.context.annotation.bean ؛ استيراد org.springframework.context.annotation.configuration ؛ استيراد org.springframework.context.annotation.primary ؛ استيراد com.alibaba.druid.pool.druiddatasource ؛ استيراد lombok.extern.slf4j.slf4j ؛ / ** * * الوصف: إذا لم تتم تهيئة DataSource يدويًا باستخدام الكود ، فلن يكون لدى مراقبة SQL لواجهة المراقبة أي بيانات ("هل حشرة التمهيد الربيعية ؟؟ value ("$ {spring.datasource.url}") سلسلة خاصة dburl ؛ value ("$ {spring.datasource.username}") اسم المستخدم الخاص بالسلسلة الخاصة ؛ Value ("$ {spring.datasource.password}") كلمة مرور السلسلة الخاصة ؛ Value ("$ {spring.datasource.driverClassName}") سلسلة خاصة driverClassName ؛ Value ("$ {spring.datasource.initialsize}") private int initalsize ؛ value ("$ {spring.datasource.minidle}") private int minidle ؛ Value ("$ {spring.datasource.maxactive}") private int maxaCyt ؛ value ("$ {spring.datasource.maxwait}") private int maxwait ؛ Value ("$ {spring.datasource.TimeBetweenevictionRunsmillis}") private int ttreateDeenevictionRunsmillis ؛ value ("$ {spring.datasource.minevictableDletimEmillis}") private int minevictableDletimemillis ؛ Value ("$ {spring.datasource.validationQuery}") سلسلة خاصة بالسلسلة ؛ value ("$ {spring.datasource.testwhileIdle}") اختبار منطقي خاص ؛ value ("$ {spring.datasource.testonborrow}") private boolean testonborrow ؛ Value ("$ {spring.datasource.testonborrow}") private boolean testOnreturn ؛ value ("$ {spring.datasource.testonborrow}") properpreparedStates booleans ؛ Value ("$ {spring.datasource.maxpoolpreparedStatePerConnectionSize}") private int maxpoolpropedstatePerConnectionsize ؛ Value ("$ {spring.datasource.filters}") مرشحات السلسلة الخاصة ؛ Value ("$ {spring.datasource.connectionProperties}") سلسلة خاصة بالتوصيل ؛ value ("$ {spring.datasource.usglobaldatasourcestat}") private boolean usglobaldatasourcestat ؛ bean // إعلان أنه مثيل bean @primary // في نفس بيانات البيانات ، استخدم أولاً DataSourceTreferceRefreshScope DataSource DataSource () {DruidDataSource dataSource = new DruidDataSource () ؛ datasource.seturl (this.dburl) ؛ datasource.setUserName (اسم المستخدم) ؛ datasource.setPassword (كلمة المرور) ؛ datasource.setDriverClassName (driverClassName) ؛ // التكوين dataSource.setInitialSize (التهيئة) ؛ datasource.setminidle (minidle) ؛ datasource.setMaxActive (maxaCive) ؛ datasource.setMaxWait (maxwait) ؛ datasource.SettimeBetweenevictionRunsmillis (timeBetweenevictionRunsmillis) ؛ datasource.setMineVictableDletimemillis (MineVictableIdletimemillis) ؛ datasource.setValidationQuery (ValideDquery) ؛ datasource.settesthileIdle (testhileIdle) ؛ datasource.settestonborrow (testOnBorrow) ؛ datasource.settestonreturn (testOnreturn) ؛ datasource.setPoolPrepedStatements (poolpreparedstatements) ؛ datasource.setMaxPoolPrepedStatePerConnectionSize (maxpoolprepedstateMentPerConnectionize) ؛ datasource.setuseglobaldatasourcestat (usglobaldatasourcestat) ؛ حاول {datasource.setFilters (المرشحات) ؛ } catch (sqlexception e) {log.error ("مرشح تهيئة تكوين druid:"+ e) ؛ } datasource.setConnectionProperties (connectionProperties) ؛ إرجاع مصدر البيانات ؛ }} من خلال المثال أعلاه ، يمكن أيضًا تحقيق التحديث الديناميكي لمصادر البيانات. بعد ذلك ، دعونا نلقي نظرة على كيفية تنفيذ Cloud Config الذي ينفذ النشر الساخن لمصادر البيانات.
من المدونة السابقة ، ليس من الصعب العثور على أنه من أجل تحقيق تحديث ديناميكي ، تكون النقطة الرئيسية بناءً على طلب تحديث المنشور ، لذلك نبدأ بتحديث ملف التكوين.
عندما ننشر طلب التحديث ، سيتم اعتراض الطلب بواسطة وحدة المشغل. يمكن رؤية هذا من ملف سجل بدء التشغيل
نسخة الكود كما يلي:
تم تعيين "{[ /refresh || /Refresh.json/Methods= Budappost]}" على java.lang.object org.springframework.cloud.endpoint.genericpostableMvCendPoint.invoke ()
بعد ذلك ، دعونا نلقي نظرة على نقطة النهاية المحددة بواسطة Actuator ، ثم نجد فئة RefreshEndPoint. الكود المصدري لهذه الفئة هو كما يلي:
ConfigurationProperties (prefix = "endpoints.refresh" ، تجاهل unknownfields = false) managedResource public class refreshendpoint يمتد مجردة <collection <string >> {private contextrefresher contextrefresher ؛ Public RefreshEndPoint (contextrefresher contextrefresher) {super ("refresh") ؛ this.contextrefresher = contextrefresher ؛ } managedOperation public string [] refresh () {set <string> keys = contextrefresher.refresh () ؛ إرجاع Keys.Toarray (سلسلة جديدة [Keys.size ()]) ؛ } Override Public Collection <Tring> invoke () {return arrays.aslist (refresh ()) ؛ }}من الكود المصدر أعلاه ، يمكننا أن نرى أن التركيز على فئة Contextrefresher. نظرًا لأن هذه الفئة طويلة جدًا ، فإن ما يلي هو رمز مصدر جزئي لهذه الفئة:
نطاق RefreshScope الخاص ؛ contextrefresher العامة (ConfiguRableApplicationContext Context ، SurffScope Scope) {this.context = context ؛ this.scope = نطاق ؛ } مجموعة متزامنة عامة <string> refresh () {map <string ، object> قبل = extract (this.context.getEnvironment (). getPropertySources ()) ؛ // 1. extract (this.context.getenvironment (). إرجاع مفاتيح } ليس من الصعب رؤية من الكود أعلاه أن النقاط الرئيسية قد مرت 4 خطوات وتم تمييزها في الكود أعلاه.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.