今天咱們接着 上一篇 第八章 SMS–短信服務
繼續寫 SpringCloud Alibaba全家桶 —> 第九章 Nacos Config–服務配置,廢話不多說,開干
9.1 服務配置中心介紹
首先我們來看一下,微服務架構下關於配置文件的一些問題:
- 配置文件相對分散。在一個微服務架構下,配置文件會隨着微服務的增多變的越來越多,而且分散在各個微服務中,不好統一配置和管理。
- 配置文件無法區分環境。微服務項目可能會有多個環境,例如:測試環境、預發布環境、生產環境。每一個環境所使用的配置理論上都是不同的,一旦需要修改,就需要我們去各個微服務下手動
維護,這比較困難。 - 配置文件無法實時更新。我們修改了配置文件之后,必須重新啟動微服務才能使配置生效,這對一
個正在運行的項目來說是非常不友好的。
基於上面這些問題,我們就需要配置中心的加入來解決這些問題。
配置中心的思路是:
- 首先把項目中各種配置全部都放到一個集中的地方進行統一管理,並提供一套標准的接口。
- 當各個服務需要獲取配置的時候,就來配置中心的接口拉取自己的配置。
- 當配置中心中的各種參數有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態更新。
當加入了服務配置中心之后,我們的系統架構圖會變成下面這樣:
在業界常見的服務配置中心,有下面這些:
Apollo
Apollo是由攜程開源的分布式配置中心。特點有很多,比如:配置更新之后可以實時生效,支持灰度發布功能,並且能對所有的配置進行版本管理、操作審計等功能,提供開放平台API。並且資料也寫的很詳細。
Disconf
Disconf是由百度開源的分布式配置中心。它是基於Zookeeper來實現配置變更后實時通知和生效的。
-
SpringCloud Config
這是Spring Cloud中帶的配置中心組件。它和Spring是無縫集成,使用起來非常方便,並且它的配置存儲支持Git。不過它沒有可視化的操作界面,配置的生效也不是實時的,需要重啟或去刷新。
-
Nacos
這是SpingCloud alibaba技術棧中的一個組件,前面我們已經使用它做過服務注冊中心。其實它也集成了服務配置的功能,我們可以直接使用它作為服務配置中心。
9.2 Nacos Config入門
使用nacos作為配置中心,其實就是將nacos當做一個服務端,將各個微服務看成是客戶端,我們將各個微服務的配置文件統一存放在nacos上,然后各個微服務從nacos上拉取配置即可。
接下來我們以商品微服務為例,學習nacos config的使用。
1 搭建nacos環境【使用現有的nacos環境即可(之前講過)】
2 在微服務中引入nacos的依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3 在微服務中添加nacos config的配置
注意:不能使用原來的application.yml作為配置文件,而是新建一個bootstrap.yml作為配置文件
配置文件優先級(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: localhost:8848 # nacos的服務端地址
file-extension: yaml # 配置文件格式
profiles:
active: dev
4 在nacos中添加配置
點擊配置列表,點擊右邊+號,新建配置。在新建配置過程中,要注意下面的細節:
1)Data ID不能隨便寫,要跟配置文件中的對應,對應關系如圖所示
2)配置文件格式要跟配置文件的格式對應,且目前僅僅支持YAML和Properties
3)配置內容按照上面選定的格式書寫
5 注釋本地的application.yam中的內容, 啟動程序進行測試
如果依舊可以成功訪問程序,說明我們nacos的配置中心功能已經實現
9.3 Nacos Config深入
9.3.1 配置動態刷新
在入門案例中,我們實現了配置的遠程存放,但是此時如果修改了配置,我們的程序是無法讀取到的,因此,我們需要開啟配置的動態刷新功能。
在nacos中的service-product-dev.yaml配置項中添加下面配置:
在nacos中的service-product-dev.yaml配置項中添加下面配置:
config:
appName: product
方式一: 硬編碼方式
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class NacosConfigController {
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/nacos-config")
public String nacosConfig() {
return applicationContext.getEnvironment().getProperty("config.appName");
}
}
方式二: 注解方式(推薦)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${config.name}")
public String appName;
@GetMapping("/nacos-config")
public String nacosConfig() {
return appName;
}
}
9.3.2 配置共享
當配置越來越多的時候,我們就發現有很多配置是重復的,這時候就考慮可不可以將公共配置文件提取出來,然后實現共享呢?當然是可以的。接下來我們就來探討如何實現這一功能。
同一個微服務的不同環境之間共享配置
如果想在同一個微服務的不同環境之間實現配置共享,其實很簡單。
只需要提取一個以spring.application.name 命名的配置文件,然后將其所有環境的公共配置放在里面即可。
只需要提取一個以spring.application.name
命名的配置文件,然后將其所有環境的公共配置放在里面即可。
1 新建一個名為service-product.yaml配置存放商品微服務的公共配置
2 新建一個名為service-product-test.yaml配置存放測試環境的配置
3 新建一個名為consumer-dev.yaml配置存放開發環境的配置
4 添加測試方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class NacosConfigController {
@Value("${config.env}")
public String env;
@GetMapping("/nacos-config")
public String nacosConfig() {
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: localhost:8848 # nacos的服務端地址
file-extension: yaml # 配置文件格式
shared-dataids: all-service.yaml # 配置要引入的配置
refreshable-dataids: all-service.yaml # 配置要實現動態配置刷新的配置
profiles:
active: dev # 環境標識
4 啟動商品微服務進行測試
9.4 nacos的幾個概念
命名空間(Namespace)
命名空間可用於進行不同環境的配置隔離。一般一個環境划分到一個命名空間
配置分組(Group)
配置分組用於將不同的服務可以歸類到同一分組。一般將一個項目的配置分到一組
配置集(Data ID)
在系統中,一個配置文件通常就是一個配置集。一般微服務的配置就是一個配置集
最近休息了幾天,明天繼續搞第十章 ,謝謝大家能看到這