1.nacos是心跳怎么进行服务注册的
2.Netty IdleStateHandler心跳机制
3.nacosåç
nacos是怎么进行服务注册的
今天,我们从源码的源码角度出发,看看nacos是秒心如果进行服务注册,服务调用,心跳负载均衡,源码心跳检测等功能。秒心板块指数计算源码首先大家我们去github上拉取代码,心跳/alibaba/nacos,源码打开后我们先从注册实例作为入口开始看,秒心注册实例的心跳接口在API模块:服务注册点进去发现里面有不同的方法,我们以第一个为例,源码
他是秒心先初始化一个Instance对象,赋值后调用registerInstance()方法,心跳通过clientProxy.registerService()去注册实例,源码继续往下追踪
这个NamingClientProxy()接口有多个实现类(根据实现类的秒心名称我们看到他这里用了策略模式来处理HTTP还是RPC请求)我们先看HTTP实现类是如果处理的:
心跳检测发送关注下我圈起来的地方,这里就是心跳机制的开始喽,他先创建一个BeanInfo对象,然后交给beatReactor.addBeanInfo()这个方法。这个beatReactor看起来像个容器,源码时代项目一那我们就去看一下他是怎么处理的。
这个类有个定时任务线程池,看到这里,我们大概就猜得出他的心跳检测机制应该是通过定时任务线程池去处理的。然后我们再看他的addBeatInfo()方法做了什么?
果然不出所料,先创建BeatTask对象然后交给定时任务线程池去定时处理这个实例信息,但是他的定时任务应该只执行一次呀,他是怎么一直不断的检测的呢,我们进BeatTask这个内部类看看他是可转债日内源码怎么循环处理的:
通过这段代码我们可以清楚的看到他是通过在BeanTask的run()方法重复执行定时任务达到一直循环检测的需求。然后我们返回继续注册实例
封装请求参数,调用API
最后发送注册实例的HTTP请求,一个注册实例的完整链路就走完啦。
负载均衡我们看获取实例的时候nacos是怎么处理的
先尝试从serviceInfoHolder获取服务信息如果没获取到,则通过clientProxy调用API去获取所有实例列表
但是我只要一个,他应该返回我哪一个呢?注意这个Balancer.RandomByWeight.selectHost(serviceInfo);就是负载均衡的关键,
最后从ref里面通过随机数获取一个实例返回。当然他的负载均衡有好几种策略。有轮询,疫情流调源码weight权重,ip_hash,fair,等。大家有兴趣的可以自己去翻一翻都是怎么实现的。
最后如果有理解的不对的地方,欢迎大家指正纠正,一起进步。希望今天的网站源码授权加盟文章对小伙伴们有帮助。
Netty IdleStateHandler心跳机制
Netty的IdleStateHandler心跳机制在TCP长连接中扮演重要角色,确保连接的有效性。它并非严格的PING-PONG交互,而是客户端主动发送心跳,服务器接收但不回复,以节省网络资源。当双方长时间无数据交互,即进入idle状态时,IdleStateHandler会定时检测,如超时则触发userEventTriggered()方法。
Netty提供了IdleStateHandler来处理空闲连接和超时问题,它在服务器端添加处理器,每五秒检查一次读操作,五秒内无数据读取则触发事件。客户端则每四秒发送心跳,通过write()方法检测,四秒内无写操作同样触发事件。IdleStateHandler构造器中,可以自定义readerIdleTime和writerIdleTime,设置读写空闲超时时间。
源码中,IdleStateHandler通过定时任务监控channelRead()和write()方法的调用,一旦超时,会执行userEventTrigger()。服务端仅响应客户端的心跳,避免大规模响应带来的资源浪费。然而,这样设计意味着客户端无法感知服务端的非正常下线,如网络故障。
为了实现双向心跳感知,可能需要在ChannelInactive()方法中进行补充,以应对非正常下线情况。总的来说,IdleStateHandler在Netty中负责维护连接的活性,但双向心跳机制在某些场景下更为全面。
nacosåç
nacosç®åæ¯éæå°spring cloud alibabaéå»çï¼ä¹å°±æ¯å¨spring cloudçæ åä¹ä¸å®ç°äºä¸äºä¸è¥¿ï¼spring cloudèªå·±æ¯æä¸ä¸ªæ¥å£ï¼å«åServiceRegistryï¼ä¹å°±æ¯æå¡æ³¨åä¸å¿çæ¦å¿µï¼nacosä¸æä¸ä¸ªå®çå®ç°ç±»NacosServiceRegistryï¼å®ç°äºregisterãderegisterãcloseãsetStatusãgetStatusä¹ç±»çæ¹æ³ã
èªå¨è£ é æ¯ä¸ä¸ªspring bootçä¸ä¸ªæ¦å¿µï¼èªå¨è£ é çææï¼å ¶å®å°±æ¯è¯´ç³»ç»å¯å¨çæ¶åï¼èªå¨è£ é æºå¶ä¼è¿è¡ï¼å®ç°ä¸äºç³»ç»çåå§åï¼èªå¨è¿è¡ï¼ä¹å°±æ¯ç³»ç»å¯å¨æ¶èªå¨å»è°ç¨NacosServiceRegistryçregisteræ¹æ³å»è¿è¡æå¡æ³¨åãèä¸é¤äºæ³¨åä¹å¤ï¼è¿ä¼éè¿schedule线ç¨æ± å»æ交ä¸ä¸ªå®æ¶è°åº¦ä»»å¡ï¼æºç å¦ä¸ï¼
this.exeutorService.schedule(new BeatReactor.BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS)ï¼è¿å°±æ¯ä¸ä¸ªå¿è·³æºå¶ï¼å®æ¶åéå¿è·³ç»nacos serverã
ç¶åä¼è®¿é®nacos serverçopen apiï¼å ¶å®å°±æ¯httpæ¥å£ï¼ä»æä¸ä¸ªæ¥å£ï¼http://...:/nacos/v1/ns/instance?serviceName=xx&ip=xx&port=xxï¼è¿ä¹ä¸ä¸ªä¸è¥¿ï¼ä¹æ²¡ä»ä¹ç¹å«çï¼è¿éå°±æ¯è®¿é®æ³¨åæ¥å£ç½¢äº
nacos serveré£éæ¯åºäºä¸ä¸ªConcurrentHashMapä½ä¸ºæ³¨å表æ¥æ¾æå¡ä¿¡æ¯çï¼ç´æ¥ä¼æé ä¸ä¸ªServiceæ¾å°mapéï¼ç¶å对Serviceå»addInstanceæ·»å ä¸ä¸ªå®ä¾ï¼æ¬è´¨éé¢å°±æ¯å¨ç»´æ¤ä¿¡æ¯ï¼åæ¶è¿ä¼å»ºç«å®æ¶æ£æ¥å®ä¾å¿è·³çæºå¶ãæåè¿ä¼åºäºä¸è´æ§åè®®ï¼æ¯å¦è¯´raftåè®®ï¼å»æ注ååæ¥ç»å ¶ä»èç¹ã
æå¡åç°çæ¬è´¨å ¶å®ä¹æ¯nacos serverä¸çä¸ä¸ªhttpæ¥å£ï¼å°±æ¯ï¼http://...:/nacos/v1/ns/instance/list?serviceName=xxï¼å°±è¿ä¹ä¸ä¸ªæ¥å£ï¼ç¶åå°±ä¼å¯å¨å®æ¶ä»»å¡ï¼æ¯ésæåä¸æ¬¡ææ°çå®ä¾å表ï¼ç¶åæå¡ç«¯è¿ä¼çå¬ä»æå¡çç¶æï¼æå¼å¸¸å°±ä¼åºäºUDPåè®®ååéç¥å®¢æ·ç«¯è¿æ¬¡æå¡å¼å¸¸åå¨ã