Nacos服务发现原理
1、NacosServiceDiscovery
public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties,
NacosServiceManager nacosServiceManager) {
this.discoveryProperties = discoveryProperties;
this.nacosServiceManager = nacosServiceManager;
}
通过构造方法以及方法内容得知,它是nacos服务发现的服务层,底层获取服务列表信息也是通过前面我们提过的NacosServiceManager的namingService进行操作。值得注意的是
/**
* Return all instances for the given service.
* @param serviceId id of service
* @return list of instances
* @throws NacosException nacosException
*/
//这个方法是通过本地缓存 serviceInfoMap拿的
public List<ServiceInstance> getInstances(String serviceId) throws NacosException {
...
}
/**
* Return the names of all services.
* @return list of service names
* @throws NacosException nacosException
*/
//这个方法数据是直连nacos server使用api请求获取
public List<String> getServices() throws NacosException {
...
}
为什么这么做?不可以都从本地缓存获取吗?
2、NacosDiscoveryClient
实现DiscoveryClient接口,此接口是Spring cloud 服务发现规范,可以把它理解成 NacosServiceDiscovery的包装类,后面的服务注册也采用的这个设计模式。Spring cloud的负载均衡会通过 DiscoveryClient 进行服务列表的获取从而进行选择。具体后面研究Spring cloud LoadBalancer时再说。
3、NacosWatch
通过名字猜到是nacos的观察服务,那么观察啥呢?
//构造方法只是简单的赋值以及初始化 线程池
public NacosWatch(NacosServiceManager nacosServiceManager,
NacosDiscoveryProperties properties,
ObjectProvider<ThreadPoolTaskScheduler> taskScheduler) {
this.nacosServiceManager = nacosServiceManager;
this.properties = properties;