Spring cloud配置中心
用於集中配置數據管理,簡化微服務集羣環境下大量配置的更新工作。
1:理解bootstrap.yaml
它會在application之前加載,如果和application有同名屬性,先啓動的會被覆蓋。
2:配置中心與我們的註冊中心,必須要有一個先啓動
3:spring的配置與環境化
在spring3.0-》
<beans profile =”test”>
<bean id=””>
</beans>
4:搭建一個配置中心
Git svn 本地文件
讀取本地文件:理解 ${user.dir}的作用
1 在配置中心/resources下新建文件夾configs
創建三個文件 eurekaserver-dev.yml eurekaserver-prod.yml eurekaserver-prod.yml
2 引入jar
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入核心jar-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
3 配置文件:
server:
port: 5000
spring:
application:
name: config-server
cloud:
config:
server:
git:
##定義去拉取配置的地址
uri: D:\\lesson-1\\config-server\\src\\main\\resources\\configs
management:
endpoints:
web:
exposure:
include: "*"
4 打開git初始化:
git init
git add .
git commit -m “frist commit”
5 在啓動類上加上註解@EnableConfigServer
6 配置中心完成。
客戶端連接:
1 新建文件---bootstrap.yml 配置如下:
spring:
application:
name: eurekaserver
cloud:
config:
name: eurekaserver
uri : http://localhost:5000/
profiles:
active: dev
server:
port: 10000
2 引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
在啓動類上加入@EnableDiscoveryClient
客戶端完成,啓動就可以訪問
根據在線地址向git去拉取配置:
1:配置文件如下:
##定義一個名字
spring:
application:
name: dnconfig
##配置服務器的文件地址git倉庫
cloud:
config:
server:
git:
#這是老師的git地址,可以自己去定義一個git地址去獲取
uri: https://github.com/yaojin156/tmp.git
#${user.dir}\src\main\resources\configs
#定義爲強制向git去拉取配置
force-pull: true
##定義當前這個端口
server:
port: 9090
##定義env 和 health的開放 2.0中這個方式已經被取消
#management:
# security:
# enabled: true
##定義env 和health的開放 2.X版本應該這麼寫
management:
endpoints:
web:
exposure:
include: env
2:在計算機中新建三個配置文件(我的文件放在D:\download\tmp)
orderserver-prod.properties表示生產服務配置
orderserver-test.properties表示測試配置
orderserver-dev.properties表示開發配置
指定配置路徑爲:
cloud:
config:
server:
git:
#這是老師的git地址,可以自己去定義一個git地址去獲取
uri: https://github.com/yaojin156/tmp.git
3:將自己的配置文件提交到在線的git中
git clone https://github.com/yaojin156/tmp.git
git add orderserver-*.properties
git commit -m "fritst commit"
git push
4:配置強制拉取git文件
cloud:
config:
server:
git:
uri: https://github.com/yaojin156/tmp.git
#${user.dir}\src\main\resources\configs
#定義爲強制向git去拉取配置
force-pull: true
6:開始測試本地配置是否生效
http:localhost:9090/order/server-prod
搭建一個客戶端configclient
首先了解bootstarp配置
bootstarp配置文件會被先加載,一旦在我們的application中存在同名配置,會直接生效application中的配置,所以,我們可以認爲這個是一個覆蓋的過程。
瞭解一下springboot的Actuator監控
Actuator是springboot提供的一個監控方式。
Actuator是Spring Boot提供的對應用系統的自省和監控的集成功能,可以查看應用配置的詳細信息,例如自動化配置信息、創建的Spring beans以及一些環境屬性等。
Actuator的監控分兩類:原生端點和用戶自定義端點;自定義端點主要是指擴展性,用戶可以根據自己的實際應用,定義一些比較關心的指標,在運行期進行監控。
原聲端點分爲三類
- 應用配置類:可以查看應用在運行期的靜態信息:例如自動配置信息、加載的springbean信息、yml文件配置信息、環境信息、請求映射信息;
- 度量指標類:主要是運行期的動態信息,例如堆棧、請求連、一些健康指標、metrics信息等;
- 操作控制類:主要是指shutdown,用戶可以發送一個請求將應用的監控功能關閉。
Actuator 提供了 13 個接口
我們只需要去了解我們今天要用的 env/{name} 根據名稱獲得特定的屬性值
1:配置bootstrap.yml
spring:
cloud:
config:
#定義爲文件的名字
name: order-server
#去獲取到配置中心的地址
uri: http://127.0.0.1:9090/
#獲取到我們的profile名字
profile: test
2:配置application.yml
##定義端口號和實例名稱
server:
port: 8091
spring:
application:
name: spring-cloud-config-client
###定義開啓env
management:
endpoints:
web:
exposure:
include: env
3:啓動config-client 訪問
http://localhost:8091/actuator/env
可以看到我們的配置中心內部的配置信息
4:開始從配置中心獲取配置信息
@Value("${name}")
private String name;
@Value("${id}")
private String id;
@RequestMapping("/hi")
public String hi(){
System.out.println("輸出的東西是:id:"+id+",name:"+name);
return "id:"+id+",name:"+name;
}
5: 如果服務端配置發生變化,客戶端如何發生變化?
我們的配置並不是一成不變的,如果我去移動了服務器,或者我需要新加入一個節點,那麼我就需要在配置項中把配置進行修改,那麼在這個時候,我們難道要去重啓我們的所有服務節點嗎?
在配置文件orderserver-test.properties中新加入配置
dn.name = nick
dn.age = 17
’
刷新服務,配置已經在配置中心可以顯示了。
但是,在我們的客戶端
並沒有相應的配置項存在,那麼問題就來了。
這時候我們該怎麼辦?
spring給我們提供了一個刷新的方式,可以通過刷新配置端點來解決當前的問題。
具體操作如下:修改客戶端配置application.yml
management:
endpoints:
web:
exposure:
#讓客戶端支持env和refresh方式
include: env,refresh
通過postman向我們的配置服務器發送請求
http://localhost:8091/actuator/refresh 記得是POST方式
這樣我們就可以獲取到修改後最新的配置了。
正常情況下,我們修改了配置需要cloud的Bus也就是事件總線來對我們客戶端通知進行拉取,現在暫時不講。留在後面一起完成。這裏只需要知道這種方式可以去完成我們的目標即可。
理解refresh的作用
官方文檔地址:
在這段話中,官方文檔提到了一個叫做spring-cloud-config-monitor的東西,這一段話中主要的意思其實就是我們的配置中心的變更可以用spring cloud Bus來對我們進行通知。如果在配置服務器中添加Spring - Cloud配置監視器庫的依賴項並激活Spring雲總線,則啓用/monitor端點。
注意文檔中這一段:
When the webhook is activated, the Config Server sends a RefreshRemoteApplicationEvent targeted at the applications it thinks might have changed.
當webhook被激活時,配置服務器發送一個RefreshRemoteApplicationEvent,目標是它認爲可能已經更改的應用程序。
好,這一塊東西我們暫時不講,先寄存着,我們先了解一下refresh的原理
public synchronized Set<String> refresh() {
//調用下面的刷新方法。
Set<String> keys = this.refreshEnvironment();
//清空RefreshScope緩存
// RefreshScope用新的環境參數重新生成Bean
this.scope.refreshAll();
return keys;
}
public synchronized Set<String> refreshEnvironment() {
//提取標準參數(SYSTEM,JNDI,SERVLET)之外所有參數變量
Map<String,Object>before= this.extract(this.context.getEnvironment().getPropertySources());
//把原來的Environment裏的參數放到一個新建的Spring Context容器下重新加載,完事之後關閉新容器
this.addConfigFilesToEnvironment();
//比較出變更項
Set<String> keys = this.changes(before,
this.extract(this.context.getEnvironment().getPropertySources())).keySet();//提取更新過的參數(排除標準參數)
//發送EnvironmentChangeEvent
//發佈環境變更事件,接收:EnvironmentChangeListener/LoggingRebinder
this.context.publishEvent(new EnvironmentChangeEvent(this.context, keys));
return keys;
}