ICode9

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

dubbo 扩展LoadBalance

2019-12-08 21:01:50  阅读:467  来源: 互联网

标签:dubbo envId return LoadBalance 扩展 invokers invoker providerUrl Invoker


public class MyRandomLoadBalance extends RandomLoadBalance {

    private static Logger log = LoggerFactory.getLogger(MyRandomLoadBalance.class);

    @Override
    protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
        if (System.getProperty(url.getServiceInterface()) != null) {
            //直连
            return super.doSelect(invokers, url, invocation);
        }

        List<InvokerHacker<T>> hackedInvokers = new ArrayList<>(invokers.size());
        for (Invoker<T> invoker : invokers) {
            hackedInvokers.add(new InvokerHacker<T>(invoker));
        }
        String envId = null;
        CommonRequest cr = RequestContext.get(RequestContextKey.COMMON_REQUEST, CommonRequest.class);
        if(cr != null && cr.getTraceZone() != null){
            envId = cr.getTraceZone();
        }

        if(StringUtils.isBlank(envId)){
            return super.doSelect(invokers,url,invocation);
        }

        List<Invoker<T>> availableInvokers = new ArrayList<>();
        for(InvokerHacker invokerHacker : hackedInvokers){
            if(invokerHacker.envMatch(envId)){
                availableInvokers.add(invokerHacker);
            }
        }
        if(availableInvokers.isEmpty()){
            log.warn("not found invokers match envId={}",envId);
            availableInvokers = invokers;
        }
        return super.doSelect(availableInvokers, url, invocation);
    }

    /**
     * 默认的Invoker实现是不可见的com.alibaba.dubbo.registry.integration.RegistryDirectory.InvokerDelegate
     * 为了访问providerUrl而加多下面这个
     * @param <T>
     */
    private static class InvokerHacker<T> extends InvokerWrapper<T> {
        private URL providerUrl;

        InvokerHacker(Invoker<T> invoker) {
            super(invoker, invoker.getUrl());
            providerUrl = hackUrl(invoker);
        }
        private <E> URL hackUrl(Invoker<E> invoker) {
            try {
                Field providerUrlField = invoker.getClass().getDeclaredField("providerUrl");
                providerUrlField.setAccessible(true);
                return (URL) providerUrlField.get(invoker);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                throw new IllegalStateException("Could not get providerUrl", e);
            }
        }

        boolean envMatch(String envId) {
            return StringUtils.equals(envId, providerUrl.getParameter("envId"));
        }
    }
}

rt

 

标签:dubbo,envId,return,LoadBalance,扩展,invokers,invoker,providerUrl,Invoker
来源: https://www.cnblogs.com/lccsblog/p/12007173.html

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

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

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

ICode9版权所有