Ribbon介绍:https://www.jianshu.com/p/1bd66db5dc46
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
•消费者客户端导入依赖
1 <!--Ribbon--> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-ribbon</artifactId> 5 <version>1.4.6.RELEASE</version> 6 </dependency>
<!--erueka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
•编写配置
1 server: 2 port: 80 3 4 #Eureka配置 5 eureka: 6 client: 7 register-with-eureka: false #不向Eureka注册自己 8 service-url: 9 defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
•开启功能 启动类
@EnableEurekaClient
•配置负载均衡
•controller配置访问地址
1 //Ribbon。我们这里的地址,应该是一个变量,通过服务名来访问 2 private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
注意:这里想使用Application的名字来代替具体地址访问,必须要加注解@LoadBalanced负载均衡
•测试
Ribbon:使用Ribbon实现负载均衡
•创建多个服务提供者,复制7001的pom 导入依赖
•复制7001里面的项目
•测试
如果项目反复检查没错,但是测试不对,可以尝试重启在测试。
•开启消费者访问,第一次访问8001,第二次访问8003,第三次访问8002,根据UP里面的顺序依次访问
Ribbon:自定义负载均衡算法
1 // IRule 2 // RoundRobinRule 轮询 3 // RandomRule 随机 4 // AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~ 5 // RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
•默认是RoundRobinRule轮询
•修改为随机,前提负载均衡以开启@LoadBalanced
@Bean public IRule myRule(){ return new RandomRule(); //随机 }
•自己定义Ruble,开启Ribbon
1 package com.kuang.myrule; 2 3 import com.netflix.client.config.IClientConfig; 4 import com.netflix.loadbalancer.AbstractLoadBalancerRule; 5 import com.netflix.loadbalancer.ILoadBalancer; 6 import com.netflix.loadbalancer.Server; 7 8 import java.util.List; 9 import java.util.concurrent.ThreadLocalRandom; 10 11 /** 12 * A loadbalacing strategy that randomly distributes traffic amongst existing 13 * servers. 14 * 15 * @author stonse 16 * 17 */ 18 public class KuangRandomRule extends AbstractLoadBalancerRule { 19 //每个机器访问五次,换下一个服务 20 21 private int total=0;//被调用的次数 22 private int currentIndex=0;//当前是谁在提供服务 23 //@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE") 24 public Server choose(ILoadBalancer lb, Object key) { 25 if (lb == null) { 26 return null; 27 } 28 Server server = null; 29 30 while (server == null) { 31 if (Thread.interrupted()) { 32 return null; 33 } 34 List<Server> upList = lb.getReachableServers();//获得活着的服务 35 List<Server> allList = lb.getAllServers();//获得全部的服务 36 37 int serverCount = allList.size(); 38 if (serverCount == 0) { 39 return null; 40 } 41 42 // int index = chooseRandomInt(serverCount);//生成区间随机数 43 // server = upList.get(index);//从活着的服务中,随机获取一个 44 if (total<5){ 45 server=upList.get(currentIndex); 46 total++; 47 }else { 48 total=0; 49 currentIndex++; 50 if (currentIndex>upList.size()){ 51 currentIndex=0; 52 } 53 server=upList.get(currentIndex);//从活着的服务中心,获取指定的服务来进行操作 54 } 55 56 57 if (server == null) { 58 Thread.yield(); 59 continue; 60 } 61 62 if (server.isAlive()) { 63 return (server); 64 } 65 66 server = null; 67 Thread.yield(); 68 } 69 70 return server; 71 72 } 73 74 protected int chooseRandomInt(int serverCount) { 75 return ThreadLocalRandom.current().nextInt(serverCount); 76 } 77 78 @Override 79 public Server choose(Object key) { 80 return choose(getLoadBalancer(), key); 81 } 82 83 @Override 84 public void initWithNiwsConfig(IClientConfig clientConfig) { 85 // TODO Auto-generated method stub 86 87 } 88 }
package com.kuang.myrule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class KuangRule {
@Bean
public IRule myRule(){
return new KuangRandomRule();//默认KuangRandomRule轮询
}
}