文章结束本文转载自微信公众号《捉虫达人》,作者为捉虫达人。转载本文请联系捕虫大师公众号.背景很久以前,我写了一个dubboloadbalance的扩展,供业务端使用(为了描述方便,这个loadbalance扩展就叫XLB)。这两天业务方反映XLB没有生效。我心想,这不可能,而且我用了半年多了~去查,于是就登上了没有生效的消费机去查。幸运的是,我救了一只手。当加载XLB时,它会打印一行日志。看服务,没有打印日志,说明没有加载XLB。成功后问对应的开发,你们是按照我的文档配置loadbalance的吗?回复:按照文档配置。现在不相信,但转念一想,配置loadbalance这么简单,应该不会出错。我的文档和他的application都在xml文件中配置了consumerloadbalance抱着试一试的态度拉了一下他们项目的代码,发现配置确实如上,但是我发现他们的application.properties配置文件也配置了一个consumer属性dubbo.consumer.check=false根据多年和dubbo打交道的经验,这里有问题,经代码确认,确实xml和application.properties都是loaded那么这里可能有问题。dubbo从xml加载生成消费者配置,dubbo-springboot-starter从application.properties加载配置生成消费者配置。这不是冲突吗?不要只看dubbo.consumer的配置.check,它其实会生成一个完整的consumer配置,不过loadbalance是默认值。为什么业务方要这样配置呢?大概率是因为我的文档只给出了xml形式的配置,没有给出spring-boot的配置,他们本来是用spring-boot的配置方式,然后看到我的文档是xml,结果不会配置。他们还写了一个xml,跟原来的配置有冲突。为了验证是不是这个问题引起的,我把他的application.properties的dubbo.consumer.check配置移到了xml文件中,果然重启后加载到XLB中然后我在本地测试应用做了这样的验证:两组配置相同,只是顺序不同。测试结果,case1可以加载到XLB,case2不能,所以我猜测,配置dubboconsumer后加载的源码明显不符合我的风格。打开下面的源代码。如果你不感兴趣,你可以跳过它。底部有总结。首先,找出何时加载loadbalance。在AbstractClusterInvoker的invoke方法中,加载了loadbalance@。OverridepublicResultinvoke(finalInvocationinvocation)throwsRpcException{...List>invokers=list(invocation);LoadBalanceloadbalance=initLoadBalance(invokers,invocation);RpcUtils.attachInvocationIdIfAsync(getUrl(),invocation);returndoInvoke();}加载代码如下:获取方法参数r(RpcUtils.getMethodName(invocation),LOADBALANCE_KEY,DEFAULT_LOADBALANCE));}else{returnExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(DEFAULT_LOADBALANCE);}}使用缓存加载扩展publicTgetExtension(Stringname){if(StringUtils.isEmpty(name)){thrownewIllegalArgumentException("Extensionname==null");}if("true".equals(name)){returngetDefaultExtension();}finalHolder