1. Nacos入門
Nacos是阿里巴巴的產(chǎn)品,現(xiàn)在是SpringCloud中的一個(gè)組件。相比Eureka功能更加豐富,在國(guó)內(nèi)受歡迎程度較高。
-
在bin目錄下windows命令:
startup.cmd -m standalone
執(zhí)行后的效果如圖:
a.服務(wù)注冊(cè)到Nacos
1.在cloud-demo父工程中添加spring-cloud-alilbaba的管理依賴
父工程:
<!--Nacos的管理依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
客戶端:
<!-- nacos客戶端依賴包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.注釋掉order-service和user-service中原有的eureka依賴。
3.添加nacos的客戶端依賴:
<!-- nacos客戶端依賴包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.修改user-service&order-service中的application.yml文件,注釋eureka地址,添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:8848
b.Nacos服務(wù)分級(jí)存儲(chǔ)模型
服務(wù)跨集群調(diào)用問題
- 服務(wù)調(diào)用盡可能選擇本地集群的服務(wù),跨集群調(diào)用延遲較高
- 本地集群不可訪問時(shí),再去訪問其它集群
1.修改application.yml,添加如下內(nèi)容:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos服務(wù)地址
discovery:
cluster-name: HZ # 集群名稱,HZ代指杭州
2.在Nacos控制臺(tái)可以看到集群變化:
c.NacosRule負(fù)載均衡
1.修改order-service中的application.yml,設(shè)置集群為HZ:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 配置集群名稱,也就是機(jī)房位置
2.然后在order-service中設(shè)置負(fù)載均衡的IRule為NacosRule,這個(gè)規(guī)則優(yōu)先會(huì)尋找與自己同集群的服務(wù):
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負(fù)載均衡規(guī)則
d.服務(wù)實(shí)例的權(quán)重設(shè)置
實(shí)際部署中會(huì)出現(xiàn)這樣的場(chǎng)景:
- 服務(wù)器設(shè)備性能有差異,部分實(shí)例所在機(jī)器性能較好,另一些較差,我們希望性能好的機(jī)器承擔(dān)更多的用戶請(qǐng)求
Nacos提供了權(quán)重配置來控制訪問頻率,權(quán)重越大則訪問頻率越高
1.在Nacos控制臺(tái)可以設(shè)置實(shí)例的權(quán)重值,首先選中實(shí)例后面的編輯按鈕
2.將權(quán)重設(shè)置為0.1,測(cè)試可以發(fā)現(xiàn)8081被訪問到的頻率大大降低
實(shí)例的權(quán)重控制
- Nacos控制臺(tái)可以設(shè)置實(shí)例的權(quán)重值,0~1之間
- 同集群內(nèi)的多個(gè)實(shí)例,權(quán)重越高被訪問的頻率越高
- 權(quán)重設(shè)置為0則完全不會(huì)被訪問
e.環(huán)境隔離 - namespace
Nacos中服務(wù)存儲(chǔ)和數(shù)據(jù)存儲(chǔ)的最外層都是一個(gè)名為namespace的東西,用來做最外層隔離
- 1.每個(gè)namespace都有唯一id
- 2.服務(wù)設(shè)置namespace時(shí)要寫id而不是名稱
- 3.不同namespace下的服務(wù)互相不可見
1.在Nacos控制臺(tái)可以創(chuàng)建namespace,用來隔離不同環(huán)境
2.然后填寫一個(gè)新的命名空間信息:
3.保存后會(huì)在控制臺(tái)看到這個(gè)命名空間的id:
4.修改order-service的application.yml,添加namespace:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 配置集群名稱,也就是機(jī)房位置
namespace: 67d42554-fcf4-45e8-8ecf-bfa4467ed435 # dev環(huán)境(命名空間,填id)
5.重啟order-service后,再來查看控制臺(tái)
6.此時(shí)訪問order-service,因?yàn)閚amespace不同,會(huì)導(dǎo)致找不到userservice,控制臺(tái)會(huì)報(bào)錯(cuò):
f.Nacos和Eureka的對(duì)比
Nacos注冊(cè)中心細(xì)節(jié)分析
服務(wù)注冊(cè)到Nacos時(shí),可以選擇注冊(cè)為臨時(shí)或非臨時(shí)實(shí)例,通過下面的配置來設(shè)置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 配置集群名稱,也就是機(jī)房位置
namespace: 67d42554-fcf4-45e8-8ecf-bfa4467ed435 # dev環(huán)境(命名空間,填id)
ephemeral: false # 是否是臨時(shí)實(shí)例
Nacos和Eureka的共同點(diǎn)
- 1.都支持服務(wù)注冊(cè)和服務(wù)拉取
- 2.都支持服務(wù)提供者心跳方式做監(jiān)控檢測(cè)
Nacos和Eureka的區(qū)別
- 1.Nacos支持服務(wù)端主動(dòng)檢測(cè)提供者狀態(tài):臨時(shí)實(shí)例采用心跳模式,非臨時(shí)實(shí)例采用主動(dòng)檢測(cè)模式
- 2.臨時(shí)實(shí)例心跳不正常會(huì)被剔除,非臨時(shí)實(shí)例則不會(huì)被剔除
- 3.Nacos支持服務(wù)列表變更的消息推送模式,服務(wù)列表更新更及時(shí)
- 4.Nacos集群默認(rèn)采用AP模式,當(dāng)集群中存在非臨時(shí)實(shí)例時(shí),采用CP模式;Eureka采用AP模式
2. Nacos配置管理
a.統(tǒng)一配置管理
統(tǒng)一配置管理
- 配置更改熱更新
在Nacos中添加配置信息:
在彈出表單中填寫配置信息:
配置獲取的步驟如下:
與配置地址和nacos地址等信息都要放在bootstrap.yml中
1.引入Nacos的配置管理客戶端依賴:
<!--nacos配置管理依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在userservice中的resource目錄添加一個(gè)bootstrap.yml文件,這個(gè)文件是引導(dǎo)文件,優(yōu)先級(jí)高于application.yml:
spring:
application:
name: userservice # 服務(wù)名稱
profiles:
active: dev # 環(huán)境
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
config:
file-extension: yaml # 文件后綴名
3.我們?cè)趗ser-service中將pattern.dateformat這個(gè)屬性注入到UserController中做測(cè)試:
@RestController
@RequestMapping("/user")
public class UserController {
// 注入nacos中的配置屬性
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
b.配置熱更新
Nacos中的配置文件變更后,微服務(wù)無需重啟就可以感知
不過需要通過下面兩種配置實(shí)現(xiàn):
- 方式一:在@Value注入的變量所在類上添加注解@RefreshScope
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
// 注入nacos中的配置屬性
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
- 方式二(推薦):使用@ConfigurationProperties注解
新建一個(gè)config/PatternProperties類,加入@ConfigurationProperties注解和前綴名
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties properties;
@GetMapping("now")
public String now(){
return
LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}
注意事項(xiàng):
- 不是所有的配置都適合放到配置中心,維護(hù)起來比較麻煩
- 建議將一些關(guān)鍵參數(shù),需要運(yùn)行時(shí)調(diào)整的參數(shù)放到nacos配置中心,一般都是自定義配置
c.多環(huán)境配置共享
微服務(wù)啟動(dòng)時(shí)會(huì)從nacos讀取多個(gè)配置文件:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml
論profile如何變化,[spring.application.name].yaml這個(gè)文件一定會(huì)加載,因此多環(huán)境共享配置可以寫入這個(gè)文件
多種配置的優(yōu)先級(jí):文章來源:http://www.zghlxwxcb.cn/news/detail-672605.html
- 服務(wù)名-profile.yaml >服務(wù)名稱.yaml > 本地配置
文章來源地址http://www.zghlxwxcb.cn/news/detail-672605.html
到了這里,關(guān)于微服務(wù)中間件--Nacos的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!