nacos注册中心

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>
<!-- 引入spring cloud 版本管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引入spring cloud alibaba 版本管理 -->
<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>
<!--引入spring cloud netflix 版本管理-->
<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:
# nacos server地址
server-addr: localhost:8848
# 服务名称
service: order

(4)启动order-9091、9092、9093,观察nacos dashboard的服务情况

1.3 SC的服务发现

1
2
3
4
5
6
7
//定义服务发现接口,使用DiscoveryClient测试
@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
# 创建一个命名空间,名称为dev,并获取到其id:9c52616a-48c0-4f78-a256-573b6fb5a152
# 查看dev命名空间下的服务,发现没有任何服务
# 修改user服务的application.yml文件,主要配置体验一下namespace、group和cluster
spring:
cloud:
nacos:
discovery:
# nacos server地址
server-addr: localhost:8848
# 服务名称
service: user
namespace: 9c52616a-48c0-4f78-a256-573b6fb5a152
group: shop-group
cluster-name: BJ
# 启动user服务,观察nacos dashboard dev命名空间下的数据
# 调用user服务中UserController提供的服务发现代码,发现调用失败,说明不同名命名空间下的服务是隔离的
# http://localhost:8081/user/instances?serviceId=order

1.5 Nacos元信息(Metadata)

Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、 各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。

1
2
3
4
# 配置元信息
metadata:
name: Jack
age: 17

2. 源码分析

2.1 Nacos Server启动

  1. Nacos 2.x

(1)http方式,以Spring Boot的方式启动内置的Tomcat容器,并且实例化很多Controller提供Http请求的访问形式,比如InstanceController。启动方式和正常springboot启动相同。用于持久节点注册

(2)在Nacos2.X中新增了gRPC的通信方式,所以会在Server端提供gRPC的监听,用于处理客户端的连接。用于临时节点注册。

  1. 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
#false为永久实例,true表示临时实例开启,注册为临时实例,默认是true
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/


nacos注册中心
http://www.zivjie.cn/2023/02/25/spring框架/springcloud/nacos/nacos注册中心/
作者
Francis
发布于
2023年2月25日
许可协议