Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

配置中心介紹

首先咱們來看一下,微服務架構下關於配置文件的一些問題:javascript

  1. 配置文件相對分散。在一個微服務架構下,配置文件會隨着微服務的增多變的愈來愈多,並且分散在各個微服務中,很差統一配置和管理。
  2. 配置文件沒法區分環境。微服務項目可能會有多個環境,例如:測試環境、預發佈環境、生產環境。每個環境所使用的配置理論上都是不一樣的,一旦須要修改,就須要咱們去各個微服務下手動維護,這比較困難。
  3. 配置文件沒法實時更新。咱們修改了配置文件以後,必須從新啓動微服務才能使配置生效,這對一個正在運行的項目來講是很是不友好的。

基於上面這些問題,咱們就須要配置中心的加入來解決這些問題。java

配置中心的思路是

  • 首先把項目中各類配置所有都放到一個集中的地方進行統一管理,並提供一套標準的接口。·
  • 當各個服務須要獲取配置的時候,就來配置中心的接口拉取本身的配置。
  • 當配置中心中的各類參數有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態更新。

當加入了服務配置中心以後,咱們的系統架構圖會變成下面這樣mysql

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

在業界常見的服務配置中心,有下面這些:spring

Apollo

Apollo是由攜程開源的分佈式配置中心。特色有不少,好比:配置更新以後能夠實時生效,支持灰度發佈功能,而且能對全部的配置進行版本管理、操做審計等功能,提供開放平臺API。而且資料也寫的很詳細。sql

Disconf

Disconf是由百度開源的分佈式配置中心。它是基於Zookeeper來實現配置變動後實時通知和生效的。bootstrap

SpringCloud confifig

這是Spring Cloud中帶的配置中心組件。它和Spring是無縫集成,使用起來很是方便,而且它的配置存儲支持Git。不過它沒有可視化的操做界面,配置的生效也不是實時的,須要重啓或去刷新。架構

Nacos

這是SpingCloud alibaba技術棧中的一個組件,前面咱們已經使用它作過服務註冊中心。其實它也集成了服務配置的功能,咱們能夠直接使用它做爲服務配置中心。app

Nacos Confifig入門

使用nacos做爲配置中心,其實就是將nacos當作一個服務端,將各個微服務當作是客戶端,咱們將各個微服務的配置文件統一存放在nacos上,而後各個微服務從nacos上拉取配置便可。分佈式

接下來咱們以商品微服務爲例,學習nacos confifig的使用。ide

1. 搭建nacos環境【使用現有的nacos環境便可】

2. 微服務中引入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-product
cloud:
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)配置內容按照上面選定的格式書寫

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

5 註釋本地的application.yam中的內容, 啓動程序進行測試

若是依舊能夠成功訪問程序,說明咱們nacos的配置中心功能已經實現

Nacos Confifig深刻

配置動態刷新

在入門案例中,咱們實現了配置的遠程存放,可是此時若是修改了配置,咱們的程序是沒法讀取到的,

所以,咱們須要開啓配置的動態刷新功能。

在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配置存放商品微服務的公共配置

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

2 新建一個名爲service-product-test.yaml配置存放測試環境的配

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

3 新建一個名爲consumer-dev.yaml配置存放開發環境的配置

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

4 添加測試方法

@RestController
@RefreshScope
public class NacosConfigController {
@Value( "${config.env}" )
private String env;
/* 3 同一微服務的不一樣環境下共享配置 */
@GetMapping( "/nacos-config-test3" )
public String nacosConfingTest3()
{
return(env);
}
}

5 訪問測試

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

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 啓動商品微服務進行測試

nacos的幾個概念

命名空間(Namespace)

命名空間可用於進行不一樣環境的配置隔離。通常一個環境劃分到一個命名空間

配置分組(Group)

配置分組用於將不一樣的服務能夠歸類到同一分組。通常將一個項目的配置分到一組

配置集(Data ID)

在系統中,一個配置文件一般就是一個配置集。通常微服務的配置就是一個配置集

Spring cloud Alibaba超詳細學習筆記--深刻底層剖析Nacos Config

好了,今天就先分享到這裏,看完記得轉發+關注哦~

相關文章
相關標籤/搜索