Nacos:致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。提供了一組簡(jiǎn)單易用的特性集,幫助您快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
本文只介紹Spring Cloud Alibaba 中Nacos的使用
1. Nacos是什么?
英文全稱Dynamic Naming and Configuration Service,即注冊(cè)發(fā)現(xiàn)服務(wù)(注冊(cè)中心)、配置服務(wù)(配置中心),在Nacos中服務(wù)(Service)是核心。
Nacos是Dubbo體系、Spring Cloud Alibaba體系中重要的注冊(cè)中心實(shí)現(xiàn)。
Nacos = Spring Cloud eurake + Spring Cloud Config。
與同類(lèi)注冊(cè)中心產(chǎn)品相對(duì)比,存在一定優(yōu)勢(shì),支持CP+AP。
| Nacos | Eurake | Zookeeper | Consul | |
|---|---|---|---|---|
| 一致性協(xié)議 | CP+AP | AP | CP | CP |
| 健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | Keep Alive | TCP/Http/gRPC/Cmd |
| 負(fù)載均衡 | 權(quán)重/metadata/Selector | Ribbon | - | RoundRobin |
| 雪崩保護(hù) | 有 | 有 | 無(wú) | 無(wú) |
| 自動(dòng)注銷(xiāo)實(shí)例 | 支持 | 支持 | 支持 | 不支持 |
| 訪問(wèn)協(xié)議 | HTTP/DNS | HTTP | TCP | HTTP/DNS |
| 多數(shù)據(jù)中心 | 支持 | 支持 | 不支持 | 支持 |
| 跨注冊(cè)中心同步 | 支持 | 不支持 | 不支持 | 支持 |
| SpringCloud | 支持 | 支持 | - | 支持 |
| Dubbo | 支持 | - | 支持 | - |
| K8S | 支持 | - | - | 支持 |
關(guān)鍵特性
- 服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)控
支持基于DNS和基于RPC的服務(wù)發(fā)現(xiàn),對(duì)服務(wù)健康的實(shí)時(shí)檢查,阻止像不健康的主機(jī)或服務(wù)實(shí)例發(fā)送請(qǐng)求。- 動(dòng)態(tài)配置服務(wù):
以中心化、外部化、動(dòng)態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置。- 動(dòng)態(tài)DNS服務(wù):
支持權(quán)重路由,更容易的實(shí)現(xiàn)中間層的負(fù)載均衡、路由策略、流量控制。- 服務(wù)以及元數(shù)據(jù)管理:
從微服務(wù)平臺(tái)建設(shè)的視角管理數(shù)據(jù)中心的所有服務(wù)及元數(shù)據(jù),包括管理服務(wù)的描述、生命周期、服務(wù)的靜態(tài)依賴分析、服務(wù)的健康狀態(tài)、服務(wù)的流量管理、路由及安全策略、服務(wù)的 SLA 以及最首要的 metrics 統(tǒng)計(jì)數(shù)據(jù)。
2. 環(huán)境及版本
下載地址:https://github.com/alibaba/nacos/releases
Nacos:nacos-server-1.2.1
Maven:apache-maven-3.6.3
JDK:jdk1.8.0_181

Windos下安裝
解壓下載的nacos-server-1.2.1.zip文件,進(jìn)入nacos/bin目錄,雙擊startup.cmd。

啟動(dòng)控制臺(tái)會(huì)顯示nacos的訪問(wèn)地址

默認(rèn)賬號(hào)密碼 nacos/nacos 登錄

3. Nacos 配置中心
<!-- SpringCloud Ailibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
#默認(rèn)對(duì)應(yīng)nacos服務(wù)中dataId格式為,${spring.application.name}-${spring.profile.active}.${file-extension}
spring:
application:
name: config
cloud:
nacos:
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
我們可以指定數(shù)據(jù)庫(kù)配置,通過(guò)一臺(tái)或者多臺(tái)數(shù)據(jù)庫(kù)進(jìn)行配置中心的配置存儲(chǔ)。
指定數(shù)據(jù)庫(kù)配置,需使用nacos提供的數(shù)據(jù)庫(kù)腳本進(jìn)行初始化
nacos\conf\nacos-mysql.sql
nacos\conf\schema.sql
修改在nacos\conf\application.properties 配置文件
#nacos服務(wù)端口號(hào)
server.port=8848
#數(shù)據(jù)配合
spring.datasource.platform=mysql
#數(shù)據(jù)庫(kù)個(gè)數(shù)
db.num=2
#地址a
db.url.0=jdbc:mysql://127.0.0.1:3306/config-a?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
#地址b
db.url.1=jdbc:mysql://127.0.0.1:3306/config-b?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
新建配置
通過(guò)管控臺(tái)可以直接新建配置信息,提供給我們的服務(wù)使用。

配置列表
配置列表中,可以使用Data ID、Group進(jìn)行配置檢索,DataID為我們配置文件的id,Group為分組信息。

本地存儲(chǔ)
不論是否使用數(shù)據(jù)庫(kù)進(jìn)行配置管理nacos都會(huì)在本地nacos目錄下創(chuàng)建data\config-data目錄,該目錄下使用Group進(jìn)行分組,來(lái)保存我們的配置文件。也可以將目錄打包為DEV_GROUP.zip文件上傳至nacos。

4. Nacos注冊(cè)中心
<!-- SpringCloud Ailibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
# 注冊(cè)中心地址配置,可增加配置中心內(nèi)容,服務(wù)的提供者與消費(fèi)者配置相同,更換spring.application.name即可。
spring:
application:
#應(yīng)用名稱
name: service-provider
cloud:
nacos:
discovery:
#服務(wù)注冊(cè)地址
server-addr: 127.0.0.1:8848
服務(wù)提供者
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
服務(wù)消費(fèi)者
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
}