Ribbon是一个开源的客户端负载均衡器,由Netflix发布,是SpringCloud-Netflix中重要的一环,通过它将Netflix的中间层服务连接在一起。
Ribbon客户端组件提供一系列完善的配置项,如连接超时、重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的服务,Ribbon会自动的基于某种规则(如简单轮询,随机连接等)去连接这些服务,也很容易实现自定义的负载均衡算法。
Ribbon是在客户端来实现负载均衡的访问服务,主要的功能点:
1:服务发现,发现依赖服务的列表
2:服务选择规则,在多个服务中如何选择一个有效服务
3:服务监听,检测失效的服务,高效剔除失效服务
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
先不要加Eureka的starter
官方的HelloWorld
具体示例参看:
https://github.com/Netflix/ri...对于Ribbon参数的key以及value类型的定义,可以通过com.netflix.client.config.CommonClientConfigKey查看
如果你没有配置任何属性,则ribbon会使用com.netflix.client.config.DefaultClientConfigImpl里的值
Ribbon的参数配置通常有二种方式:全局配置以及指定客户端配置
其中,<key>代表了Ribbon客户端配置的参数名,<value>则代表了对应参数的值。
比如,可以向下面这样配置Ribbon的超时时间:
ribbon.ConnectTimeout=250
全局配置可以作为默认值进行设置,当指定客户端配置了相应的key的值时,将覆盖全局配置的内容
<client>.ribbon.<key>=<value>的格式进行配置
<client>表示服务名,比如没有服务治理框架的时候(如Eureka),需要指定实例清单,如:userService.ribbon.listOfServers=localhost:8080
还有:
这些组件可以以编程方式设置,也可以是客户端配置属性的一部分,并通过反射创建。
支持的属性如下所示,应以<clientName>.ribbon.为前缀:
都在com.netflix.loadbalancer包下面
1:RoundRobinRule:轮询规则
2:RandomRule:随机获取一个服务
3:AvailabilityFilteringRule
这个负载均衡器规则,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
4:WeightedResponseTimeRule 根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大、被选中的概率越高。刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule。
5:RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务
6:BestAvailableRule 此负载均衡器会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
7:ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择server
都在com.netflix.loadbalancer包下面
1:DummyPing:默认实现,默认返回true,即认为服务永远活着
2:NIWSDiscoveryPing 不执行真正的ping。如果Discovery Client认为是在线,则程序认为本次心跳成功,服务活着
3:PingUrl 此组件会使用HttpClient调用服务的一个URL,如果调用成功,则认为本次心跳成功,表示此服务活着。
4:NoOpPing:永远返回true,即认为服务永远活着
ServerList,常用实现有以下几种:
都在com.netflix.loadbalancer包下面
1:ConfigurationBasedServerList,从配置文件中获取所有服务列表,也是静态获取服务列表,配置例子:sample-client.ribbon.listOfServers=
2:DiscoveryEnabledNIWSServerList
从Eureka Client中获取服务列表。此值必须通过属性中的VipAddress来标识服务器集群。DynamicServerListLoadBalancer会调用此对象动态获取服务列表
3:DomainExtractingServerList:代理类,根据ServerList的值实现具体的逻辑
在SpringCloud中使用的HelloWorld
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
可以不用加入Ribbon依赖,因为Eureka的starter里面包含了ribbon
提供RestTemplate,示例如下:
@Bean @LoadBalanced public RestTemplate rt(){ return new RestTemplate(); }
rt.getForObject("http://userService/userServiceProvider?name=cc", String.class);
常用实现有以下几种:
都在com.netflix.loadbalancer包下面
<clientName>.ribbon.EnableZoneAffinity=true
myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList # the server must register itself with Eureka server with VipAddress "myservice" myClient.ribbon.DeploymentContextBasedVipAddresses=myservice myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListSubsetFilter # only show client 5 servers. default is 20. myClient.ribbon.ServerListSubsetFilter.size=5
ServerListUpdater,常用实现有以下几种:
都在com.netflix.loadbalancer包下面
常用实现有以下几种:
com.netflix.client.config.DefaultClientConfigImpl IClientConfig的默认实现
常用实现有以下几种:
都在com.netflix.loadbalancer包下面
SpringCloud通过整合Spring retry来增强RestTemplate的重试能力,对于开发者来说,只需要简单配置,即可完成重试策略,配置示例如下:
//该参数用来开启重试机制,它默认是关闭的
spring.cloud.loadbalancer.retry.enabled=true //断路器的超时时间需要大于Ribbon的超时时间,不然不会触发重试 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 //请求连接超时时间 userService.ribbon.ConnectTimeout=250 //请求处理的超时时间 userService.ribbon.ReadTimeout=1000 //对所有操作请求都进行重试 userService.ribbon.OkToRetryOnAllOperations=true //切换实例的重试次数 userService.ribbon.MaxAutoRetriesNextServer=2 //对当前实例的重试次数 userService.ribbon.maxAutoRetries=1
注解@RibbonClient,这样做的目的是为了在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效,形如:
@RibbonClient(name="userService",configuration=MyConf2.class)