瓜农老梁

一个想分享点干货的家伙,微信公众号「瓜农老梁」

0%

引言

Nacos在Client选择节点时提供了一种基于权重的随机算法,通过源码分析掌握其实现原理,方便实战中加以运用。

内容提要

下面以图示的方式贯穿下随机权重负载均衡算法的流程:

节点列表

假设注册了5个节点,每个节点的权重如下。

阅读全文 »

引言

通过对Nacos注册与发现源码阅读,将其核心原理归纳提炼。包含:注册、发现、节点之间通信、健康检查类型。

服务注册原理

当客户端发起注册时,注册原理逻辑见下图,进一步简化主要有:

  • 将新注册的实例信息推送给订阅该服务的订阅者
  • 将新注册的实例信息增量同步给集群中的其他节点

阅读全文 »

背景介绍

前几天一个业务负责的同事找老梁,说每次发布SOA拉入时就有少量报错。

报错的集中在RPC设置超时时间比较短的上游服务,比如设置300ms,发布完就好了。

我说最近没有发布新版本,应该不是中间件变更引起的。

同事说这问题存在好几个月了,他们一直想抓原因,一直没找到。

你咋早点不反馈到我这呢?就自己这么琢磨了几个月,够执着的。

老梁让他组织个会议,拉了小组两个同事一起参与下,聚焦复盘下问题。

忘了说了,我们SOA框架使用gRPC通信,gRPC底层使用Netty。

问题复盘

GC 日志

从GC日志现象来看,在第4次和第5次Young GC的时间过长,线上达到了900ms。

在测试环境复现,第4次Young GC的时间也超过500ms。

阅读全文 »

引言

Nacos支持众多健康检查类型,心跳、HTTP、TCP、MySQL等类型,这些都作用于什么场景?他们又是如何事项的呢?本文就撸一撸这个。

内容提要

临时节点续约

  • 临时节点续约通过gRPC连接保鲜实现
  • 执行频率5秒一次
  • 检查结果健康刷新保鲜时间
  • 检查结果不可用标记节点不健康
  • 当节点不健康时重新连接时会从server列表选择下一个节点连接

持久节点心跳检测

  • 心跳执行器通过每隔五秒中向Nacos Server发起HTTP请求
  • 如果返回的server not found会向Nacos Server发起注册请求重新注册

持久节点探活

  • Nacos探活只有在持久节点注册时才会支持
  • 探活支持HTTP、TCP、Mysql三种探活类型
  • HTTP通过检测返回200状态码标记是否健康
  • TPC通过Channel连接方式标记是否健康
  • Mysql则保证当前节点为主节点,可用于主从切换场景
阅读全文 »

大家好,我是老梁,一个想分享点干货的家伙。

最近天天喝花枸杞决明子茶,有用没用的权当白开水喝着。

老梁坐电脑前跟大伙聊聊天,聊聊公司军规,各位随便看看。

初期

组织发展初期人不多物资也不丰富,人就这么点,要做的东西很多。

开发从前端到后端,从网关到存储,从公共组件到业务,最好都能顶上去干。

自然规矩也没那么多,很多时候自测上线的,线上有问题难避免。

生产环境有问题,上去干两把,直接替换包,先修复了再说。

没办法,就这点人,先充分调动大伙积极性先把事干了。

就像《亮剑》李云龙说的:

“我说旅长啊,我好歹也是堂堂正规军的团长,我不能连县大队都不如吧?”

“这不是砸咱们师的牌子嘛?你猜旅长怎么说?”

“旅长说,我有装备我要你干什么?你既然能当团长,就有能耐去搞枪,要不然你就回家抱孩子去!你别在这给我丢人显眼!”

“得鳓,我等的就是这句话!让我搞枪,没问题啊!可是你不能给我戴紧箍咒啊,对不对?”

“你总得给我点自主权吧,不能什么事都让你大旅长占了啊!又想让我搞枪,又想让我当乖孩子,这叫不讲理! ”

就像改革开发初期,需要努力抓住发展机遇,避免无效争论。

需要先解决国家经济薄弱和老百姓普遍贫困问题。

“不管黑猫白猫,捉到老鼠就是好猫”。

回顾下《秦孝公的招贤令》:

“…诸侯卑秦,丑莫大焉…寡人思念先君之意,常痛于心”。

“宾客群臣有能出奇计强秦者,吾且尊官,与之分土”。

秦孝公要强秦之策,至于儒家、法家、道家哪家学说不重要。

嗯,发展初期的首要问题是抓住机遇发展壮大。

阅读全文 »

引言

本文接着撸Distro协议,上文中分析了在Nacos server启动时会进行全量数据同步和数据校验,具体数据即客户端注册节点信息含命名空间、分组名称、服务名称、节点Instance信息等。什么时候会触发增量同步?增量同步都干了些啥,下文接着撸撸增量数据同步。

内容提要

增量数据同步

  • 在Nacos节点启动时通过事件驱动模式订阅了ClientChangedEvent、ClientDisconnectEvent和ClientVerifyFailedEvent事件
  • 当节点收到ClientChangedEvent事件时,会向集群中其他节点发送更新Client信息请求,其他节点收到后更新缓存
  • 当节点收到ClientVerifyFailedEvent事件时,向该Event指定的目标节点发起新增该Event指定的Client信息请求,目标节点收到后更新到自己缓存中
  • 当节点收到ClientDisconnectEvent事件时,会向集群中其他节点发送删除Client信息请求,其他节点收到后将该Client缓存删除

增量事件触发

  • 当有服务注册或者注销时会触发ClientEvent.ClientChangedEvent事件,即客户端调用naming.registerInstance或者naming.deregisterInstance
  • 定时任务每隔3秒钟定时检查缓存中的所有连接,如果超过保鲜期20秒则再次发起连接请求,连接未成功则注销关闭该连接并发布ClientEvent.ClientDisconnectEvent事件
  • Nacos集群之间通过每5秒发送心跳校验数据请求(具体为本节点负责Client信息),其他节点接受到校验请求,如果缓存中存在该client表示校验成功,同时更新保鲜时间;否则校验失败,回调返回失败Response,请求节点收到失败的Response后会发布ClientVerifyFailedEvent事件
阅读全文 »

引言

在《Nacos4# 服务端响应连接和注册源码分析(一)》在服务注册后发布了三个事件ClientEvent.ClientChangedEvent、ClientOperationEvent.ClientRegisterServiceEvent、MetadataEvent.InstanceMetadataEvent。这三个事件后来都干了点啥还没撸。

Nacos的CP协议使用Distro,中间穿插了几篇关于该协议的主要逻辑,本文接着撸服务端响应。

内容提要

ClientRegisterServiceEvent事件

  • 当注册请求到服务端时,服务端会给订阅该服务的Clients发送推送请求,通知实例变了

  • 当注册请求到服务端时,服务端发布了客户端注册事件ClientRegisterServiceEvent

  • ClientRegisterServiceEvent事件被ClientServiceIndexesManager订阅后发布服务变更事件ServiceChangedEvent

  • ServiceChangedEvent被NamingSubscriberServiceV2Impl订阅,创建PushDelayTask被PushExecuteTask执行,负责向订阅该服务的订阅者发起推送serviceInfo请求

  • 推送的请求被NamingPushRequestHandler处理并发布InstancesChangeEvent,最终回调到我们的代码逻辑AbstractEventListener

ClientChangedEvent 事件

  • 当注册请求到服务端时,该节点会向集群中其他节点增量同步新增的Client信息

  • 当注册请求到服务端时,发布ClientChangedEvent事件

  • 该事件被DistroClientDataProcessor订阅发起与其他节点的增量同步

InstanceMetadataEvent事件

  • 当注册请求到服务端时,发布ClientChangedEvent事件,属性expired为false
  • NamingMetadataManager订阅了该事件主要判断元数据是否过期
阅读全文 »

引言

当新的节点加入集群或者集群中有节点下线了,集群之间可以通过健康检查发现。健康检查的频率是怎么样的?节点的状态又是如何变动的?状态的变动又会触发什么动作。带着这些问题本文捋一捋。

内容提要

健康检查

  • Nacos节点会向集群其他节点发送健康检查心跳,每一轮频率为2秒
  • 当健康检查异常时设置为不信任「SUSPICIOUS」状态,超过失败最大次数3次设置为下线「DOWN」状态
  • 健康检查成功设置该节点为科通信「UP」状态
  • 无论成功还是失败当节点状态变更时均发布MembersChangeEvent事件

成员变更事件

  • 当集群节点成员变更时,MemberChangeListener会收到该事件
  • 例如回调ClusterRpcClientProxy#onEvent触发refresh
  • 刷新本节点与集群中其他节点的RPC状态,关闭无效的或者增加新的RPC连接
阅读全文 »

引言

本文接着撸Distro协议,上文中分析了寻址模式。有了地址就要建立连接,有了连接就能通信了。集群之间都交互啥数据?本文就扒一扒全量同步和节点之间数据校验。

内容提要

节点间建立RCP连接

  • 订阅了MembersChangeEvent事件,集群节点有变更能够收到回调通知
  • 与集群中其他节点建立grpc连接并缓存到Map其中key格式为「Cluster-IP:Port」

节点间校验数据通信

  • 节点之间发送校验数据是在全量同步后进行的
  • 发送校验的频率默认为5秒钟一次
  • 校验数据包括clientId和version,其中version为保留字段当前为0
  • 接受到校验数据后如果缓存中存在该client表示校验成功,同时更新保鲜时间,否则校验失败

全量数据同步

  • 在节点启动时会从集群中其他节点中的一个节点同步快照数据并缓存在Map中
  • 缓存的数据类型分类两类分别为HTTP和gRPC
  • 具体数据即客户端注册节点信息含命名空间、分组名称、服务名称、节点Instance信息等
  • 集群中每个节点都拥有所有的快照数据
阅读全文 »

大家好,我是老梁,一个想分享点干货的家伙。

喝了一杯菊花枸杞决明子茶,这茶喝起来没啥味道,据说有清肝明目功效。

老梁坐电脑前跟大伙聊聊天,各位随便看看。

咳嗽

咋不喝鸡尾酒了呢?

前段时间咳嗽跑到三甲医院挂了专家号,专家开了一个多月药,叮嘱说把他开的要都吃光。

专家说的话,能不听吗?老梁就天天吃,吃了一个多月终于都给吃光了。

药吃光了,病没好,一吹风就咳两声。

是药不管用还是药不对病呢?还是身体不行了?

身体也不至于呀!

老梁虽然平时没时间锻炼,但每天基本能走1万步以上。

每周六周天各跑3.5公里,一周也有7公里了。

总之,咳嗽没好。

旧的没好新的又开始了,扁桃体又开始发炎,咳嗽前兆!

跑到大药房,卖药的小姑娘,说让喝点蒲公英颗粒。

老梁买了四天的,喝了三天,扁桃体发炎好了,咳嗽也好了。

得谢谢小姑娘这药,比三甲医院的专家开的管用。

嗯,一个小咳嗽就能折腾你两月,天道有常,多一分敬畏。

阅读全文 »