Nacos版本:2.0.4 nacos2.x已不支持ribbon,使用nacos2.x需要手动引入LoadBalancer
https://nacos.io/zh-cn/docs/sdk.html
1 2 3 4 5
| curl -X POST 'http://localhost:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
curl -X GET 'http://localhost:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
|
1. 基本使用
1.1 基于Java SDK的服务注册与发现
https://nacos.io/zh-cn/docs/sdk.html
(1)引入nacos-client包
1 2 3 4 5
| <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.0.4</version> </dependency>
|
(2)编写Java代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class ServiceRegisterAndDiscovery{ public static void main(String[] args) throws NacosException, IOException{ Properties properties = new Properties(); properties.setProperty("serverAddr", "192.168.0.108:8848"); NamingService naming = NamingFactory.createNamingService(properties); System.out.println("-----服务注册-----"); naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1"); System.out.println("-----服务发现-----"); System.out.println(naming.getAllInstances("nacos.test.3")); System.in.read(); } }
|
1.2 基于SC的服务注册
(1)引入版本管理依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.4</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.4.0</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-dependencies</artifactId> <version>3.1.4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
|
(2)引入nacos discovery依赖
1 2 3 4
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
|
(3)在application.yml文件中编写配置
1 2 3 4 5 6 7 8
| spring: cloud: nacos: discovery: server-addr: localhost:8848 service: order
|
(4)启动order-9091、9092、9093,观察nacos dashboard的服务情况
1.3 SC的服务发现
1 2 3 4 5 6 7
| @Resource private DiscoveryClient discoveryClient; @RequestMapping("/instances") public List<ServiceInstance> instances(@RequestParam("serviceId")String serviceId) { return this.discoveryClient.getInstances(serviceId); }
|
1.4 Nacos领域模型

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
spring: cloud: nacos: discovery: server-addr: localhost:8848 service: user namespace: 9c52616a-48c0-4f78-a256-573b6fb5a152 group: shop-group cluster-name: BJ
|
Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、 各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
1 2 3 4
| metadata: name: Jack age: 17
|
2. 源码分析

2.1 Nacos Server启动
- Nacos 2.x
(1)http方式,以Spring Boot的方式启动内置的Tomcat容器,并且实例化很多Controller提供Http请求的访问形式,比如InstanceController。启动方式和正常springboot启动相同。用于持久节点注册
(2)在Nacos2.X中新增了gRPC的通信方式,所以会在Server端提供gRPC的监听,用于处理客户端的连接。用于临时节点注册。

Nacos 1.x
只有http方式
2.2 Spring Boot启动调用Nacos API
(1)Spring Boot项目启动
(2)Spring Boot发布ServletWebServerInitializedEvent事件
(3)Spring Cloud监听器AbstractAutoServiceRegistration 监听感兴趣事件 WebServerInitializedEvent
(4)回调AbstractAutoServiceRegistration#onApplicationEvent

2.3 Nacos客户端向服务端发起服务注册
(1)Nacos 2.x
- 入口:NacosNamingService#registerInstance(serviceName,groupName,Instance instance)

(2)Nacos 1.x

2.4 Nacos服务端处理服务注册
(1)Nacos 2.x

(2)Nacos 1.x

2.5 心跳机制与健康检查
(1)Nacos 2.x

(2)Nacos 1.x

2.6 服务发现与订阅及通知客户端
(1)Nacos 2.x

(2)Nacos 1.x

2.7 分布式架构
如果注册Nacos的client节点注册时ephemeral=true,那么Nacos集群对这个client节点的效果就是AP,采用distro协议实现;而注册Nacos的client节点注册时ephemeral=false,那么Nacos集群对这个节点的效果就是CP的,采用raft协议实现。根据client注册时的属性,AP,CP同时混合存在,只是对不同的client节点效果不同。Nacos可以很好的解决不同场景的业务需求。
1 2
| spring.cloud.nacos.discovery.ephemeral = true
|
2.7.1 AP架构-distro

2.7.2 CP架构-raft
https://raft.github.io/
http://thesecretlivesofdata.com/raft/
https://raft.github.io/#implementations/