一、Nacos服务注册整体流程图
二、Nacos服务端注册流程处理
2.1、初始化Nacos RPC Server
BaseRpcServer 有两个实现分别是GrpcClusterServer、GrpcSdkServer
GrpcSdkServer 用来处理客户端的RPC请求与响应
BaseGrpcServer.addServices方法,通过长连接建立处理客户端的请求。
GrpcRequestAcceptor.request 方法,根据不同的请求Type获取不同的RequestHandler,进行请求处理
InstanceRequestHandler 处理客户端服务注册与服务销户
EphemeralClientOperationServiceImpl进行服务注册并发布客户端注册事件、元数据变更事件
ServiceManager管理Service相关数据
public class ServiceManager {
private static final ServiceManager INSTANCE = new ServiceManager();
/**
* Service和Service的关系
*/
private final ConcurrentHashMap<Service, Service> singletonRepository;
/**
* namespace 服务下对应的服务信息
*/
private final ConcurrentHashMap<String, Set<Service>> namespaceSingletonMaps;
private ServiceManager() {
singletonRepository = new ConcurrentHashMap<>(1 << 10);
namespaceSingletonMaps = new ConcurrentHashMap<>(1 << 2);
}
public static ServiceManager getInstance() {
return INSTANCE;
}
public Set<Service> getSingletons(String namespace) {
return namespaceSingletonMaps.getOrDefault(namespace, new HashSet<>(1));
}
/**
* Get singleton service. Put to manager if no singleton.
*
* @param service new service
* @return if service is exist, return exist service, otherwise return new service
*/
public Service getSingleton(Service service) {
singletonRepository.putIfAbsent(service, service);
Service result = singletonRepository.get(service);
namespaceSingletonMaps.computeIfAbsent(result.getNamespace(), (namespace) -> new ConcurrentHashSet<>());
namespaceSingletonMaps.get(result.getNamespace()).add(result);
return result;
}
}
ClientManager管理客户端注册实例(每个服务实列、Service、最后一次心跳信息等)
clientId为 注册时间戳_ip_通信端口;
ClientServiceIndexesManager 客户端服务管理,监听服务注册事件。
DoubleWriteEventListener 监听客户端服务变更事件
此时整个服务注册逻辑完成。
在Nacos集群模式下如何同步
三、客户端注册时的负载均衡
客户端注册时的默认的负载均衡算法