1. Nacos介绍
在讲Nacos之前,先来讲一下服务注册和发现。我们知道,现在微服务架构是目前开发的一个趋势。服务消费者要去调用多个服务提供者组成的集群。这里需要做到以下几点:
-
服务消费者 需要在本地配置文件中维护服务提供者集群的每个节点的请求地址 。
-
服务提供者集群中如果某个节点宕机, 服务消费者的本地配置中需要同步删除这个节点的请求地址 ,防止请求发送到已经宕机的节点上造成请求失败。
因此需要引入服务注册中心,它具有以下几个功能:
-
服务地址的管理。
-
服务注册。
-
服务动态感知。
而Nacos致力于解决微服务中的统一配置,服务注册和发现等问题。 Nacos集成了注册中心和配置中心 。其相关特性包括:
1.服务发现和服务健康监测
Nacos支持基于DNS和RPC的服务发现,即 服务消费者可以使用DNS或者HTTP的方式来查找和发现服务 。Nacos提供对服务的实时的健康检查,阻止向不健康的主机或者服务实例发送请求。 Nacos支持传输层(Ping/TCP)、应用层(HTTP、Mysql)的健康检查。
2.动态配置服务
动态配置服务可以 以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
3.动态DNS服务
支持权重路由,让开发者更容易的实现中间层的负载均衡、更灵活的路由策略、流量控制以及DNS解析服务。
4.服务和元数据管理
Nacos允许开发者从微服务平台建设的视角来管理数据中心的所有服务和元数据。如:服务的生命周期、静态依赖分析、服务的健康状态、服务的流量管理、路由和安全策略等。
2. Nacos注册中心实现原理分析
2.1 Nacos架构图
以下是Nacos的架构图:
其中分为这么几个模块:
-
Provider APP:服务提供者。
-
Consumer APP:服务消费者。
-
Name Server:通过Virtual IP或者DNS的方式实现Nacos高可用集群的服务路由。
-
Nacos Server:Nacos服务提供者。
-
OpenAPI:功能访问入口。
-
Config Service、Naming Service:Nacos提供的配置服务、名字服务模块。
-
Consistency Protocol:一致性协议,用来实现Nacos集群节点的数据同步,使用Raft算法实现。
-
其中包含:
-
-
Nacos Console:Nacos控制台。
小总结:
-
服务提供者通过VIP(Virtual IP)访问Nacos Server高可用集群,基于OpenAPI完成服务的注册和服务的查询。
-
Nacos Server的底层则通过数据一致性算法(Raft)来完成节点的数据同步。
2.2 注册中心的原理
这里对其原理做一个大致的介绍,在后文则从源码角度进行分析。
首先,服务注册的功能体现在:
-
服务实例启动时注册到服务注册表、关闭时则注销( 服务注册 )。
-
服务消费者可以通过查询服务注册表来获得可用的实例( 服务发现 )。
-
服务注册中心需要调用服务实例的健康检查API来验证其是否可以正确的处理请求( 健康检查 )。
Nacos服务注册和发现的实现原理的图如下:
3. Nacos源码分析
前提(在本地或者虚机上先启动好Nacos) 这一部分从2个角度来讲Nacos是如何实现的:
-
服务注册。
-
服务发现
3.1 Nacos服务注册
首先看下一个包: spring-cloud-commons
这个ServiceRegistry接口是SpringCloud提供的服务注册的标准,集成到SpringCloud中实现服务注册的组件,都需要实现这个接口。 来看下它的结构:
public interface ServiceRegistry<R extends Registration> {
void register(R registration);
void deregister(R registration);
void close();
void setStatus(R registration, String status);
<T> T getStatus(R registration);
}
那么对于Nacos而言,该接口的实现类是 NacosServiceRegistry
,该类在这个pom包下:
再回过头来看 spring-cloud-commons
包:
spring.factories
主要是包含了自动装配的配置信息 ,如图:在我之前的文章里我有提到过,在spring.factories中配置EnableAutoConfiguration的内容后,项目在启动的时候,会导入相应的自动配置类,那么也就允许对该类的相关属性进行一个自动装配。那么显然,在这里导入了 AutoServiceRegistrationAutoConfiguration
这个类,而这个类顾名思义是 服务注册相关的配置类 。
该类的完整代码如下:
@Configuration(
proxyBeanMethods = false
)
@Import({AutoServiceRegistrationConfiguration.class})
@ConditionalOnProperty(
value = {"spring.cloud.service-registry.auto-registration.enabled"},
matchIfMissing = true
)
public class AutoServiceRegistrationAutoConfiguration {
@Autowired(
required = false
)
private AutoServiceRegistration autoServiceRegistration;
@Autowired
private AutoServiceRegistrationProperties properties;
public AutoServiceRegistrationAutoConfiguration() {