聊一聊nacos是如何进行服务注册的(一)

pivoteic
发布于 2022-6-14 16:29
浏览
0收藏

 

前言

一、NamingService介绍

二、服务注册源码剖析

三、心跳机制源码剖析

总结

 

前言

 

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。作为springcload alibaba中的一员,越来越深受各种公司的青睐。本文就是在这个背景下剖析nacos服务注册的核心源码。

 

本文是基于nacos 1.4.1版本进行源码剖析。

 

下图本文源码分析核心机制的原理图,有需在线观看的同学关注公众号,发送 nacos01 即可获得图片在线链接。

聊一聊nacos是如何进行服务注册的(一)-鸿蒙开发者社区

一、NamingService介绍

 

NamingService是nacos提供用来实现服务注册、服务订阅、服务发现等功能的api,由NacosNamingService唯一实现,通过这个api就可以跟nacos服务端实现通信。

 

本文也会着重剖析NamingService,看看客户端注册、心跳等特性实现的源码。

 

二、服务注册源码剖析

 

服务注册是通过registerInstance方法来实现的,这个方法有很多的重载的方法,只不过最后都调用

 

registerInstance(String serviceName, String groupName, Instance instance) throws NacosException

 

来实现真正的注册的,接下来我们就进入该方法,来看看是如何注册到服务端的。

聊一聊nacos是如何进行服务注册的(一)-鸿蒙开发者社区

我先说一个参数的意思

serviceName:顾名思义,就是指服务的名称,比如什么商品服务之类的


groupName:服务所在组的名称,nacos是支持group级别的隔离,也就是说,在一个namespace下,不同group之间的服务是相互隔离的。相互隔离的意思就是互不干扰,举个例子来说,比如ServiceA有两个实例,一个所在groupName为dev,一个所在groupName为prd,那么当有其他的服务在groupName为dev的情况下订阅的ServiceA,那么是订阅不到prd group的服务实例的。默认名称是DEFAULT_GROUP。

Instance:就是服务信息的封装

 

接下来我们进入该方法的解析。

 

第一步,就是将服务名和组名进行字符串的拼接,没有什么好说的;

第二步,这个if条件,默认是true,不信你可以点进去看一下,这一步是创建一个心跳的任务,从这里我们可以看出,默认的情况下,nacos会为每个服务实例创建一个心跳。只不过一般一个客户端只会注册一个服务实例(想一想,哪个框架一个客户端可能会注册多个服务实例,公众号有剖析过这个框架)。

第三步,这一步就是调用api,发送请求给服务端,注册服务实例。

 

我们进入第三步(心跳机制源码我们稍后再剖析),进入

serverProxy.registerService(groupedServiceName, groupName, instance);

这一行代码看看是怎么注册的。

聊一聊nacos是如何进行服务注册的(一)-鸿蒙开发者社区

这里我们看见,这个方法显示根据入参,构建了一个Map,然后调用reqApi,进入reqApi之前,我们看一下reqApi方法参数。

第一个参数名称 api,是常量 /nacos/v1/ns/instance,有兴趣可以自己点进去

第二个参数名称 params,就是构建的map


第三个参数名称是 method,是HttpMethod.POST,看到http,这里我们就可以猜想,难道客户端跟服务端通信是通过http协议来实现的么,我们带着疑惑继续往下看。

 

文章转自公众号:三友的java日记

标签
已于2022-6-14 16:29:51修改
收藏
回复
举报
回复
    相关推荐