對於傳統的單體應用而言,常使用配置文件來管理全部配置,好比SpringBoot的application.yml文件,可是在微服務架構中所有手動修改的話很麻煩並且不易維護。
微服務的配置管理通常有如下需求:
1.集中配置管理,一個微服務架構中可能有成百上千個微服務,因此集中配置管理是很重要的。
2.不一樣環境不一樣配置,好比數據源配置在不一樣環境(開發,生產,測試)中是不一樣的。
3.運行期間可動態調整。
4.配置修改後可自動更新。
好在Spring Cloud Config已經所有實現了上面幾點。html
Spring Cloud Config爲分佈式系統外部化配置提供了服務器端和客戶端的支持,它包括Config Client 和 Config Server兩個部分。原理是全部的配置信息都存儲在Config Server,全部的微服務都指向Config Server,
各個微服務啓動時都會請求Config Server來獲取配置信息,而後緩存到本地以提升性能。java
1.在Git倉庫https://github.com/2YSP/spring-cloud-config-repo(可使用本身的倉庫)新建幾個配置文件,例如:
內容分別爲:
profile=dev-1.0
profile=production-1.0
profile=test-1.0
profile=default-1.0
2.新建一個SpringBoot項目microservice-config-server,並添加如下依賴git
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
3.在啓動類添加 @EnableConfigServer註解
4.編寫application.yml文件github
server:
port: 8080
spring:
application:
name: microservice-config-server
cloud:
config:
server:
git:
# 配置Git倉庫的地址
uri: https://github.com/2YSP/spring-cloud-config-repo.git
# 配置Git倉庫的用戶名
username: 2YSP
# 配置Git倉庫的密碼
password: XX
這樣就完成了,可使用端點來獲取配置文件,端點與配置文件的映射規則以下:
/{application}/{profile}[/{lable}]
/{application}-{profile}.yml
/{lable}/{application}-{profile}.yml
/{application}-{profile}.properties
/{lable}/{application}-{profile}.properties
{application}表示微服務的名稱,{profile}表明環境,{lable}表示Git倉庫的分支,默認是master。
本例若是要訪問microservice-foo-dev.properties,則能夠訪問這些URL:
http://localhost:8080/microservice-foo/dev
http://localhost:8080/microservice-foo-dev.properties
http://localhost:8080/microservice-foo-dev.ymlweb
1.建立一個SpringBoot工程,ArtifactId爲microservice-config-client,並添加如下依賴spring
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.編寫配置文件application.ymlbootstrap
server:
port: 8081
3.建立配置文件bootstrap.yml,並添加如下內容。緩存
spring:
application:
# 對應Config Server所獲取的配置文件的{application}
name: microservice-foo
cloud:
config:
uri: http://localhost:8080/
#對應config server所獲取配置文件的{profile}
profile: dev
# 指定Git倉庫的分支,對應config server所獲取配置文件的{label}
label: master
須要注意的是,以上屬性應配置在bootstrap.yml而不是application.yml文件中,不然部分配置就不能正常工做。
4.編寫Controller服務器
@RestController
public class ConfigClientController {
@Value("${profile}")
private String profile;
@GetMapping("/profile")
public String hello(){
return this.profile;
}
}
這裏經過註解 @Value("${profile}") 來綁定Git倉庫的profile屬性。
5.測試
先啓動microservice-config-server,再啓動microservice-config-client,訪問http://localhost:8081/profile便可得到如下結果。
dev-1.0
說明可以正常的獲取Git倉庫的配置信息。架構
1.複製項目microservice-config-client更改成microservice-config-client-refresh
2.爲項目添加spring-boot-starter-actuator依賴,若是有了就不添加了。
3.在Controller類上添加@RefreshScope註解
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${profile}")
private String profile;
@GetMapping("/profile")
public String hello(){
return this.profile;
}
}
4.修改Git倉庫中microservice-foo-dev.properties文件的內容,而後先發送POST請求到http://localhost:8081/refresh,再訪問http://localhost:8081/refresh便可獲取最新的配置。
1.首先安裝RabbitMQ,安裝步驟這裏不介紹個人博客裏有。
2.爲項目添加如下依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
3.在bootstrap.yml中添加如下內容
spring:
application:
# 對應Config Server所獲取的配置文件的{application}
name: microservice-foo
cloud:
config:
uri: http://localhost:8080/
#對應config server所獲取配置文件的{profile}
profile: dev
# 指定Git倉庫的分支,對應config server所獲取配置文件的{label}
label: master
rabbitmq:
host: localhost
port: 5672 #默認端口 5672
username: guest
password: guest