每日一句:
编写 Java 开发包都是一群神人,拿 Java 源码来分析问题,我们无疑站在了巨人的肩膀上。所谓站得高,尿的远也。当然,所谓偷拍都是避免不了的
写在前面的话
经过了上节的介绍我们对Ribbon有了一个整体的认识,最起码知道了它是干什么用的 在微服务中扮演什么角色。这一点至关重要,因为我们知道它是做客户端负载的 肯定就会去想 它是怎么做负载的? 例如你会问 它是怎么选择服务器的?怎么动态更新服务列表的?怎么做重试策略的?等等!好了 从今天开始 我们带着这些问题去探索一下Ribbon是怎么处理的。
演示版本
我们知道Ribbon的最新版本是2.7.18 ,但是我们不用这个版本。我们选取版本的时候还要结合当前的大环境,什么大环境?当然是当之无愧的大哥大springcloud。我们翻阅了一下即使是当前最新的Hoxton.SR8版本 spring依然用的Ribbon2.3.0版本。值得注意的是 2.3.0版本还是强依赖Archaius的。如果对Archaius不是很熟悉的可以去看一下另一个专栏文章 你好Archaius!那有人又会问了: 你管他依赖什么版本呢 你选一个新的 在未来等着他!好想法,但是,但是上一篇不是说了嘛 人家SpringCloud要玩自己的了,嫡长子出生了怎么可能还把大权交给一个庶出的。所以我们依然选用2.3.0版本。
这里再多说一句,ribbon从2.4.0开始就不强依赖Archaius了。如果感兴趣 可以下面自己拉下来原来研究。
Ribbon初体验
话不多说 我们直接上代码给大家感受一下 怎么使用。大家不用搞清楚为什么这样写只需要有一个大致的印象 有这么个玩意。 总而言之就是给大家用代码演示他是干什么。我们后续章节会跟随我们的程序进入深入探索。
程序代码:
List<Server> serverList = new ArrayList<>();
serverList.add(new Server("www.coredy1.com", 1));
serverList.add(new Server("www.coredy2.com", 2));
serverList.add(new Server("www.coredy3.com", 3));
BaseLoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
for (int i = 0; i < 6; i++) {
LoadBalancerCommand<String> balancerCommand = LoadBalancerCommand.<String>builder()
.withLoadBalancer(loadBalancer).build();
ServerOperation<String> operation = server -> Observable.create(t->{
t.onNext(server.getHost());
t.onCompleted();
});
String single = balancerCommand.submit(operation).toBlocking().single();
System.out.println(single);
}
输出结果:
www.coredy2.com
www.coredy3.com
www.coredy1.com
www.coredy2.com
www.coredy3.com
www.coredy1.com
上面这一段代码我就不注释了
- serverList这个变量保存了我们所有备选的server,就是我们上一节说的客户端负载均衡是在本地维护了一个服务列表。
- BaseLoadBalancer是一个最基础的负载均衡器,仅提供基础的能力。我们把serverList交给负载均衡器。
- LoadBalancerCommand我们暂且可以把它理解成对一个请求的封装
- ServerOperation字面意思就是对server的操作。再挖深一点就是负载均衡器把选择好的Server给我们 我们拿着这个Server做什么。例如向这个Server发起Http请求?发TCP请求?这样是不是就通了?
用过Hystrix的同学都知道这个写法和Hystrix很像 都是使用命令模式来包装。没错 谁让别人是一家公司出的呢。
例子中看不出具体的负载均衡策略,当然如果真的看出了内部的策略 那说明对外的API封装的有问题,太复杂了 不友好。但是从结果我们知道负载均衡是生效了的,并且是轮询的策略,每台机器出现的概率都是均等的。
所以Ribbon是不是很简单,就是实现这么一个玩意。是不是心里在想就这么一个玩意还好意思单独拎出来搞个项目!其实暴露给用户的东西越简单内部实现越复杂。再说人家LB只是Ribbon其中的一个模块而已。(后面我们提到Ribbon默认就把ribbon等同于负载均衡了)
结束语
我们对Ribbon体验就到这,相信看demo 相信大家一定会有一些感触。值得注意的上面的demo我们后面还会不止一次的用到。