技術(shù)/楊33
一、分布式配置中心Config
一套集中的、動態(tài)的配置管理,實現(xiàn)統(tǒng)一配置微服務(wù)中的每個子服務(wù)。
Spring Cloud Config為微服務(wù)架構(gòu)提供了集中化的外部配置支持,配置服務(wù)器為各個不同微服務(wù)應(yīng)用的所有環(huán)境提供一個中心化的外部配置。
Config分為服務(wù)端和客戶端:
- 服務(wù)端,也就是分布式配置中心,是一個獨立的微服務(wù)應(yīng)用,用來連接配置服務(wù)器并為客戶端獲取配置信息。
- 客戶端,通過指定的配置中心來管理應(yīng)用資源。
Spring Cloud默認采用GitHub來存儲配置信息,這樣有助于對環(huán)境配置進行版本管理。
二、Config服務(wù)端讀取配置
1、在GitHub中新建一個文件夾,添加配置文件config-dev.yml
GitHub倉庫
config-dev.yml的內(nèi)容為:
config: info: "master,dev.yml"
2、新建module:cloud-config3344
org.springframework.cloud spring-cloud-config-server org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtimetrue cloud-common-util com.project.cloud1.0-SNAPSHOTorg.springframework.cloud spring-cloud-starter-netflix-eureka-client
- application.yml配置文件內(nèi)容:
server: port: 3344spring: application: name: cloud-config-center cloud: config: server: git: uri: https://github.com/yangjian433/springcloud-config.git #git倉庫的地址 search-paths: - springcloud-config label: master #讀取分支eureka: client: register-with-eureka: true #true表示向注冊中心注冊自己 fetch-registry: true #是否從EurekaServer抓取已有的注冊信息 service-url: #defaultZone: http://localhost:7001/eureka/ #單機服務(wù)注冊中心的地址 defaultZone: http://eureka7001.com:7001/eureka/ #集群服務(wù)
package com.cloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.config.server.EnableConfigServer;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;/** * @author 楊33 * @date 2020/5/2 12:40 */@SpringBootApplication@EnableEurekaClient@EnableConfigServerpublic class ConfigCenterMain3344 { public static void main(String[] args) { SpringApplication.run(ConfigCenterMain3344.class, args); }}
127.0.0.1 config-3344.com
3、啟動主類:ConfigCenterMain3344
訪問地址:http://config-3344.com:3344/master/config-dev.yml,讀取GitHub上的配置文件信息。
三、Config客戶端讀取配置
上面服務(wù)端已經(jīng)與GitHub直接連接,那么這塊只要通過搭建的客戶端訪問服務(wù)端,就可以實現(xiàn)間接訪問GitHub配置信息。
1、新建module:cloud-config-client3355
org.springframework.cloud spring-cloud-starter-config
- bootstrap.yml配置文件內(nèi)容:bootstrap.yml比application.yml的優(yōu)先級別高,屬于優(yōu)先加載。
server: port: 3355spring: application: name: cloud-config-client cloud: config: label: master #master分支 name: config #配置文件名稱 profile: dev #讀取后綴名稱,比如config-dev.yml、config-test.yml uri: http://localhost:3344 #配置中心地址eureka: client: register-with-eureka: true #true表示向注冊中心注冊自己 fetch-registry: true #是否從EurekaServer抓取已有的注冊信息 service-url: #defaultZone: http://localhost:7001/eureka/ #單機服務(wù)注冊中心的地址 defaultZone: http://eureka7001.com:7001/eureka/ #集群服務(wù)
package com.cloud.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;/** * @author 楊33 * @date 2020/5/2 13:29 */@RestControllerpublic class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/getConfigInfo") public String getConfigInfo() { return configInfo; }}
package com.cloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;/** * @author 楊33 * @date 2020/5/2 13:27 */@SpringBootApplication@EnableEurekaClientpublic class ConfigClientMain3355 { public static void main(String[] args) { SpringApplication.run(ConfigClientMain3355.class, args); }}
2、啟動主啟動類ConfigClientMain3355
訪問接口地址:http://localhost:3355/getConfigInfo
四、手動刷新GitHub上配置文件的修改,避免了客戶端多次重啟服務(wù)
1、pom.xml文件引入actuator監(jiān)控
org.springframework.boot spring-boot-starter-actuator
2、bootstrap.yml添加暴露監(jiān)控端點
#暴露監(jiān)控端點management: endpoints: web: exposure: include: "*"
3、業(yè)務(wù)類ConfigClientController添加刷新能力注解@RefreshScope
@RestController@RefreshScopepublic class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/getConfigInfo") public String getConfigInfo() { return configInfo; }}
4、命令行手動刷新端口。這最后一步執(zhí)行完,才能實現(xiàn)在GitHub上修改配置文件,客戶端cloud-config-client3355請求接口,修改立即生效,否則查出來的內(nèi)容還是修改之前的。
curl -X POST "http://localhost:3355/actuator/refresh"
查出來修改之后的文件內(nèi)容
五、消息總線是什么
在微服務(wù)架構(gòu)中,通常會使用輕量級的消息代理來構(gòu)建一個共用的消息主題,并讓系統(tǒng)中所有的微服務(wù)實例都連接上來。由于該主題中產(chǎn)生的消息會被所有的實例監(jiān)聽和消費,所以稱它為消息總線。
在總線上的各個實例,都可以便捷的廣播一些需要消息,讓該主題上連接的其他實例知道。
六、分布式自動刷新配置文件:消息總線Spring Cloud Bus
如果服務(wù)數(shù)量很多,手動刷新配置文件肯定是人力消耗非常大,不現(xiàn)實,那么自動刷新配置就解放了人力,提高了效率。
Spring Cloud Bus能管理和傳播分布式系統(tǒng)間的消息,用于廣播狀態(tài)更改、事件推送等。
Bus支持兩種消息代理:RabbitMQ和Kafka。本次以RabbitMQ為例開發(fā)測試:
1、在ConfigServer模塊cloud-config3344上修改幾處代碼配置:
org.springframework.cloud spring-cloud-starter-bus-amqp
- application.yml文件,添加內(nèi)容:rabbitmq節(jié)點和暴露端點配置
server: port: 3344spring: application: name: cloud-config-center cloud: config: server: git: uri: https://github.com/yangjian433/springcloud-config.git #git倉庫的地址 search-paths: - springcloud-config label: master #讀取分支 rabbitmq: addresses: 192.168.109.130 username: guest password: guest port: 5672#暴露監(jiān)控端點management: endpoints: web: exposure: include: "bus-refresh"eureka: client: register-with-eureka: true #true表示向注冊中心注冊自己 fetch-registry: true #是否從EurekaServer抓取已有的注冊信息 service-url: #defaultZone: http://localhost:7001/eureka/ #單機服務(wù)注冊中心的地址 defaultZone: http://eureka7001.com:7001/eureka/ #集群服務(wù)
2、在ConfigClient模塊cloud-config-client3355上修改幾處代碼配置:
org.springframework.cloud spring-cloud-starter-bus-amqp
- bootstrap.yml文件,添加內(nèi)容:rabbitmq節(jié)點和暴露端點配置
server: port: 3355spring: application: name: cloud-config-client cloud: config: label: master #master分支 name: config #配置文件名稱 profile: dev #讀取后綴名稱,比如config-dev.yml、config-test.yml uri: http://localhost:3344 #配置中心地址 rabbitmq: addresses: 192.168.109.130 username: guest password: guest port: 5672eureka: client: register-with-eureka: true #true表示向注冊中心注冊自己 fetch-registry: true #是否從EurekaServer抓取已有的注冊信息 service-url: #defaultZone: http://localhost:7001/eureka/ #單機服務(wù)注冊中心的地址 defaultZone: http://eureka7001.com:7001/eureka/ #集群服務(wù)#暴露監(jiān)控端點management: endpoints: web: exposure: include: "*"
3、啟動ConfigServer和ConfigClient的主啟動類
4、修改GitHub上的配置文件內(nèi)容
config: info: "master,dev.yml,+2"
此時在沒有執(zhí)行刷新端口命令,ConfigClient服務(wù)器還是查詢到修改前的數(shù)據(jù)。
5、只需刷新ConfigServer這一臺服務(wù)的端口,多個ConfigClient服務(wù)器都可以立即查詢到GitHub上修改后的配置文件內(nèi)容。
刷新ConfigServer這一臺服務(wù)的端口的命令是:
curl -X POST "http://localhost:3344/actuator/bus-refresh"
查詢到修改后的數(shù)據(jù)
上面是使用RabbitMQ做消息代理,才實現(xiàn)一處刷新,到處可用的功能,它的原理就是:
當一個服務(wù)刷新數(shù)據(jù)的時候,它會把這個消息放入到MQ的topic中,這樣其他監(jiān)聽同一個topic的服務(wù)器都能得到通知,然后去更新自身的配置。這個topic默認是springCloudBus。
6、上面是通過刷新ConfigServer這一臺服務(wù)的端口,實現(xiàn)全部的ConfigClient數(shù)據(jù)同步,那如何做,可以只同步某一臺客戶端ConfigClient服務(wù)的數(shù)據(jù)呢?
還是刷新ConfigServer這一臺服務(wù)端口,但是后面需要加參數(shù)destination,指定需要更新的服務(wù)或?qū)嵗?#xff0c;命令如下:
destination
比如只刷新cloud-config-client:3355服務(wù):
curl -X POST "http://localhost:3344/actuator/bus-refresh/cloud-config-client:3355"
這個名稱取自application.yml中的微服務(wù)名稱:spring: application: name: cloud-config-client,再加上端口號。
執(zhí)行命令后,就實現(xiàn)了只更新某一臺服務(wù)的數(shù)據(jù)。
作者:楊33,北京互聯(lián)網(wǎng)公司在職Java開發(fā),專注分享寫作干貨。歡迎關(guān)注我,期待你的點贊評論。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的iframe的src动态修改并刷新_微服务中配置中心Config+消息总线Bus,实现分布式自动刷新配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。