什么是 Nacos
Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 的关键特性
Nacos 的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
Nacos的高性能特点
Nacos之所以能够具有高性能,主要归结于以下几点:
- 基于阿里自研的distro协议,Nacos可以同步不同节点的数据。
- 大量使用线程池和异步的方式,提高API的响应速度。
- 在2.X版本中,使用gRPC长连接的方式取代了1.X需要一直发送心跳包,解决了服务器CPU占用较高的问题。
Nacos 优势
Nacos 的优势包括:
- 易用:简单的数据模型,标准的 restfulAPI,易用的控制台,丰富的使用文档。
- 稳定:99.9% 高可用,脱胎于历经阿里巴巴 10 年生产验证的内部产品,支持具有数百万服务的大规模场景,具备企业级 SLA 的开源产品。
- 实时:数据变更毫秒级推送生效;1w 级,SLA 承诺 1w 实例上下线 1s,99.9%推送完成;10w 级,SLA 承诺 1w 实例上下线 3s,99.9% 推送完成;100w 级别,SLA 承诺 1w 实例上下线 9s 99.9% 推送完成。
- 规模:十万级服务/配置,百万级连接,具备强大扩展性。
Nacos 注册中心架构和基本概念
服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
服务注册中心 (Service Registry)
服务注册中心,它是服务及其实例和元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
服务提供方 (Service Provider)
服务提供方是指提供可复用和可调用服务的应用方。
服务消费方 (Service Consumer)
服务消费方是指会发起对某个服务调用的应用方。
Nacos注册中心核心功能
服务注册
Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳
在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
服务同步
Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
服务发现
服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
服务健康检查
Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。
参考资料
Nacos注册中心(Nacos Server)环境搭建
单机模式
官方文档: https://nacos.io/zh-cn/docs/deployment.html
微服务(Nacos Client)整合Nacos注册中心(Nacos Server)
配置服务提供者base-user
服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
1. 引入依赖
在当前项目的pom.xml文件中引入以下依赖:
<!-- nacos 服务注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置发现中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:只引入spring-cloud-starter-alibaba-nacos-discovery包会出现下面的错误,还需要再引入nacos-common包。此bug已经修复了,不需要再引入nacos-common了,只需要引入spring-cloud-starter-alibaba-nacos-discovery。
2. 配置nacos注册中心
在application.yml或者application.properties文件中添加以下配置:
server:
port: 8020
spring:
application:
name: base-user #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
3. 启动base-user
启动base-user服务,然后在nacos管理端界面查看是否成功注册。
测试:通过Open API查询实例列表
http://localhost:8848/nacos/v1/ns/instance/list?serviceName=base-user
配置服务消费者base-user
服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
1. 引入依赖
在当前项目的pom.xml文件中引入以下依赖:
<!-- nacos 服务注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置发现中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 配置nacos注册中心
在application.yml或者application.properties文件中添加以下配置:
server:
port: 8040
spring:
application:
name: base‐user #微服务名称
#配置nacos注册中心地址
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
3. 启动base-user
启动base-user服务,然后在nacos管理端界面查看是否成功注册。
4. 使用RestTemplate进行服务调用
给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成。
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
调用逻辑:
//使用微服务名发起调用
String url = "http://base‐user/user/getBasInfoByUserId/"+id;
UserInfo userInfo = restTemplate.getForObject(url, UserInfo.class);
测试:http://localhost:8040/user/getBasInfoByUserId/1,返回数据。