目錄
1.Nacos定位
2.Nacos的安裝配置
3.整合Nacos
3.1.Nacos安裝
3.2.Nacos登錄
3.3.配置Nacos? ? ?
4.Nacos使用
4.1.引入 Maven 依賴
4.2.配置bootstrap.yml
4.3.Nacos配置類
4.4.啟用Nacos服務
4.5.測試獲取配置
5.加載多個配置文件
datasource-dev.yaml
mybatis-plus-dev.yaml
本地文件bootstrap.yml
Contro代碼
測試結(jié)果
總結(jié)
6.異常處理
鳴謝
1.Nacos定位
微服務架構(gòu)下關于配置文件的一些問題:
????????配置文件相對分散。在一個微服務架構(gòu)下,配置文件會隨著微服務的增多變的越來越多,而且分散
在各個微服務中,不好統(tǒng)一配置和管理。
????????配置文件無法區(qū)分環(huán)境。微服務項目可能會有多個環(huán)境,例如:測試環(huán)境、預發(fā)布環(huán)境、生產(chǎn)環(huán)
境。每一個環(huán)境所使用的配置理論上都是不同的,一旦需要修改,就需要我們?nèi)ジ鱾€微服務下手動
維護,這比較困難。
????????配置文件無法實時更新。我們修改了配置文件之后,必須重新啟動微服務才能使配置生效,這對一
個正在運行的項目來說是非常不友好的。
基于上面這些問題,我們就需要配置中心的加入來解決這些問題。
配置中心的思路是:
- 首先把項目中各種配置全部都放到一個集中的地方進行統(tǒng)一管理,并提供一套標準的接口。
- 當各個服務需要獲取配置的時候,就來配置中心的接口拉取自己的配置。
- 當配置中心中的各種參數(shù)有更新的時候,也能通知到各個服務實時的過來同步最新的信息,使之動態(tài)更新。
總結(jié):
????????服務管理平臺:服務注冊、配置和路由
????????配置管理:統(tǒng)一的配置管理
2.Nacos的安裝配置
Nacos的學習資源主要有以下兩個
????????Nacos官網(wǎng):?Nacos官網(wǎng)
????????Nacos GitHub:?NacosGitHub
????????快速下載 nacos 的地址 :快速下載地址
3.整合Nacos
本項目使用版本一覽,測試兩個版本都ok
Spring Boot | Spring Cloud | Spring Cloud Alibaba | Nocos | JDK |
---|---|---|---|---|
2.7.7 | 2021.0.5 | 2021.0.5.0 | 2.2.9.RELEASE | 1.8 |
2.3.12.RELEASE |
2.2.9.RELEASE |
1.8 |
注意:SpringBoot3.0開始不支持jdk8
3.1.Nacos安裝
參考博客:Nacos安裝(二)
3.2.Nacos登錄
單機模式啟動Nocos服務后,訪問登錄
地址:http://127.0.0.1:8848
用戶名/密碼:nacos/nocos
3.3.配置Nacos? ? ?
1)配置中心簡介
-
命名空間Namespace:用來區(qū)分環(huán)境
- 開發(fā)(dev)、測試(test)、生產(chǎn)(prod):利用命名空間來做環(huán)境隔離
-
Data ID: 用來區(qū)分配置,可以理解成對應我們的一個微服務
- 例如:數(shù)據(jù)空配置,redis配置,kafka配置。
- 命名規(guī)則:application.name + profiles.active + file-extension。
- 如果bootstrap.yml文件中沒有配置profiles.active + file-extension,我們只需要用服務名命名即可。
- Group:用來區(qū)分不同的應用,默認DEFAULT_GROUP,如果在bootstrap.yml配置了profiles.active,這里填寫profiles.active的值即可。
- 配置格式:和項目對應
2)創(chuàng)建命名空間
如果想指定不同開發(fā)環(huán)境配置,如開發(fā)環(huán)境,測試環(huán)境等,我們就需要配置我們剛剛在上面講的namespace。創(chuàng)建命名空間如下圖所示:
命名空間ID:測試環(huán)境、生產(chǎn)環(huán)境
描述:對環(huán)境的描述
?創(chuàng)建命名空間后,我們就可以在配置列表中看到我們創(chuàng)建的命名空間
3)創(chuàng)建配置文件
選擇對應的命名空間,點擊右邊加號創(chuàng)建配置文件?
dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}?
prefix:默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置
spring.profiles.active:即為當前環(huán)境對應的 profile。 注意:當 spring.profiles.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變
file-exetension:為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。
比如說我們現(xiàn)在要獲取應用名稱為
nacos-config-client
的應用在dev
環(huán)境下的yaml
配置,dataid如下:nacos-config-client-dev.yaml
4.Nacos使用
????????使用nacos作為配置中心,Nacos讀取的是bootstrap.yml,而我們項目中的配置文件名稱是application.properties/application.yml,所以我們要修改我們項目中的配置文件名為bootstrap.yml。
4.1.引入 Maven 依賴
首先,我們還是要引入 Maven 依賴,在maven倉庫使用最新版本:
Maven Repository: nacos
<!--注冊中心的依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!-- 配置中心的依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
注意:注冊中心和配置中心的依賴版本要根據(jù) SpringBoot 版本來選擇。
具體版本對應關系;版本說明 · alibaba/spring-cloud-alibaba Wiki (github.com)?
4.2.配置bootstrap.yml
在微服務resources中創(chuàng)建bootstrap.yml文件,添加如下nacos配置信息:
spring:
application:
name: nacos-test
profiles:
#指定啟動環(huán)境
active: dev
cloud:
nacos:
discovery:
# Nacos服務注冊中心地址
server-addr: 127.0.0.1:8848
# 分組,不同分組之間不能調(diào)用,用于微服務之間的隔離
group: DEFAULT_GROUP
# 生產(chǎn)環(huán)境
namespace: 534c904d-7f24-4086-acbd-daf628cb1446
config:
# 是否開啟配置中心 默認true
enabled: true
# 指定Nacos配置中心的地址
server-addr: 127.0.0.1:8848
# 區(qū)分環(huán)境:開發(fā)環(huán)境、測試環(huán)境、預發(fā)布環(huán)境、?產(chǎn)環(huán)境
namespace: 91d34e57-55b0-4182-b881-ab0b5aefabe9
# 區(qū)分不同應?:同?個環(huán)境內(nèi),不同應?的配置,通過group來區(qū)分。
group: ${spring.profiles.active}
#指定yaml格式的配置 默認properties
file-extension: yaml
# 自動刷新配置文件,默認true
refresh-enabled: true
# Nacos 認證用戶
username: nacos
# Nacos 認證密碼
password: nacos
# 配置文件prefix
prefix: ${spring.application.name}
4.3.Nacos配置類
????????增加一個 Nacos 的配置文件,通過這個類可以拉取nacos中配置:
import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import lombok.Data;
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.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @program: NacosConfig
* @description: NacosConfig
* @author: dyt
* @create: 2022-07-29 16:39
**/
// 刷新配置
@RefreshScope
@Data
@Component
public class NacosConfig {
@Value("${server.port}")
private Integer serverPort;
@Value("${spring.application.name}")
private String applicationName;
// @NacosInjected
// private NamingService namingService;
@Autowired
NacosConfigProperties nacosConfigProperties;
@Autowired
NacosDiscoveryProperties nacosDiscoveryProperties;
/**
* 通過Naming服務注冊實例到注冊中心
*
* @throws NacosException
*/
@PostConstruct
public void registerInstance() throws NacosException {
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
}
}
- @NacosValue注解是Spring Cloud Alibaba Nacos提供的注解,用于獲取Nacos配置中心的配置值。它可以自動監(jiān)聽配置變化并動態(tài)更新
@Value注解是Spring框架提供的注解,用于獲取配置文件中的值,可以用于獲取任意配置文件(如application.properties、application.yml)中的配置項。使用@Value注解時,需要指定配置項的完整路徑,例如:@Value("${config.key}")。
我這里NamingService 始終報空指針異常,只能自己初始化
?4.4.啟用Nacos服務
????????在Spring Boot的啟動類上添加@EnableDiscoveryClient注解,啟用Nacos的服務注冊和發(fā)現(xiàn)功能。
//啟用Nacos作為服務發(fā)現(xiàn)的功能
@EnableDiscoveryClient
//引入了spring-cloud-starter-alibaba-nacos-discovery依賴時,默認情況下會自動啟用Nacos的服務注冊和發(fā)現(xiàn)功能
@SpringBootApplication
public class NacosTestApplication {
public static void main(String[] args) {
SpringApplication.run(NacosTestApplication.class, args);
}
}
- 如果想要配置項的值自動刷新,僅在?
@NacosPropertySource
?加?autoRefreshed = true
?是不夠的,在?@NacosValue
?上面也得加?autoRefreshed = true
- ?@EnableDiscoveryClient 注解,開啟 Spring Cloud 的注冊發(fā)現(xiàn)功能。不過從 Spring Cloud Edgware 版本開始,實際上已經(jīng)不需要添加
@EnableDiscoveryClient
注解,只需要引入 Spring Cloud 注冊發(fā)現(xiàn)組件,就會自動開啟注冊發(fā)現(xiàn)的功能。例如說,我們這里已經(jīng)引入了spring-cloud-starter-alibaba-nacos-discovery
依賴,就不用再添加@EnableDiscoveryClient
注解了
4.5.測試獲取配置
最后我們寫一個模擬獲取配置參數(shù)的 Controller 類??
import com.dyt.nacos.config.NacosConfig;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/nacos")
public class NacosController {
@Resource
private NacosConfig nacosConfig;
/**
* 獲取配置中心配置
* @return
*/
@RequestMapping("/getConfig")
public String getConfig(){
return nacosConfig.getMaxThreads()+nacosConfig.getCommon()+nacosConfig.getTest();
}
}
5.加載多個配置文件
-
Nacos在配置路徑
spring.cloud.nacos.config.extension-config
下,允許我們指定?個或多個額外配置。 -
Nacos在配置路徑
spring.cloud.nacos.config.shared-configs
下,允許我們指定?個或多個共享配置。 - 上述兩類配置都?持三個屬性:
data-id
、group
(默認為字符串DEFAULT_GROUP
)、refresh
(默認為true
)。
datasource-dev.yaml
#mysql和阿里druid配置
spring:
datasource:
dynamic:
primary: oracle-db #設置默認的數(shù)據(jù)源或者數(shù)據(jù)源組
datasource:
oracle-db:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@192.168.5.100:1521:kylwspwh
username: root
password: MsI1#11OI1#1sW
mysql-adb:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.5.22:3306/ordercenter?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: dzkp
password: H2!b1t#ub1_1n
mybatis-plus-dev.yaml
# mybatis-plus相關配置
mybatis-plus:
configuration:
#開啟sql日志
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 是否開啟自動駝峰命名規(guī)則映射:從數(shù)據(jù)庫列名到Java屬性駝峰命名的類似映射
map-underscore-to-camel-case: true
# 解決oracle更新數(shù)據(jù)為null時無法轉(zhuǎn)換報錯,mysql不會出現(xiàn)此情況
jdbc-type-for-null: 'null'
#實體類所在包
type-aliases-package: com.batchUtil.model,com.batchUtil.bxp.model
# xml掃描,多個目錄用逗號或者分號分隔(告訴 Mapper 所對應的 XML 文件位置)
mapper-locations: classpath:mapper/*.xml
本地文件bootstrap.yml
application.yml作用域在于當前應用有效,bootstrap.yml系統(tǒng)級別的配置有效(一般采用遠程配置的時候才會用到)。
因此,將項目中原來的application.yml、application-dev.yml對應改成bootstrap.yml、bootstrap-dev.yml 。
?在應用程序的bootstrap.yml里的config節(jié)點下增加配置 extension-configs,表明額外配置文件:
spring:
application:
name: nacos-test
profiles:
#指定啟動環(huán)境
active: dev
cloud:
nacos:
discovery:
# Nacos服務注冊中心地址
server-addr: 127.0.0.1:8848
# 分組,不同分組之間不能調(diào)用,用于微服務之間的隔離
group: ${spring.profiles.active}
# 生產(chǎn)環(huán)境
namespace: ${nacos.client.namespace}
config:
# 是否開啟配置中心 默認true
enabled: true
# 指定Nacos配置中心的地址
server-addr: 127.0.0.1:8848
# 區(qū)分環(huán)境:開發(fā)環(huán)境、測試環(huán)境、預發(fā)布環(huán)境、?產(chǎn)環(huán)境
namespace: 91d34e57-55b0-4182-b881-ab0b5aefabe9
# 區(qū)分不同應?:同?個環(huán)境內(nèi),不同應?的配置,通過group來區(qū)分。
group: ${spring.profiles.active}
# 配置文件的格式:指定yaml格式,配置 默認properties
file-extension: yaml
# 自動刷新配置文件,默認true
refresh-enabled: true
# Nacos 認證用戶
username: nacos
# Nacos 認證密碼
password: nacos
# 配置文件prefix
prefix: ${spring.application.name}
#共享配置文件:支持多個共享Data Id的配置,優(yōu)先級小于extension-configs,自定義 Data Id 配置 屬性是個集合,
# 內(nèi)部由 Config POJO 組成。Config 有 3 個屬性,分別是 dataId, group 以及 refresh
# 用于共享的配置文件
shared-configs:
- data-id: datasource-${spring.profiles.active}.yaml
group: ${spring.profiles.active}
refresh: true
# 擴展配置文件:支持多個擴展Data Id的配置,優(yōu)先級大于shared-configs,自定義 Data Id 配置 屬性是個集合,
- data-id: mybatis-plus-${spring.profiles.active}.yaml
group: ${spring.profiles.active}
refresh: true
# 常規(guī)配置文件
# 優(yōu)先級大于 shared-configs,在 shared-configs 之后加載
extension-configs:
- data-id: datasource-${spring.profiles.active}.yaml
group: ${spring.profiles.active}
refresh: true
- data-id: mybatis-plus-${spring.profiles.active}.yaml
group: ${spring.profiles.active}
refresh: true
Contro代碼
import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import lombok.Data;
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.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @program: NacosConfig
* @description: NacosConfig
* @author: dyt
* @create: 2022-07-29 16:39
**/
// 刷新配置
@RefreshScope
@Data
@Component
public class NacosConfig {
@Value("${server.port}")
private Integer serverPort;
@Value("${spring.application.name}")
private String applicationName;
/*
@NacosInjected
private NamingService namingService;*/
@Value("${spring.datasource.dynamic.primary}")
private String primary;
@Autowired
NacosConfigProperties nacosConfigProperties;
@Autowired
NacosDiscoveryProperties nacosDiscoveryProperties;
/**
* 通過Naming服務注冊實例到注冊中心
*
* @throws NacosException
*/
@PostConstruct
public void registerInstance() throws NacosException {
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
}
}
import com.dyt.nacos.config.NacosConfig;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/nacos")
public class NacosController {
@Resource
private NacosConfig nacosConfig;
/**
* 獲取配置中心默認數(shù)據(jù)源名稱
*
* @return
*/
@RequestMapping("/primary")
public String getPrimary(){
return nacosConfig.getPrimary();
}
}
測試結(jié)果
總結(jié)
關于優(yōu)先級
1)對同種配置,排在后?的相同配置,將覆蓋排在前?的同名配置。
2)不同種類配置之間,優(yōu)先級按順序如下:主配置 > 擴展配置(extension-configs) > 共享配置(shared-configs)
上面的demo已經(jīng)演示Nacos共享配置的兩種實現(xiàn)方式,兩種方式針對不同的場景,總結(jié)如下:
shared-dataids方式:
????????適合于共享配置文件與項目默認配置文件處于相同Group時,直接兩條命令就可以搞定
優(yōu)點:配置方便
缺點:只能在同一Group中
ext-config方式:
????????它可以由開發(fā)者自定義要讀取的共享配置文件的DataId、Group、refresh屬性,這樣剛好解決了shared-dataids存在的局限性。
優(yōu)點:可以與shared-dataids方案結(jié)合使用,用戶自定義配置。靈活性強
缺點:配置容易出錯,要熟悉YAML語法
6.異常處理
搭建過程中遇到控制針異常,NamingService使用初始化為null,只能尋求其他方式
1)空指針:通過Naming服務注冊實例到注冊中心NamingService
// 刷新配置
@RefreshScope
@Data
@Component
public class NacosConfig {
@Value("${server.port}")
private Integer serverPort;
@Value("${spring.application.name}")
private String applicationName;
@Autowired
NacosConfigProperties nacosConfigProperties;
@Autowired
NacosDiscoveryProperties nacosDiscoveryProperties;
/**
* 通過Naming服務注冊實例到注冊中心
*
* @throws NacosException
*/
@PostConstruct
public void registerInstance() throws NacosException {
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
}
}
鳴謝
[1].https://blog.csdn.net/weixin_63719049/article/details/128263045
[2].https://www.jianshu.com/p/8715072d3f4c
[3].https://www.jianshu.com/p/df87a308edff
[4].https://juejin.cn/post/6953045578095788068
[5].https://juejin.cn/post/7152438783269421093
[6].https://blog.csdn.net/qq_33619378/article/details/98972790
[7].https://blog.csdn.net/ysj1241267542/article/details/112562611
[8].https://blog.csdn.net/z69183787/article/details/109467120文章來源:http://www.zghlxwxcb.cn/news/detail-701136.html
[9].https://blog.csdn.net/weixin_42329623/article/details/131018680文章來源地址http://www.zghlxwxcb.cn/news/detail-701136.html
到了這里,關于SpringBoot整合Nacos實現(xiàn)配置中心的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!