前文
SpringCloud —— 服務註冊進 Eureka 集羣
SpringCloud —— SpringCloud Consul 實現服務註冊中心
SpringCloud —— HystrixDashboard 服務監控
文章目錄
分佈式系統面臨的配置問題
微服務意味着要將單體應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,因此係統中會出現大量的服務。由於每個服務都需要必要的配置信息才能運行,所有一套集中式的、動態的配置管理設施是必不可少的
SpringCloud Config 是什麼?
SpringCloud Config 作爲微服務架構中的微服務提供集中化的外部配置支持,配置服務器爲 各個不同微服務應用 的所有環境提供了一個 中心化的外部配置
SpringCloud Config 分爲 服務端和客戶端兩部分
服務端也稱爲 分佈式配置中心,它是一個獨立的微服務應用,用來連接配置服務器併爲客戶端提供獲取配置信息,加密 / 解密信息等訪問接口
客戶端則是通過指定的配置中心來管理應用資源,以及與業務相關的配置內容,並在啓動的時候從配置中心獲取和加載配置信息配置服務器默認採用 Git 來存儲配置信息,這樣就有助於對環境配置進行版本管理,並且可以通過 Git 客戶端工具來方便的管理和訪問配置內容
SpringCloud Config 能幹嘛
- 集中管理配置文件
- 不同環境不同配置,動態化的配置更新,分環境部署比如 dev/test/prod/beta/release
- 運行期間動態調整配置,不需要再每個服務部署的機器上編寫配置文件,服務會向配置中心統一拉取配置自己的信息
- 當配置發生變動時,服務不需要重啓即可感知到配置的變化並應用新的配置
- 將配置信息以 REST 接口的形式暴露
SpringCloud Config 部署測試
新建 Repository
用自己的 Github 賬號在 Github 上新建一個名爲 springcloud-config 的新 Repository
在電腦新建一個文件夾
將 Github 新建的倉庫 clone 到該文件夾下
新建 Module(8033)
編寫 application.yml 文件
server:
port: 8033
spring:
application:
name: demo-config-center #註冊進Eureka服務器的微服務名
cloud:
config:
server:
git:
uri: .git #GitHub上面的git倉庫名字
####搜索目錄
search-paths:
- springcloud-config
####讀取分支
label: master
#服務註冊到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
編寫啓動類
package com.java.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* @author Woo_home
* @create 2020/3/30 12:27
*/
@SpringBootApplication
@EnableConfigServer
public class ConfigCenterMain8033 {
public static void main(String[] args){
SpringApplication.run(ConfigCenterMain8033.class,args);
}
}
修改 hosts 文件
修改 C:\Windows\System32\drivers\etc 下的 hosts 文件,在底部增加以下內容
測試訪問
在啓動服務之前先上傳一個文件到 Github 上(格式名稱如:{application} - {name}.yml),待會讓 8033 讀取
先啓動 EurekaServer 7001 再啓動 8033,訪問 http://config-8033.com:8033/master/config-dev.yml,如下:(注意:在 Github 上新建倉庫的時候要設置爲 public,不然會報錯,具體是不是因爲這個我也不知道,知道的朋友可以在評論區評論下,相互學習,謝謝)
成功從 Github 上獲取信息
新建 Module(8055)
上面已經基本實現了配置中心,那麼要新建客戶端從 server 端讀取內容了
編寫 bootstrap.yml 文件
application.yml 是用戶級的資源配置項,bootstrap.yml 是系統級的,優先級更加高
SpringCloud 會創建一個 “Bootstrap Context”,作爲 Spring 應用的 “Application Context” 的 父上下文。初始化的時候,“Bootstrap Context” 負責從 外部源 加載配置屬性並解析配置。這兩個上下文共享一個從外部獲取的 “Environment”
“Bootstrap” 屬性有高優先級,默認情況下,它們不會被本地配置覆蓋。“Bootstrap Context” 和 “Application Context” 有着不同的約定,所以新增了個 “bootstrap.yml” 文件,保證 “Bootstrap Context” 和 “Application Context” 配置的分離
要將 Client 模塊下的 application.yml 文件修改爲 bootstrap.yml,這是很關鍵的,因爲 bootstrap.yml 是比 application.yml 先加載的,bootstrap.yml 優先級高於 application.yml
server:
port: 8055
spring:
application:
name: config-client
cloud:
#Config客戶端配置
config:
label: master #分支名稱
name: config #配置文件名稱
profile: dev #讀取後綴名稱 上述3個綜合:master分支上config-dev.yml的配置文件被讀取http://config-8033.com:8033/master/config-dev.yml
uri: http://localhost:8033 #配置中心地址
#服務註冊到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
編寫啓動類
package com.java.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author Woo_home
* @create 2020/3/30 13:26
*/
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain8055 {
public static void main(String[] args){
SpringApplication.run(ConfigClientMain8055.class,args);
}
}
編寫 Controller
package com.java.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Woo_home
* @create 2020/3/30 13:27
*/
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
測試訪問
先訪問 http://eureka7001.com:7001/,可以發現 配置中心 和 客戶端 都已成功註冊到 EurekaServer
訪問 http://config-8033.com:8033/master/config-dev.yml 配置中心也是 OK 的
訪問 http://localhost:8055/configInfo 客戶端也成功了
Config 客戶端動態刷新
爲了避免每次更新配置都要重啓客戶端微服務 8055
動態刷新
修改 8055 模塊
在 8055 模塊的 POM 文件中引入 actuator
修改 8055 模塊的 bootstrap.yml 文件
在 bootstrap.yml 文件中新增以下配置
# 暴露監控端點
management:
endpoints:
web:
exposure:
include: "*"
修改 ConfigClientController
在 ConfigClientController 中增加一個 @RefreshScope 註解,實現自動刷新的功能
測試訪問
修改 Github 上的配置文件
訪問 http://config-8033.com:8033/master/config-dev.yml OK
使用 curl 工具去刷新一下 8055,這樣就不必重啓 8055 也可以獲取修改之後的內容
curl -X POST "http://localhost:8055/actuator/refresh"
訪問 http://localhost:8055/configInfo 發現獲取的也是修改後的內容
完整代碼已上傳至碼雲, 代碼地址