Spring Cloud Ribbon是基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过SpringCloud的封装,可以让我们实现将面向服务的REST模块请求自动转换成客户端负载均衡的服务调用。
通过一次消费流程描述ribbon在微服务的角色和作用,消费者(order-service)调用服务者(user-service)向外暴露的接口。在springcloud中具体的请求流程图如下
消费者(order-service)发起请求到ribbon,ribbon发起服务调用到eureka-server拉取服务列表信息,接收到列表信息之后ribbon根据负载均衡策略选中列表中的可用服务,向服务提供方发起请求。从上图可以看出,ribbon的作用就是从eureka注册中心拿到服务列表serverList,然后根据当前的负载均衡算法选中一个服务进行http远程调用。
在一个微服务远程调用过程中,我们可以通过debug进行断点追踪来确定ribbon的负载均衡是如何实现的,如下图所示在代码执行追踪过程中我们能看到起到服务调用和选择的类为RibbonLoadBanlancerClient,通过传递请求url中的服务ID(userservice),调用DynamicServerListLoadBanlancer访问eureka- server拉取到userservice的服务注册列表,再调用IRule接口实现对列表中服务的选择,从而实现负载均衡。
通过以上过程,可以看出决定负载均衡策略的实际上就是IRule接口,下面对IRule 接口进行一个简单的分析。当前ribbon已经实现的接口入口如下图所示,在不同的场景下可以选择应用。
对ribbon实现原理有了一个简单的认识之后,下面进行负载均衡的配置说明,在没有任何配置的情况下,系统会默认一种负载均衡策略(可以理解为一种轮询),我们可以根据业务需求对负载均衡的策略进行自定义管理,从两个维度进行管理。
代码方式,在消费者的启动类中,定义一个新的Rule,这种配置方式为全局维度上进行服务调用的负载均衡配置,无论调用哪个服务提供者都会采用同样的策略进行访问。
- @Bean
- public IRule randomRule(){
- return new RandomRule();
- }
配置方式,在order-service的application.yml文件中,添加新的配置修改规则。这种配置方式可以指定针对性的对不同的服务组件配置不同的访问策略
- userservice:
- ribbon:
- NFLoadBalangerRuleClassName:com.netflix.Loadbalancer.RandomRule #负载均衡规则
ribbon 默认为懒加载,即在服务第一次被调用的时候才会加载服务信息,可以通过配置将指定的服务进行饥饿加载来提供第一次访问的效率。
- ribbon:
- eager-Load:
- enabled:true #开启饥饿加载
- clients:userservice #指定userservice这个服务饥饿加载
往期推荐:
SpringCloud-微服务拆分、服务远程调用
——————————————————
关注微信公众号「BaseJ」,收看更多专题内容