nacos注册服务源码流程
2021-09-07 17:35:39 0 举报
AI智能生成
nacos注册服务源码流程
作者其他创作
大纲/内容
简述:NacosClient客户端将服务注册到nacos注册中心服务端NacosServer的过程本质上是spring在refresh方法中调用注册监听器registerListeners方法时,NacosAutoServiceRegistration重写了抽象自动服务注册子类AbstractAutoServiceRegistration方法的一系列扩展过程,然后NacosServer将服务信息先入到队列中去,再由线程从队列中取出来,最后存放到注册表Map<String,Map<string,string,Service>>中的Service类中的clusterMap中的Cluster里的Set<Instance>中,即Map(namespace, Map(group::serviceName, Service)). namespace一般用作区分环境,group一般用作区分项目和项目之间区别
一:NacosClient服务注册具体过程如下
1:AbstractApplicationContext.class中
refresh方法
registerListeners();//注册监听器方法
getApplicationEventMulticaster().multicastEvent(earlyEvent);//多播器监听事件方法
2:SimpleApplicationEventMulticaster.class中
重写ApplicationEventMulticaster.class的multicastEvent方法
调用监听器方法invokeListener
调用onApplicationEvent方法
3:抽象自动服务注册类AbstractAutoServiceRegistration.class中
实现ApplicationListener.class的onApplicationEvent方法
调用bind(event);
调用start方法this.start();
调用注册方法register();
4:NacosServiceRegistry.class中
实现ServiceRegistry接口this.serviceRegistry.register(getRegistration());
1:返回NamingService接口nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
2:获取服务实例Instance instance = getNacosInstanceFromRegistration(registration);
3:注册实例namingService.registerInstance(serviceId, group, instance);
5:NacosNamingService.class中
实现NamingService接口中的registerInstance方法
1:将服务实例添加到ScheduledExecutorService定时线程池中,5秒钟发送一次心跳
2:通过NamingProxy代理注册服务serverProxy.registerService
3:发送http请求到服务端reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST);,nacosUrlInstance: /nacos/v1/ns/instance
二:NacosServer接收到客户端注册请求后具体过程如下
1:将服务实例信息放到阻塞队列中
2:通过Notifier线程来取队列中的服务实例信息,进行异步处理注册服务
3:将服务实例信息放到注册表中的Map<String,Map<String,Service>>中的Service类中的ClusterMap的值Cluster属性Set<Instance>集合中,最终实现服务的注册
三:为什么阿里巴巴要这样设计Nacos服务注册架构?
1:nacos服务注册架构整体思路
1:客户端启动,通过NacosServiceRegistration重写父类register注册方法后,最终通过NamingProxy.registerService中的reqApi中的HttpClient发送http请求到服务端
2:服务端收到注册请求时,先将注册信息存放在阻塞队列ArrayBlockingQueue中,再通过Notifier这个线程从队列中取出来异步处理注册信息,最终放到注册表中的Set<Instance>中实现服务的自动注册
2:为什么要先将注册信息放入队列中,再由异步任务从队列中获取注册信息,然后再放到注册表中呢?阿里巴巴的框架要满足三高:高可用、高并发、高性能、高可扩展等
①高并发,限流
②服务注册时是启动时注册,阿里巴巴有成千上万个微服务启动注册,如果采用同步注册方式,严重影响启动时间和服务获取时间,服务注册查询压测报告时间为13000TPS,注册基本上准实时,如果加入其它的中间件,启动时间也会被严重占用
③所有注册信息都在队列中,然后由线程去异步处理,客户端响应时间会影响吗?一般不会,因为正常场景下运维不可能一次性启动成千上万台服务端同时注册,所以队列一般不会存放太多注册信息,而且注册表都是基于内存操作,效率也是非常高的
0 条评论
下一页