0.前置
在本章節前,還有一小節,是關於SpringCloudAlibaba的簡單介紹,這裡不再記錄相關筆記。直接給出和課程一致的SCAlibaba2022.x的文件地址,GItHub上已經提醒,移到了aliyun的子域名下。
1.Nacos在微服務體系中的定位
和SpringCloud中的Consul相同的。
2.Nacos簡介
2.1 Nacos名字的由來
Nacos:Dynamic Na
ming and Co
nfiguration S
ervice
見面知意,該元件用來,做服務註冊中心和配置中心。
2.2 是什麼
官網介紹:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
一句話:Nacos就是註冊中心 + 配置中心的組合。
Nacos = Eureka + Config + Bus
Nacos = Spring Cloud Consul
2.3 能幹嗎
替代Eureka/Consul做服務註冊中心。
替代(Config/Bus)/Consul做服務配置中心和滿足動態重新整理廣播通知。
2.4 下載
https://nacos.io/
2.5 各種註冊中心比較
服務註冊發現元件 | CAP模型 | 控制檯管理 | 社群活躍度 |
---|---|---|---|
Eureka | AP | 支援 | 低(2.x版本閉源) |
Zookeeper | CP | 不支援 | 中 |
Consul | CP | 支援 | 高 |
Nacos | AP | 支援 | 高 |
據說 Nacos 在阿里巴巴內部有超過 10 萬的例項執行,已經過了類似雙十一等各種大型流量的考驗,Nacos預設是AP模式,但也可以調整切換為CP,我們一般用預設AP即可。
3.Nacos下載安裝
3.1 下載
官網,或GitHub下載略。
3.2 執行
解壓下載的安裝包,執行bin目錄下的startup.cmd
startup.cmd -m standalone
3.3 訪問控制檯
http://localhost:8848/nacos
預設密碼是Nacos和Nacos
4.Nacos Discovery服務註冊中心
4.1 概述
https://nacos.io/docs/latest/ecology/use-nacos-with-spring-cloud/
4.2 基於Nacos的服務提供者
4.2.1 新建Moudle
略
4.2.2 POM
<dependencies>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定義的api通用包 -->
<dependency>
<groupId>com.atguigu.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--SpringBoot通用依賴模組-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
4.2.3 YML
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
4.2.4 主啟動
@SpringBootApplication
@EnableDiscoveryClient
public class Main9001 {
public static void main(String[] args) {
SpringApplication.run(Main9001.class, args);
}
}
4.2.5 業務類
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PayAlibabaController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/pay/nacos/{id}")
public String getPayInfo(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
4.2.6 啟動測試
4.3 基於Nacos的服務消費者
4.3.1 建Module
略
4.3.2 POM
<dependencies>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
4.3.3 YML
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消費者將要去訪問的微服務名稱(nacos微服務提供者叫什麼你寫什麼)
service-url:
nacos-user-service: http://nacos-payment-provider
4.3.4 主啟動
@EnableDiscoveryClient
@SpringBootApplication
public class Main83 {
public static void main(String[] args) {
SpringApplication.run(Main83.class, args);
}
}
4.3.5 業務類
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig
{
@Bean
@LoadBalanced //賦予RestTemplate負載均衡的能力
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
@RestController
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("/consumer/pay/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id)
{
String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);
return result+"\t"+" 我是OrderNacosController83呼叫者。。。。。。";
}
}
4.3.6 啟動測試
略
4.3.7 演示負載均衡
1.安裝9001新建9002
2.複製服務,虛擬埠對映
點選9001服務,Copy Configuration,之後配置名字,在配置虛擬機器引數-DServer.port=9002,儲存,就會看到服務列表裡,有新的服務,啟動即可。
5.Nacos Config服務配置中心
5.1 概述
Consul8500服務配置動態變更功能可以被Nacos取代。
5.2 官網文件
https://nacos.io/docs/latest/ecology/use-nacos-with-spring-boot/
5.3 Nacos作為配置中心配置步驟
5.3.1 建module
略
5.3.2 POM
新增
<!--bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
5.3.3 YML
YML有兩個bootstrap和application
Nacos同Consul一樣,在專案初始化時,要保證先從配置中心進行配置拉取,拉取配置之後,才能保證專案的正常啟動,為了滿足動態重新整理和全域性廣播通知
springboot中配置檔案的載入是存在優先順序順序的,bootstrap優先順序高於application
。
bootstrap.yml
# nacos配置
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務註冊中心地址
config:
server-addr: localhost:8848 #Nacos作為配置中心地址
file-extension: yaml #指定yaml格式的配置
# nacos端配置檔案DataId的命名規則是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml
application.yml
server:
port: 3377
spring:
profiles:
active: dev # 表示開發環境
#active: prod # 表示生產環境
#active: test # 表示測試環境
5.3.4主啟動
@SpringBootApplication
@EnableDiscoveryClient
public class Main3377 {
public static void main(String[] args) {
SpringApplication.run(Main3377.class, args);
}
}
5.3.5 業務類
@RestController
@RefreshScope //在控制器類加入@RefreshScope註解使當前類下的配置支援Nacos的動態重新整理功能。
public class NacosConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
5.4 在Nacos中新增配置資訊
5.4.1 Nacos中的匹配規則
DataId理論
: 見https://nacos.io/docs/latest/ecology/use-nacos-with-spring-cloud/
最後公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
DataId實操
:預設為服務名-環境.副檔名。例一個x.name為aa,x.active為dev,x.file-extension為yaml,則改專案的配置檔案為aa-dev.yaml
建立配置
5.5 測試
http://localhost:3377/config/info
結果:nacos-config-client-dev.yaml breeze version=1
5.6 動態重新整理
修改為version=2 釋出
結果:nacos-config-client-dev.yaml breeze version=2
5.7 歷史配置
Nacos會記錄配置檔案的歷史版本預設保留30天,還有一鍵回滾功能,回滾操作,會觸發配置更新。
6.Nacos資料模型值Namespace-Group-DataId
6.1 問題
問題1:實際開發中,通常一個系統會準備dev開發環境、test測試環境、prod生產環境。如何保證指定環境啟動時服務能正確讀取到Nacos上相應環境的配置檔案呢?
問題2:一個大型分散式微服務系統會有很多微服務子專案,每個微服務專案又都會有相應的開發環境、測試環境、預發環境、正式環境......那怎麼對這些微服務配置進行分組和名稱空間管理呢?
6.2 Namespace + Group + DataId三者關係
Nacos資料模型Key由三元組唯一確定,NameSpace預設是空串,公共名稱空間(public),分組預設是DEFAULT_GROUP。
1 是什麼 | 類似Java裡面的package名和類名,最外層的Namespace是可以用於區分部署環境的,Group和DataID邏輯上區分兩個目標物件 |
2 預設值 | 預設情況:Namespace=public,Group=DEFAULT_GROUP。Nacos預設的名稱空間是public,Namespace主要用來實現隔離。比方說我們現在有三個環境:開發、測試、生產環境,我們就可以建立三個Namespace,不同的Namespace之間是隔離的。Group預設是DEFAULT_GROUP,Group可以把不同的微服務劃分到同一個分組裡面去 |
Service就是微服務 | 一個Service可以包含一個或者多個Cluster(叢集),Nacos預設Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬劃分。見下一節:服務領域模型-補充說明 |
6.3 Nacos的圖形化管理介面
6.3.1 名稱空間Namespace
6.3.2 配置管理
6.4 三種方案載入配置
6.4.1 DataId方案
指定spring.profiles.active和配置檔案的DataID來使不同環境下讀取不同的配置
6.4.2 透過Group實現環境區分
預設空間(public) + prod_group + 新建DataID
在bootstrap.yml下新增配置
# nacos配置
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務註冊中心地址
config:
server-addr: localhost:8848 #Nacos作為配置中心地址
file-extension: yaml #指定yaml格式的配置
group: prod_group #新增配置
application.yml
server:
port: 3377
spring:
profiles:
active: prod # 表示開發環境
6.5 Namespace方案
透過新建Namespace方案實現名稱空間環境區分
6.5.1 新建名稱空間
6.5.2 新建配置
選擇名稱空間後,在新增配置。
6.5.3 在配置中,新增一條namespace
bootstrap.yml
# nacos配置
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務註冊中心地址
config:
server-addr: localhost:8848 #Nacos作為配置中心地址
file-extension: yaml #指定yaml格式的配置
group: prod_group #新增配置
namespace: private #新增名稱空間
# nacos端配置檔案DataId的命名規則是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml
application.yml
server:
port: 3377
spring:
profiles:
active: prod # 表示開發環境
#active: prod # 表示生產環境
#active: test # 表示測試環境
只是為了記錄自己的學習歷程,且本人水平有限,不對之處,請指正。