SpringCloud-Ribbon

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轮询
}
}
 

 

  

原文地址:https://www.cnblogs.com/Spring-M/p/12774806.html