Mengenai penggunaan dasar konfigurasi Cloud Spring, telah disebutkan di blog sebelumnya. Jika Anda tidak mengerti, silakan baca blog sebelumnya terlebih dahulu.
Konfigurasi Cloud Musim Semi mengintegrasikan GitLab untuk membangun pusat konfigurasi terdistribusi
Ketersediaan tinggi pusat konfigurasi konfigurasi cloud spring
Saat ini, fokus kami adalah bagaimana mencapai penyebaran sumber data yang panas.
1. Mengkonfigurasi sumber data pada klien
@Refreshscope @configuration // Konfigurasi sumber data Public Class Public DataSourConfigure {@bean @refreshscope // File konfigurasi refresh @configurationproperties (prefix = "spring.datasource") // awalan untuk konfigurasi otomatis sumber data public dataSource () {return dataSource () {return dataSoure () {return datasoure. }} Melalui langkah -langkah di atas, Anda dapat memodifikasi file konfigurasi di GitLab. Setelah menyegarkan, server tidak perlu dimulai ulang, dan sumber data baru akan berlaku.
2. Penyebaran panas sumber data khusus
Ketika kami menggunakan Spring Boot untuk mengintegrasikan Druid, kami perlu mengonfigurasi sumber data secara manual, kode tersebut adalah sebagai berikut:
paket com.chhliu.springcloud.config; impor java.sql.sqlexception; impor javax.sql.datasource; impor org.springframework.beans.factory.annotation.value; impor org.springframework.cloud.context.config.annotation.refreshscope; impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.configuration; impor org.springframework.context.annotation.primary; impor com.alibaba.druid.pool.druiddataSource; impor lombok.extern.slf4j.slf4j; / ** * * Deskripsi: Jika sumber data tidak diinisialisasi secara manual menggunakan kode, pemantauan SQL dari antarmuka pemantauan tidak akan memiliki data ("adalah bug boot musim semi ???") * @author chhliu * dibuat: 9 Februari 2017 pukul 7:33:08 pm * @version 1.2.0 */ @slf4j @confiuration @confiurasi @confururasi @coneshurasi @coneshuration @conesescopuration @Value ("$ {spring.datasource.url}") Private String dBURL; @Value ("$ {spring.datasource.username}") Private String username; @Value ("$ {spring.datasource.password}") kata sandi string pribadi; @Value ("$ {spring.datasource.driverclassname}") Private String DriverClassName; @Value ("$ {spring.datasource.initialsize}") Private int Inisizasi; @Value ("$ {spring.datasource.minidle}") private int minidle; @Value ("$ {spring.datasource.maxactive}") private int maxactive; @Value ("$ {spring.datasource.maxwait}") private int maxwait; @Value ("$ {spring.datasource.TimeBetweenEvictionRunsmillis}") private int timeTeFareVictionRunsmillis; @Value ("$ {spring.datasource.minevictableIdletimeMillis}") private int minevictableIdletimemillis; @Value ("$ {spring.datasource.ValidationQuery}") Private String ValidationQuery; @Value ("$ {spring.datasource.testwhileidle}") private boolean testwhileidle; @Value ("$ {spring.datasource.testonborrow}") private boolean testonborrow; @Value ("$ {spring.datasource.testonborrow}") private boolean testonreturn; @Value ("$ {spring.datasource.testonborrow}") private boolean poolpreparedstatements; @Value ("$ {spring.datasource.maxpoolPreparedStatePerConnectionSize}") private int maxPoolPreparedStatePerConnectionSize; @Value ("$ {spring.datasource.filters}") filter string pribadi; @Value ("$ {spring.datasource.connectionProperties}") Private String ConnectionProperties; @Value ("$ {spring.datasource.useglobaldataSourcestat}") boolean private UseglobaldataSourcestat; @Bean // menyatakannya sebagai instance bean @primary // dalam sumber data yang sama, pertama -tama gunakan DataSource @refreshscope public DataSource {druidDataSource dataSource = new druidDataSource (); DataSource.setUrl (this.dburl); DataSource.SetUserName (nama pengguna); DataSource.setPassword (kata sandi); DataSource.SetDriverClassName (DriverClassName); // konfigurasi dataSource.setInitialSize (inisialisasi); DataSource.SetMinidle (Minidle); DataSource.SetMaxActive (MaxActive); DataSource.SetMaxwait (MaxWait); DataSource.SettimeBetweeneVictionRunsmillis (Timebetweenevictionrunsmillis); DataSource.setMinEvictableIdletimemillis (MinEvictableIdletimeMillis); DataSource.SetValidationQuery (ValidationQuery); DataSource.settestwhileIdle (testwhileidle); DataSource.settestonborrow (testonborrow); DataSource.settestonreturn (testonreturn); DataSource.SetPoolPreparedStatements (PoolPreparedStatements); DataSource.SetMaxPoolPreparedStatementPerConnectionSize (MaxPoolPreparedStatePerConnectionSize); DataSource.SetusEglobalDataSourCestat (USEGLOBALDataSourCestat); coba {DataSource.SetFilters (filter); } catch (sqlexception e) {log.error ("Filter inisialisasi konfigurasi druid:"+ e); } DataSource.SetConnectionProperties (ConnectionProperties); Return DataSource; }} Melalui contoh di atas, refresh dinamis dari sumber data juga dapat dicapai. Selanjutnya, mari kita lihat bagaimana konfigurasi Cloud Spring mengimplementasikan penyebaran sumber data yang panas.
Dari blog sebelumnya, tidak sulit untuk menemukan bahwa untuk mencapai penyegaran dinamis, poin kunci adalah pada permintaan Post Refresh, jadi kami mulai dengan menyegarkan file konfigurasi.
Saat kami memposting permintaan refresh, permintaan akan dicegat oleh modul aktuator. Ini dapat dilihat dari file log startup
Salinan kode adalah sebagai berikut:
Dipetakan "{[ /Refresh || /Refresh.json media,methods=öpost]}" ke java.lang public.Object org.springframework.cloud.endpoint.genericpostablemvcendpoint.invoke ()
Selanjutnya, mari kita lihat titik akhir yang ditentukan oleh aktuator, dan kemudian kita menemukan kelas RefreshendPoint. Kode sumber kelas ini adalah sebagai berikut:
@ConfigurationProperties (prefix = "endpoints.refresh", degnerunknownfields = false) @ManagedResource kelas publik Refreshendpoint memperluas AbstractendPoint <koleksi <string>> {private ContextrefResher Contextrefresher; Public RefreshendPoint (ContextrefResher ContextrefResher) {super ("Refresh"); this.contextrefresher = contextrefresher; } @ManageDoperation Public String [] refresh () {set <string> keys = contextrefresher.refresh (); return keys.toArray (string baru [keys.size ()]); } @Override Public Collection <String> Invoke () {return arrays.aslist (refresh ()); }}Dari kode sumber di atas, kita dapat melihat bahwa fokusnya adalah pada kelas Contextrefresher. Karena kelas ini terlalu panjang, berikut ini adalah kode sumber parsial dari kelas ini:
lingkup penyegaran pribadi; Public ContexTrefResher (ConfigurableApplicationContext Context, RefreshScope Scope) {this.context = Context; this.scope = scope; } Set Sinkronisasi Publik <String> Refresh () {MAP <String, Object> Sebelum = Ekstrak (this.context.getEnvironment (). GetPropertySources ()); // 1. Sebelum, memuat dan mengekstrak file konfigurasi addConfigFilestoenvironment () (); // 2. Muat file konfigurasi ke dalam lingkungan STRING <) (); ekstrak (this.context.getEnvironment (). getPropertySources ())). keyset (); // 3. Ganti nilai dalam variabel lingkungan asli this.context.publishevent (new EnvironmentChangeEvent (Keys)); // 4. Publikasikan acara perubahan, this.scope.refresheshall (); kunci kembali; } Tidak sulit untuk melihat dari kode di atas bahwa poin -poin kunci telah melalui 4 langkah dan telah ditandai dalam kode di atas.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.