zoukankan      html  css  js  c++  java
  • springcloud Ribbon自定义负载均衡插件

    现在我们通过插件的方式添加新的一种策略。

     

    package com.zhuyang.config;  
      
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.context.annotation.Bean;  
      
    import com.netflix.client.config.IClientConfig;  
    import com.netflix.loadbalancer.IPing;  
    import com.netflix.loadbalancer.IRule;  
    import com.netflix.loadbalancer.PingUrl;  
    import com.netflix.loadbalancer.RandomRule;  
      
    /** 
     *  
     * Here, we override the IPing and IRule used by the default load balancer. The 
     * default IPing is a NoOpPing (which doesn’t actually ping server instances, 
     * instead always reporting that they’re stable), and the default IRule is a 
     * ZoneAvoidanceRule (which avoids the Amazon EC2 zone that has the most 
     * malfunctioning servers, and might thus be a bit difficult to try out in our 
     * local environment). 
     *  
     */  
    @Configuration public class RibbonConfiguration { @Bean public IClientConfig ribbonPing(){ IClientConfig config = new DefaultClientConfigImpl(); return config; } @Bean public IRule ribbonRule(IClientConfig config) { return new MyRule(); } }  

    MyRule.java是自己定义的个算法,大概算法是随机选中能被2整除的server

     
    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.Random;  
      
    import com.netflix.client.config.IClientConfig;  
    import com.netflix.loadbalancer.AbstractLoadBalancerRule;  
    import com.netflix.loadbalancer.ILoadBalancer;  
    import com.netflix.loadbalancer.Server;  
      
    /** 
     * 自定义rule插件 
     *  
     * @author zhu yang 
     * 
     */  
    public class MyRule extends AbstractLoadBalancerRule {  
        /** 
         * 选择能被2整除的server 
         *  
         * @param lb 
         * @param key 
         * @return 
         */  
        public Server choose(ILoadBalancer lb, Object key) {  
            if (lb == null) {  
                return null;  
            }  
            Server server = null;  
      
            while (server == null) {  
                if (Thread.interrupted()) {  
                    return null;  
                }  
                List<Server> upList = lb.getReachableServers();  
                System.out.println("upList=" + upList);  
                List<Server> allList = lb.getAllServers();  
                System.out.println("allList=" + allList);  
                int serverCount = allList.size();  
                if (serverCount == 0) {  
                    /* 
                     * No servers. End regardless of pass, because subsequent passes 
                     * only get more restrictive. 
                     */  
                    return null;  
                }  
                if (serverCount < 2) {  
                    server = upList.get(0);// if only 1 server. return  
                    return server;  
                }  
                List<Server> newList = new ArrayList<Server>();  
                for(int i=0;i<upList.size();i++){//create a new list to store the server index %2==0  
                    if(i%2==0){  
                        newList.add(upList.get(i));  
                    }  
                }  
                Random rand=new Random();  
                int newListCount=newList.size();  
                int index = rand.nextInt(newListCount);  
                server = newList.get(index);  
      
                if (server == null) {  
                    /* 
                     * The only time this should happen is if the server list were 
                     * somehow trimmed. This is a transient condition. Retry after 
                     * yielding. 
                     */  
                    Thread.yield();  
                    continue;  
                }  
      
                if (server.isAlive()) {  
                    return (server);  
                }  
      
                // Shouldn't actually happen.. but must be transient or a bug.  
                server = null;  
                Thread.yield();  
            }  
      
            return server;  
      
        }  
      
        @Override  
        public Server choose(Object key) {  
            // TODO Auto-generated method stub  
            return choose(getLoadBalancer(), key);  
        }  
      
        @Override  
        public void initWithNiwsConfig(IClientConfig clientConfig) {  
            // TODO Auto-generated method stub  
      
        }  
      
    }  
     
    

      

    这样我们自己写的策略算法就可以正常工作了。 所有的请求都只会到8003或者8000折两台server去。

  • 相关阅读:
    华为帐号服务助力应用运营和用户转化
    【接入指南】华为帐号服务Authorization Code模式介绍与接入步骤详解
    华为游戏登录验签失败can not find publicKey of the cp
    [古文观止]《相州昼锦堂记》(宋 欧阳修)
    [源码分析] Dynomite 分布式存储引擎 之 DynoJedisClient(2)
    [源码分析] Dynomite 分布式存储引擎 之 DynoJedisClient(1)
    Amazon Dynamo系统架构
    [从源码学设计] Flume 之 memory channel
    [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本
    [从源码学设计]蚂蚁金服SOFARegistry之延迟操作
  • 原文地址:https://www.cnblogs.com/ilinuxer/p/6592124.html
Copyright © 2011-2022 走看看