- 服务调用端负载均衡--Ribbon
Ribbon 是 Netflix 发布的开源项目,主要功能是为 REST 客户端实现负载均衡,可以很好的控制http和tcp的一些行为。它主要包括六个组件:
- ServerList,负载均衡使用的服务器列表。这个列表会缓存在负载均衡器中,并定期更新。当 Ribbon 与 Eureka 结合使用时,ServerList 的实现类就是 DiscoveryEnabledNIWSServerList,它会保存 Eureka Server 中注册的服务实例表。
- ServerListFilter,服务器列表过滤器。这是一个接口,主要用于对 Service Consumer 获取到的服务器列表进行预过滤,过滤的结果也是 ServerList。Ribbon 提供了多种过滤器的实现。
- IPing,探测服务实例是否存活的策略。
- IRule,负载均衡策略,其实现类表述的策略包括:轮询、随机、根据响应时间加权等.其类结构如下图所示。
- ILoadBalancer,负载均衡器。这也是一个接口,Ribbon 为其提供了多个实现,比如 ZoneAwareLoadBalancer。而上层代码通过调用其 API 进行服务调用的负载均衡选择。一般 ILoadBalancer 的实现类中会引用一个 IRule。
6.RestClient,服务调用器。顾名思义,这就是负载均衡后,Ribbon 向 Service Provider 发起 REST 请求的工具。
Ribbon 工作时会做四件事情:
- 优先选择在同一个Zone且负载少的Eureka Server
- 定期从Eureka更新并过滤服务实例列表
- 根据用户指定的策略,在从Server取到的服务注册列表中选择一个实例的地址
- 通过RestClient进行服务调用
使用restTemplate+Ribbon调用服务(基于前面一篇Eureka的demo实现)
1.准备注册中心,并注册多个实例
这里我已准备好一个服务注册中心eureka-server(端口7000):
注册了两个服务实例(实际上是一个实例eureka-producer,只是修改了服务端口,相当于是多实例启动),端口分别是7001和7002:
2.创建一个服务消费者
其中需要注意的是service-ribbon的pom.xml中一定得有eureka-client,web,ribbon的依赖
3.添加配置文件(端口7004,服务名:service-ribbon):
注册服务
启动类中添加注解@EnableEurekaClient像服务中心注册,并注入一个bean:restTemplate,通过@LoadBalanced注解表示这个restTemplate开启负载均衡的功能。
4.启动并测试
写一个类RibbonService,通过之前注入容器的restTemplate来消费服务eureka-producer的”/helloEureka”接口,在这里我直接用服务名代替了具体的url地址,在ribbon中它会根据具体的服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名。
编写一个controller类,调用service的方法
启动服务并访问(http://localhost:7004/helloRibbon?name=ribbon)。
可以看到注册中心的服务:
多次刷新浏览器访问,在后台的控制台可以看到是轮询访问端口为7001和7002两个服务的,这说明当我们通过调用restTemplate.getForObject(“http://service-producer/helloEureka?name=”+name,String.class)方法时,已经做了负载均衡,访问了不同的端口的服务实例。
源码地址:https://github.com/wxkhz/springcloud
参考大佬博客:https://blog.csdn.net/forezp/article/details/81040946