最近大家通关了服务治理,这么晦涩的概念都被我们玩转了,简直觉得自己牛到不行,走起路来都虎虎生风。新章节新气象,我们接下来趁热打铁,快速通关Ribbon!前面我们了解了负载均衡的含义,以及客户端和服务端负载均衡模型,接下来我们就来看下SpringCloud下的客户端负载均衡组件Ribbon的特点以及工作模型。
话说大家小时候有没有看过《圣斗士星矢》这部动画片?看过的同学可有福了,因为在这一章你将比别的同学学的更快!什么,这都没看过?你的童年都浪费在学java上了吗?还不赶紧去做好课前预习?!

负载均衡工具箱

Ribbon体系架构解析 - 图1
图片来自于动漫《圣斗士星矢》,图片版权归属原作者
《圣斗士星矢》是一部贯穿老师童年的动画片,它讲述了五个怎么也打不死的人,把其他人全部都打死的过程(突然发现童年好无聊)。在这部片子中,最厉害的装备叫做黄金圣衣,总共有12件,分别对应十二星座。这十二件中最传奇,最特殊的当属天秤座黄金圣衣,和其他圣衣相比他有以下几个特点:

  1. 丰富的组件库 整套圣衣由12件兵器组成,不管你是煎炸烹炒,都有合适的组件供你选择
  2. 给谁都能用 适配性好,跟谁都能搭配,片子里的五小强,谁拿都能用

在SpringCloud的世界观中,如果也要打造一件一模一样的天秤座圣衣,那一定是非Ribbon莫属了,它也有一模一样的特点:

  1. 丰富的组件库 整套负载均衡由7个具体策略组成,不管你是什么特殊需求,都有合适的策略供你选择
  2. 给谁都能用 适配性好,跟谁都能搭配,SpringCloud里的五小强(eureka,feign,gateway,zuul,hystrix),谁拿都能用。

更牛的是Ribbon可以脱离SpringCloud应用在一般项目中。

走近Ribbon

刚才说到Ribbon给谁都能用,要不先让带头大哥Eureka试试?同学们注意了,红框白底的是Ribbon自己的组件。
Ribbon体系架构解析 - 图2
一个HttpRequest发过来,先被转发到Eureka上。此时Eureka仍然通过服务发现获取了所有服务节点的物理地址,但问题是他不知道该调用哪一个,只好把请求转到了Ribbon手里。

  • IPing IPing是Ribbon的一套healthcheck机制,故名思议,就是要Ping一下目标机器看是否还在线,一般情况下IPing并不会主动向服务节点发起healthcheck请求,Ribbon后台通过静默处理返回true默认表示所有服务节点都处于存活状态(和Eureka集成的时候会检查服节点UP状态)。
  • IRule 这就是Ribbon的组件库了,各种负载均衡策略都继承自IRule接口。所有经过Ribbon的请求都会先请示IRule一把,找到负载均衡策略选定的目标机器,然后再把请求转发过去。

Ribbon的体系架构相对简单,职责也比较单一,只应用于负载均衡,知识点不多,因此特别适合快速通关。考虑到Ribbon和Hystrix以及Feign有千丝万缕的关系,因此,关于Ribbon的retry部分知识,我将放到Feign和Hystrix中来展开。
体育委员:负载均衡听起来那么高大上的东西,原来so easy,有点小失望
半仙老师:年轻人你狠骄傲啊,要不老师带你学习一下软件+硬件双端负载均衡的F5+BigIP技术?老师的公司一直在用,首先你要具备。。。。
体育委员:还是不要再说下去了,这么难的东西,老师应该也不会吧?
半仙老师:年轻人悟性不错,那就下课吧

小结

这一节我们学习了Ribbon的基本工作模式(IPing + IRule),下一小节就带大家创建一个Ribbon的消费者,对服务节点进行调用。
学习心得Tips: 阅读开源项目源码是一个快速提高代码能力的途径,如果你平时很少深入研究大型开源项目,不知道从哪里下手,那么建议你先从一些小型开源项目入手,Ribbon这种短小精悍的组件就是一个不错的选择。源码阅读不光要理解这个项目的骨架,包括运用一系列设计模式的组合达到单一职责、开闭原则等编码准则,也要去理解细枝末节中的编码技巧,比如Ribbon章节中源码阅读环节会涉及到的自旋锁+CAS操作,当这类编程小技巧积少成多,相信一定会让你的代码能力上一个台阶。