以下内容基于Nacos 2.1.0-SNAPSHOT
1. 服务实例注册示例
当nacos服务已经启动后,可以使用以下示例代码向nacos注册服务实例
@Test
public void testRegisterInstance() throw Exception {
// nacos地址,用户和密码
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
properties.put(PropertyKeyConst.USERNAME, "nacos");
properties.put(PropertyKeyConst.PASSWORD, "nacos");
// 构建服务实例
Instance instance = new Instance();
instance.setIp("1.1.1.1");
instance.setPort(800);
instance.setWeight(2);
Map<String, String> map = new HashMap<>();
map.put("netType", "external");
map.put("version", "2.0");
instance.setMetadata(map);
// 创建NamingService
NamingService namingService = NacosFactory.createNamingService(properties);
// 通过NamingService注册服务实例,并指定服务名为 nacos.test.1
namingService.registerInstance("nacos.test.1", instance);
}
2. 客户端执行流程
1. 相关的接口和类
-
NamingService
定义了与服务实例相关的方法,我们可以通过NamingService
完成服务实例的注册、注销、获取,目前只有一个实现类NacosNamingService
。在NacosNamingService
中持有一个NamingClientProxy
的属性,并由NamingClientProxy
来完成服务实例相关的操作。 -
NamingClientProxy
封装了nacos客户端与服务端的交互细节。主要有两个实现类:-
NamingHttpClientProxy
采用gRpc协议与服务端进行交互 -
NamingGrpcClientProxy
采用Http协议与服务端进行交互
当需要服务实例
Instance
的属性ephemeral
为true时,将使用NamingHttpClientProxy
与服务端进行交互。 -
-
RpcClient
抽象远程客户端,用以连接服务器,发起请求,接受响应。
2. 时序图
3. 服务端执行流程
1. 相关接口和类
-
GrpcRequestAcceptor
类用于统一接受grpc请求,在request方法中,根据请求元数据中的type属性来判断由哪个RequestHandler
来处理 -
RequestHandler
抽象类用于Nacos请求处理,其中子类InstanceRequestHandler
用于处理服务实例注册和注销请求 -
ClientOperationService
接口提供客户端操作(实例注册,实例注销,订阅服务,取消订阅),有以下两个实现类:-
PersistentClientOperationServiceImpl
:对持久的客户端和服务提供操作 -
EphemeralClientOperationServiceImpl
:对临时的客户端和服务提供操作
在构建
Instance
时,可以通过ephemeral
属性来指定为持久实例,还是临时实例,ephemeral
默认为true
-
-
ClientManager
用于管理Nacos naming Client -
NotityCenter
统一事件通知中心
2. 时序图
4. 待解惑
-
gRpc协议是什么?
-
服务注册请求数据结构长什么样?
-
服务注册成功后,存储在哪里?
-
发布
ClientOperationEvent.ClientRegisterServiceEvent
事件和MetadataEvent.InstanceMetadataEvent
事件的目的是什么