1 简介
Ribbon是Netflix发布的负载均衡器,为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,
原理图
2 Ribbon基础应用
修改上上篇博客中的服务者消费项目
在pom文件中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
yml文件添加
eureka:
client:
register-with-eureka: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
service-url:
defaultZone: http://2001服务器ip:2001/eureka/,http://2003服务器ip:2002/eureka/,http://2003服务器ip:2003/eureka/ # 集群
注:这里的defaultZone同上篇博客的服务提供者的集群配置
SpringCloudConfig类需加个负载均衡注解 @LoadBalanced
启动类也需要加个注解@EnableEurekaClient
然后服务提供者配置下服务名
然后这里的名字对应上
先启动
再启动
最后启动输入请求地址即可
3 Ribbon负载均衡
新建项目springcloudStudentProvider1007、springcloudStudentProvider1009(同springcloudStudentProvider1008一样)
复制springcloudStudentProvider1008中Java类、pom文件、yml文件
启动类名称对应的改下
yml配置文件有两处要对应的改下,port端口改下,以及服务实例名称改下
测试:
先启动三个eureka集群,再启动三个服务提供者集群;
先测试服务提供者:
http://localhost:1007/student/list
http://localhost:1008/student/list
http://localhost:1009/student/list
没问题再测试 eureka:
http://2002服务器ip:2003/eureka/
http://2002服务器ip:2003/eureka/
http://2003服务器ip:2003/eureka/
没问题然后再启动服务消费者输入地址调用即可,多刷新几次会发现会轮询调用提供者1007、1008、1009,但是有个缺陷,比如挂了一个提供者,那就会用1/3的几率调用失败
解决办法:
ribbon默认给我们提供的策略
默认有7个策略
自定义策略
在服务消费者项目的SpringCloudConfig类中
添加
/**
* 自定义轮询算法
* @return
*/
@Bean
public IRule myRule(){
return new RetryRule();
}
自定义选择这种策略,当消费者调用服务提供者时候,那么在前几轮中还会继续调用其中一个挂掉的服务提供者,经过几轮调用后还发现那个挂掉的提供者没恢复那么就不会再继续调那个挂掉的提供者了。