客户端负载均衡—Ribbon初探
一、什么是Ribbon
Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用
二、为服务消费者整合Ribbon
1、引入依赖:spring-cloud-starter-ribbon(spring-cloud-starter-eureka中已包含了ribbon)
2、为RestTemplate添加@LoadBalanced注解
3、将请求地址修改为虚拟主机名,Ribbon会自动把虚拟主机名映射称网络地址(默认情况下,虚拟主机名和服务名称是一样的,也可以通过配置属性eureka.instance.virtual-host-name或者eureka.instance.secure-virtual-host-name。虚拟主机名不能包含下划线)
#在RestTemplate上加上@LoadBalanced注解 @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } //修改controller内的方法,将请求地址从url改为微服务的虚拟名 @GetMapping("/user/{id}") public User findById(@PathVariable Long id) { //VIP:virtual IP return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class); }
三、利用java代码自定义Ribbon配置
IClientConfig:Ribbon 的客户端配置,默认采用 com.netflix.client.config.DefaultClientConfigImpl 实现。
IRule:Ribbon 的负载均衡策略,默认采用 com.netflix.loadbalancer.ZoneAvoidanceRule 实现,该策略能够在多区域环境下选择最佳区域的实例进行访问
IPing:Ribbon 的实例检查策略,默认采用 com.netflix.loadbalancer.NoOpPing 实现,该检查策略是一个特殊的实现,实际上他并不会检查实例是否可用,而是始终返回 true ,默认认为所有服务实例都是可以使用
ServerList<Server>:服务实例清单的维护机制,默认采用 com.netflix.loadbalancer.ConfigurationBasedServerList 实现。
ServerListFilter<Server>:服务实例清单过滤机制,默认采用 org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter 实现,该策略能够优先过滤出与请求调用方处理同区域的服务实现
ILoadBalancer:负载均衡器,默认采用 com.netflix.loadbalancer.ZoneAwareLoadBalancer 实现,他具备了区域感知的能力
//该类为Ribbon配置类 //该类不应该在主应用程序上下文的@ComponentScan中,否则该类中的配置信息就会被所有的@RibbonClient共享 @Configuration public class RibbonConfiguration{ @Bean public IRule ribbonRule(){ return new RandomRule(); } } //空类,添加@Configuration和@RibbonClient注解 @Configuration @RibbonClient(name = "microservice-provider-user",configuration = "RibbonConfiguration.class") public class TestConfiguration{ }
四、使用属性自定义Ribbon配置
<clientName>.ribbon.为前缀:
#预加载配置,默认为懒加载 ribbon: eager-load: enabled: true clients: mima-cloud-producer,mima-cloud-producer2 #这里使用服务提供者的instanceName mima-cloud-producer: ribbon: # 代表Ribbon使用的负载均衡策略 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 每台服务器最多重试次数,但是首次调用不包括在内, Max number of retries on the same server (excluding the first try) MaxAutoRetries: 1 # 最多重试多少台服务器,Max number of next servers to retry (excluding the first server) MaxAutoRetriesNextServer: 1 # 无论是请求超时或者socket read timeout都进行重试,Whether all operations can be retried for this client OkToRetryOnAllOperations: true # Interval to refresh the server list from the source ServerListRefreshInterval: 2000 # Connect timeout used by Apache HttpClient ConnectTimeout: 3000 # Read timeout used by Apache HttpClient ReadTimeout: 3000 mima-cloud-producer2: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
microservice-provider-user:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
五、脱离Eureka使用Ribbon
由于脱离了Eureka,微服务不再缓存服务列表,所以需要在配置文件中配置可访问的服务列表
server: port: 8010 spring: application: name:microservice-consumer-movie microservice-provider-user; ribbon: listOfServers: localhost:8000,localhost:8001
六、相关中间件
Nacos Discovery
内部默认集成了Ribbon
,集成的方式跟Eureka
几乎一致