SpringCloud服务治理(四)服务续约

499 阅读3分钟

心跳续约存在的问题:

1,如果服务存在网络发生几秒内网络抖动,恰好设置心跳为5s上传,注册中心会错误以为服务已下线。

2,如果服务发生大量fullgc,导致心跳包不能及时上传,注册中心也会错误以为服务以下线。

3,如果10万或者更多服务需要续约,很容易导致注册中心奔溃。

改进方式:

1,不使用tcp活性心跳续约,注册中心主动探活服务,调用healcheck方法。

2,自研健康检查中间件,或者使用更有解决方案。

3,服务的健康检测自定义,健康逻辑服务自定义。

nacos官方解决方案:

健康保护阈值

为了防止因过多实例 (Instance) 不健康导致流量全部流向健康实例 (Instance) ,继而造成流量压力把健康 健康实例 (Instance) 压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例 (Instance) 占总服务实例 (Instance) 的比例小于该值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。

压测结果分析:

1. 注册实例

Nacos服务发现注册实例接口的性能,调用HTTP接口测试。 实测3节点集群不同压力下的性能表现:

2. 查询实例

Nacos服务发现注册实例接口的性能,调用HTTP接口测试。 实测3节点集群不同压力下的性能表现:

3.注销实例

Nacos服务发现注册实例接口的性能,调用HTTP接口测试。 实测3节点集群不同压力下的性能表现:


测试结论

Nacos服务发现性能测试都是针对重点功能,通过对3节点规模集群进行压测,可以看到接口性能负载和容量。

  1. 压测容量服务数可达60W,实例注册数达110W,集群运行持续稳定,达到预期;(注: 由于本次注册实例使用的是HTTP接口, 并没有将心跳上报的TPS包括在内, 如果要支持百万实例的心跳上报, 需要集群水平扩容, 并调优tomcat和内核参数)
  2. 注册/查询实例TPS达到 13000 以上,接口达到预期;

注:通过以上方式,官方出解决方案为,在面对海量心跳时,水平扩容,自研的话可以考虑自己设计健康检查中间件。

nacos服务续约源码解析

1,处理心跳请求

2,更新心跳时间

3,心跳5s检查未上来下线服务

4,nacos心跳构建

NamingService naming = NamingFactory.createNamingService(properties);

新建beatreactor

创建BeatProcessor

心跳请求