配置中心介紹
首先我們來看一下,微服務架構下關於配置檔案的一些問題:
配置檔案相對分散。在一個微服務架構下,配置檔案會隨著微服務的增多變的越來越多,而且分散在各個微服務中,不好統一配置和管理。配置檔案無法區分環境。微服務專案可能會有多個環境,例如:測試環境、預釋出環境、生產環境。每一個環境所使用的配置理論上都是不同的,一旦需要修改,就需要我們去各個微服務下手動維護,這比較困難。配置檔案無法實時更新。我們修改了配置檔案之後,必須重新啟動微服務才能使配置生效,這對一個正在執行的專案來說是非常不友好的。基於上面這些問題,我們就需要配置中心的加入來解決這些問題。
配置中心的思路是:
首先把專案中各種配置全部都放到一個集中的地方進行統一管理,並提供一套標準的介面。·當各個服務需要獲取配置的時候,就來配置中心的介面拉取自己的配置。當配置中心中的各種引數有更新的時候,也能通知到各個服務實時的過來同步最新的資訊,使之動態更新。當加入了服務配置中心之後,我們的系統架構圖會變成下面這樣
在業界常見的服務配置中心,有下面這些:
Apollo
Apollo是由攜程開源的分散式配置中心。特點有很多,比如:配置更新之後可以實時生效,支援灰度釋出功能,並且能對所有的配置進行版本管理、操作審計等功能,提供開放平臺API。並且資料也寫的很詳細。
Disconf
Disconf是由百度開源的分散式配置中心。它是基於Zookeeper來實現配置變更後實時通知和生效的。
SpringCloud confifig
這是Spring Cloud中帶的配置中心元件。它和Spring是無縫整合,使用起來非常方便,並且它的配置儲存支援Git。不過它沒有視覺化的操作介面,配置的生效也不是實時的,需要重啟或去重新整理。
Nacos
這是SpingCloud alibaba技術棧中的一個元件,前面我們已經使用它做過服務註冊中心。其實它也集成了服務配置的功能,我們可以直接使用它作為服務配置中心。
Nacos Confifig入門使用nacos作為配置中心,其實就是將nacos當做一個服務端,將各個微服務看成是客戶端,我們將各個微服務的配置檔案統一存放在nacos上,然後各個微服務從nacos上拉取配置即可。
接下來我們以商品微服務為例,學習nacos confifig的使用。
搭建nacos環境【使用現有的nacos環境即可】微服務中引入nacos的依賴<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
3 在微服務中新增nacos confifififig的配置
注意:不能使用原來的application.yml作為配置檔案,而是新建一個bootstrap.yml作為配置檔案
配置檔案優先順序(由高到低):
bootstrap.properties-> bootstrap.yml -> application.properties -> application.yml
spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml # 配置檔案格式profiles:active: dev # 環境標識
4 在nacos中新增配置
1) Data lD不能隨便寫,要跟配置檔案中的對應,對應關係如圖所示
2)配置檔案格式要跟配置檔案的格式對應,且目前僅僅支援YAML和Properties
3)配置內容按照上面選定的格式書寫
5 註釋本地的application.yam中的內容, 啟動程式進行測試
如果依舊可以成功訪問程式,說明我們nacos的配置中心功能已經實現
Nacos Confifig深入配置動態重新整理
在入門案例中,我們實現了配置的遠端存放,但是此時如果修改了配置,我們的程式是無法讀取到的,
因此,我們需要開啟配置的動態重新整理功能。
在nacos中的service-product-dev.yaml配置項中新增下面配置:
config:appName: product
方式一:硬編碼方式
@RestControllerpublic class NacosConfigController {@Autowiredprivate 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@RefreshScopepublic 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.Driverurl: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: rootjpa:properties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5InnoDBDialectcloud:nacos:discovery:server-addr: 127.0.0.1:8848
2 在nacos的中修改service-product.yaml中為下面內容
server:port: 8081config:appName: product
3 修改bootstrap.yaml
spring:application:name: service-productcloud: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 # 環境標識
4 啟動商品微服務進行測試
nacos的幾個概念名稱空間(Namespace)
名稱空間可用於進行不同環境的配置隔離。一般一個環境劃分到一個名稱空間
配置分組(Group)
配置分組用於將不同的服務可以歸類到同一分組。一般將一個專案的配置分到一組
配置集(Data ID)
在系統中,一個配置檔案通常就是一個配置集。一般微服務的配置就是一個配置集