ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

huangml

2021-05-31 23:59:34  阅读:119  来源: 互联网

标签:return huangml lb org import null public


tags: gray
package com.jack.consul4.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

@Configuration
public class FeignConfiguration implements RequestInterceptor {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                String values = request.getHeader(name);
                template.header(name, values);
                if("gray".equals(name)){
                    RequestTagParam.set(values);
                }
            }
            logger.info("feign interceptor header:{}", template);
        }
    }
}
package com.jack.consul4.config;



public class RequestTagParam implements AutoCloseable {

    private static final ThreadLocal<String> local =     new ThreadLocal<>();

    public static void set(String s) {
        local.set(s);
    }

    public static String get() {
        return local.get();
    }

    public static void remove() {
        local.remove();
    }

    @Override
    public void close(){
        local.remove();
    }
}
package com.jack.consul4.config;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.consul.discovery.ConsulServer;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

/**
* 自定义规则
* @author shengwu ni
*/
public class CustomRule extends AbstractLoadBalancerRule {




   /**
    * 在choose方法中,自定义我们自己的规则,返回的Server就是具体选择出来的服务
    * 自己的规则:按照轮询的规则,但是每个被轮询到的服务调用5次。
    * @param o
    * @return
    */
   @Override public Server choose(Object o) {
       // 获取负载均衡器lb
       ILoadBalancer lb = getLoadBalancer();
       if (lb == null) {
           return null;
       }

       Server server = null;

       // 获取可用服务列表
       List<Server> upList = lb.getReachableServers();
       // 获取所有服务列表
       List<Server> allList = lb.getAllServers();
       int serverCount = allList.size();
       if (serverCount == 0) {
           return null;
       }
       List<Server> grayList = new ArrayList<>();
       List<Server> normalList = new ArrayList<>();
       Iterator<Server> it = upList.listIterator();
       while (it.hasNext()){
           Server server1 =  it.next();
           if (((ConsulServer) server1).getHealthService().getService().getTags().contains("gray")) {
               grayList.add(server1);
           }else {
               normalList.add(server1);
           }
       }
       if (RequestTagParam.get() != null) {
           return grayList.get(new Random().nextInt(grayList.size()));
       } else {
           return normalList.get(new Random().nextInt(normalList.size()));
       }
   }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}

 

标签:return,huangml,lb,org,import,null,public
来源: https://blog.csdn.net/qq_33123895/article/details/117432760

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有