之前分析客户端的代码,发现Naming相关的后端调用主要有这几个,代码为NamingClientProxyDelegate这个class:
- registerService, deregisterService (grpc和http 两种实现)
- subscribe, unsubscribe grpc实现
- getServiceList grpc实现
我们先去看Naming Server的grpc实现
registerService
代码调用链路,grpc方式注册的服务,默认为临时服务。
InstanceRequestHandler#handle(InstanceRequest request, RequestMeta meta)
1
2
3
4
5
6
7
8
9
10
11
12
13public InstanceResponse handle(InstanceRequest request, RequestMeta meta) throws NacosException {
Service service = Service.newService(request.getNamespace(), request.getGroupName(), request.getServiceName(), true);
InstanceUtil.setInstanceIdIfEmpty(request.getInstance(), service.getGroupedServiceName());
switch (request.getType()) {
case NamingRemoteConstants.REGISTER_INSTANCE:
return registerInstance(service, request, meta); // 此处继续看下去
case NamingRemoteConstants.DE_REGISTER_INSTANCE:
return deregisterInstance(service, request, meta);
default:
throw new NacosException(NacosException.INVALID_PARAM,
String.format("Unsupported request type %s", request.getType()));
}
}InstanceRequestHandler#registerInstance(Service service, InstanceRequest request, RequestMeta meta)
1
2
3
4
5
6
7
8
9private InstanceResponse registerInstance(Service service, InstanceRequest request, RequestMeta meta)
throws NacosException {
clientOperationService
.registerInstance(service, request.getInstance(), meta.getConnectionId()); // 此处继续看下去
NotifyCenter.publishEvent(new RegisterInstanceTraceEvent(System.currentTimeMillis(),
meta.getClientIp(), true, service.getNamespace(), service.getGroup(), service.getName(),
request.getInstance().getIp(), request.getInstance().getPort()));
return new InstanceResponse(NamingRemoteConstants.REGISTER_INSTANCE);
}EphemeralClientOperationServiceImpl#registerInstance(Service service, Instance instance, String clientId)
默认注册的临时服务
1 | public void registerInstance(Service service, Instance instance, String clientId) throws NacosException { |
- AbstractClient#addServiceInstance(Service service, InstancePublishInfo instanceInfo)
1 | public boolean addServiceInstance(Service service, InstancePublishInfo instancePublishInfo) { |
这里最终将实例信息,保存到一个map,做了metric统计和发布一个事件,上述列出的代码总共发布了4个事件:
- RegisterInstanceTraceEvent 这种TraceEvent类事件作为Nacos的扩展机制使用,需要自己定制处理逻辑
- ClientOperationEvent.ClientRegisterServiceEvent
- MetadataEvent.InstanceMetadataEvent
- ClientEvent.ClientChangedEvent