Nacos致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理
Nacos的关键特性如下:
来初步了解一下 Nacos 的基本使用
Nacos 支持三种部署,分别是单机、集群和多集群。需要注意一点,Nacos 依赖 Java 环境,并且要求使用 JDK 1.8 以上版本
Nacos 的安装方式一般有两种,一种是源码安装,另一种直接是使用已经编译好的安装包。由于后续需要分析 Nacos 源码,所以这里就先选择第一种源码安装方式
Nacos服务注册发现相关API
Nacos提供SDK及Open API 的方式来完成服务注册与发现等操作,由于服务端只提供了 REST 接口,所以SDK本质上是对于 HTTP 请求的封装。下面简单列一下和服务注册相关的核心接口
注册实例
将服务地址信息注册到 Nacos Server:
OPAPI:/nacos/v1/ns/instance(POST)
SDK:
void registerInstance(String serviceName, String ip, int port) throws NacosException;
void registerInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;
void registerInstance(String serviceName, Instance instance) throws NacosException;
参数说明如下:
调用方式:
NamingService naming =
NamingFactory.createNameingService(System.getProperty("serverAddr"));
naming.registerInstance("nacos_test", "192.168.1.1", 8080, "DEFAULT");
获取全部实例
根据服务名称从 Nacos Server 上获取所有服务实例:
Open API: /nacos/v1/ns/instance/list (GET)
SDK:
List getAllInstance(String serviceName) throws NacosException;
List getAllInstance(String serviceName, List clusters) throws NacosException;
参数说明如下:
调用方式
NamingService naming = NamingFactory.createNamingService(System.getProperty("serverAddr"));
System.out.println(naming.getAllInstances("nacos_test", true));
监听服务
监听服务是指监听指定服务下的实例变化,客户端从 Nacos Server 上获取的实例必须是健康的,否则会造成客户端请求失败。监听服务机制可以让客户端及时感知服务提供者的变化
Open API: /nacos/v1/ns/instance/list (GET)
SDK:
void subscribe(String serviceName, EventListener listener) throws Nacoe NacosException;
void subscribe(String serviceName, List clusters, EventListener listener) throws NacosException;
参数说明:
服务监听两种方式
先看一下 Nacos 的架构及实现注册中心的原理
这个是 Nacos官网 图片:
整体来说,服务提供者通过 VIP (Vritual IP)访问 Nacos server 高可用集群,基于 Open API 完成服务的注册和服务的查询。Nacos server 本身可以支持主备模式,所以底层会采用数据一致性算法来完成从节点的数据同步。服务消费者也是如此,基于 Open API 从 Nacos Server 中查询服务列表
服务注册的功能主要体现在:
Nacos 服务注册与发现的实现原理图:
Nacos 源码部分,我们主要阅读三部分:
在 Spring-Cloud-Common 包中有一个类 org.springframework.cloud.clinet.serviceregistry.ServiceResgistry,它是 Spring Cloud 提供的服务注册的标准。集成到 Spring Cloud 中实现服务注册的组件,都会实现该接口
public interface ServiceRegistry {
void register(R registration);
void deregister(R registration);
void close();
void setStatus(R registration, String status);
T getStatus(R registration);
}
这个接口有一个实现类是 com.alibaba.cloud.nacos.registry.NacosServiceRegistry
在spring-clou-commons包的META-INF/spring.factories中包含自动装配的配置信息如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.cloud.client.CommonsClientAutoConfiguration,\org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration,\
## 省略部分代码
org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration
其中 AutoServiceRegistrationAutoConfiguration 就是服务注册相关的配置类
服务自动注册类关系图:
可以看出, AbstractAutoServiceRegistration抽象类实现了该接口,并且最重要的是NacosAutoServiceRegistration继承了AbstractAutoServiceRegistration。
看到EventListener我们就应该知道,Nacos是通过Spring的事件机制继承到SpringCloud中去的。
AbstractAutoServiceRegistration实现了onApplicationEvent抽象方法,并且监听WebServerInitializedEvent事件(当Webserver初始化完成之后) , 调用this.bind ( event )方法。
总结一下服务注册的完整过程:
Nacos 客户端通过 Open API 的形式发送服务注册请求
Nacos 服务端收到请求后,做以下三件事