皮皮网

【手机配货发布源码】【icp备案接口源码】【键盘可以查看源码】心跳十五源码_15秒心跳

来源:在线祈福网站源码 时间:2024-12-24 02:20:57

1.nacos是心跳怎么进行服务注册的
2.Netty IdleStateHandler心跳机制
3.nacos原理

心跳十五源码_15秒心跳

nacos是怎么进行服务注册的

       今天,我们从源码的源码角度出发,看看nacos是秒心如果进行服务注册,服务调用,心跳负载均衡,源码心跳检测等功能。秒心手机配货发布源码首先大家我们去github上拉取代码,心跳/alibaba/nacos,源码打开后我们先从注册实例作为入口开始看,秒心注册实例的心跳接口在API模块:

服务注册

       点进去发现里面有不同的方法,我们以第一个为例,源码

       他是秒心先初始化一个Instance对象,赋值后调用registerInstance()方法,心跳通过clientProxy.registerService()去注册实例,源码继续往下追踪

       这个NamingClientProxy()接口有多个实现类(根据实现类的秒心名称我们看到他这里用了策略模式来处理HTTP还是RPC请求)我们先看HTTP实现类是如果处理的:

心跳检测发送

       关注下我圈起来的地方,这里就是心跳机制的开始喽,他先创建一个BeanInfo对象,然后交给beatReactor.addBeanInfo()这个方法。这个beatReactor看起来像个容器,icp备案接口源码那我们就去看一下他是怎么处理的。

       这个类有个定时任务线程池,看到这里,我们大概就猜得出他的心跳检测机制应该是通过定时任务线程池去处理的。然后我们再看他的addBeatInfo()方法做了什么?

       果然不出所料,先创建BeatTask对象然后交给定时任务线程池去定时处理这个实例信息,但是他的定时任务应该只执行一次呀,他是怎么一直不断的检测的呢,我们进BeatTask这个内部类看看他是键盘可以查看源码怎么循环处理的:

       通过这段代码我们可以清楚的看到他是通过在BeanTask的run()方法重复执行定时任务达到一直循环检测的需求。然后我们返回继续注册实例

       封装请求参数,调用API

       最后发送注册实例的HTTP请求,一个注册实例的完整链路就走完啦。

负载均衡

       我们看获取实例的时候nacos是怎么处理的

       先尝试从serviceInfoHolder获取服务信息如果没获取到,则通过clientProxy调用API去获取所有实例列表

       但是我只要一个,他应该返回我哪一个呢?注意这个Balancer.RandomByWeight.selectHost(serviceInfo);就是负载均衡的关键,

       最后从ref里面通过随机数获取一个实例返回。当然他的负载均衡有好几种策略。有轮询,.net简单论坛源码weight权重,ip_hash,fair,等。大家有兴趣的可以自己去翻一翻都是怎么实现的。

       最后如果有理解的不对的地方,欢迎大家指正纠正,一起进步。希望今天的ssh微信源码文章对小伙伴们有帮助。

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协议反向通知客户端这次服务异常变动。