1:理解bootstrap.yamlhtml
它會在application以前加載,若是和application有同名屬性,先啓動的會被覆蓋。java
2:配置中心與咱們的註冊中心,必需要有一個先啓動git
3:spring的配置與環境化github
在spring3.0-》web
<beans profile =」test」>
<bean id=」」>
</beans>spring
4:搭建一個配置中心bootstrap
Git svn 本地文件緩存
讀取本地文件:springboot
理解一下 ${user.dir}服務器
在配置中心/resources下新建文件夾configs
建立三個文件 eurekaserver-dev.yml eurekaserver-prod.yml eurekaserver-prod.yml
引入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> </dependencyManagement>
配置文件:
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: "*"
打開git初始化:
git init
git add .
git commit -m 「frist commit」
在啓動類上加上註解@EnableConfigServer
配置中心完成。
客戶端鏈接:
新建文件---bootstrap.yml
配置以下:
spring: application: name: eurekaserver cloud: config: name: eurekaserver uri : http://localhost:5000/ profiles: active: dev server: port: 10000
而後 引入jar包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-client</artifactId> </dependency>
在啓動類上加入@EnableDiscoveryClient
客戶端完成,啓動就能夠訪問
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
首先了解bootstarp配置
bootstarp配置文件會被先加載,一旦在咱們的application中存在同名配置,會直接生效application中的配置,因此,咱們能夠認爲這個是一個覆蓋的過程。
瞭解一下springboot的Actuator監控
Actuator是springboot提供的一個監控方式。
Actuator是Spring Boot提供的對應用系統的自省和監控的集成功能,能夠查看應用配置的詳細信息,例如自動化配置信息、建立的Spring beans以及一些環境屬性等。
Actuator的監控分兩類:原生端點和用戶自定義端點;自定義端點主要是指擴展性,用戶能夠根據本身的實際應用,定義一些比較關心的指標,在運行期進行監控。
原聲端點分爲三類
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也就是事件總線來對咱們客戶端通知進行拉取,如今暫時不講。留在後面一塊兒完成。這裏只須要知道這種方式能夠去完成咱們的目標便可。
官方文檔地址:
在這段話中,官方文檔提到了一個叫作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; }