zoukankan      html  css  js  c++  java
  • 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轮询
    }
    }
     

     

      

  • 相关阅读:
    改造vue-quill-editor: 结合element-ui上传图片到服务器
    webpack2.X、Vue学习以及将两者相结合
    Vuex-一个专为 Vue.js 应用程序开发的状态管理模式
    vue深究第一弹:computed与watch的异同
    管理系统列表和详情配置
    Vue和vue-template-compiler版本之间的问题
    vuex 闲置状态重置方案
    mac install brew
    Android——推断Service是否已经启动
    【android】uses-permission和permission具体解释
  • 原文地址:https://www.cnblogs.com/Spring-M/p/12774806.html
Copyright © 2011-2022 走看看