首先咱們來看一下,微服務架構下關於配置文件的一些問題:javascript
基於上面這些問題,咱們就須要配置中心的加入來解決這些問題。java
當加入了服務配置中心以後,咱們的系統架構圖會變成下面這樣mysql
在業界常見的服務配置中心,有下面這些:spring
Apollo是由攜程開源的分佈式配置中心。特色有不少,好比:配置更新以後能夠實時生效,支持灰度發佈功能,而且能對全部的配置進行版本管理、操做審計等功能,提供開放平臺API。而且資料也寫的很詳細。sql
Disconf是由百度開源的分佈式配置中心。它是基於Zookeeper來實現配置變動後實時通知和生效的。bootstrap
這是Spring Cloud中帶的配置中心組件。它和Spring是無縫集成,使用起來很是方便,而且它的配置存儲支持Git。不過它沒有可視化的操做界面,配置的生效也不是實時的,須要重啓或去刷新。架構
這是SpingCloud alibaba技術棧中的一個組件,前面咱們已經使用它作過服務註冊中心。其實它也集成了服務配置的功能,咱們能夠直接使用它做爲服務配置中心。app
使用nacos做爲配置中心,其實就是將nacos當作一個服務端,將各個微服務當作是客戶端,咱們將各個微服務的配置文件統一存放在nacos上,而後各個微服務從nacos上拉取配置便可。分佈式
接下來咱們以商品微服務爲例,學習nacos confifig的使用。ide
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
注意:不能使用原來的application.yml做爲配置文件,而是新建一個bootstrap.yml做爲配置文件
配置文件優先級(由高到低):
bootstrap.properties-> bootstrap.yml -> application.properties -> application.yml
spring: application: name: service-product cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos中心地址 file-extension: yaml # 配置文件格式 profiles: active: dev # 環境標識
點擊配置列表,點擊右邊+號,新建配置。在新建配置過程當中,要注意下面的細節:
1) Data lD不能隨便寫,要跟配置文件中的對應,對應關係如圖所示
2)配置文件格式要跟配置文件的格式對應,且目前僅僅支持YAML和Properties
3)配置內容按照上面選定的格式書寫
若是依舊能夠成功訪問程序,說明咱們nacos的配置中心功能已經實現
在入門案例中,咱們實現了配置的遠程存放,可是此時若是修改了配置,咱們的程序是沒法讀取到的,
所以,咱們須要開啓配置的動態刷新功能。
在nacos中的service-product-dev.yaml配置項中添加下面配置:
config: appName: product
@RestController public class NacosConfigController { @Autowired private ConfigurableApplicationContext applicationContext; @GetMapping( "/nacos-config-test1" ) public String nacosConfingTest1() { return (applicationContext.getEnvironment().getProperty( "config.appName" ) ); } }
@RestController @RefreshScope /* 只須要在須要動態讀取配置的類上添加此註解就能夠 */ public class NacosConfigController { @Value( "${config.appName}" ) private String appName; /* 2 註解方式 */ @GetMapping( "/nacos-config-test2" ) public String nacosConfingTest2() { return(appName); } }
當配置愈來愈多的時候,咱們就發現有不少配置是重複的,這時候就考慮可不能夠將公共配置文件提取
出來,而後實現共享呢?固然是能夠的。接下來咱們就來探討如何實現這一功能。
同一個微服務的不一樣環境之間共享配置
若是想在同一個微服務的不一樣環境之間實現配置共享,其實很簡單。只須要提取一個以
spring.application.name 命名的配置文件,而後將其全部環境的公共配置放在裏面便可。
1 新建一個名爲service-product.yaml配置存放商品微服務的公共配置
2 新建一個名爲service-product-test.yaml配置存放測試環境的配
3 新建一個名爲consumer-dev.yaml配置存放開發環境的配置
4 添加測試方法
@RestController @RefreshScope public class NacosConfigController { @Value( "${config.env}" ) private String env; /* 3 同一微服務的不一樣環境下共享配置 */ @GetMapping( "/nacos-config-test3" ) public String nacosConfingTest3() { return(env); } }
5 訪問測試
6 接下來,修改bootstrap.yml中的配置,將active設置成test,再次訪問,觀察結果
spring: profiles: active: test # 環境標識
不一樣爲服務之間實現配置共享的原理相似於文件引入,就是定義一個公共配置,而後在當前配置中引入。
1 在nacos中定義一個DataID爲all-service.yaml的配置,用於全部微服務共享
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:///shop? serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: root jpa: properties: hibernate: hbm2ddl: auto: update dialect: org.hibernate.dialect.MySQL5InnoDBDialect cloud: nacos: discovery: server-addr: 127.0.0.1:8848
2 在nacos的中修改service-product.yaml中爲下面內容
server: port: 8081 config: appName: product
3 修改bootstrap.yaml
spring: application: name: service-product cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos中心地址 file-extension: yaml # 配置文件格式 shared-dataids: all-service.yaml # 配置要引入的配置 refreshable-dataids: all-service.yaml # 配置要實現動態配置刷新的配置 profiles: active: dev # 環境標識 關注公衆號:麒麟改bug,獲取一份阿里資深架構師整理的spring176頁的學習筆記。
4 啓動商品微服務進行測試
命名空間(Namespace)
命名空間可用於進行不一樣環境的配置隔離。通常一個環境劃分到一個命名空間
配置分組(Group)
配置分組用於將不一樣的服務能夠歸類到同一分組。通常將一個項目的配置分到一組
配置集(Data ID)
在系統中,一個配置文件一般就是一個配置集。通常微服務的配置就是一個配置集
好了,今天就先分享到這裏,看完記得轉發+關注哦~