由于项目需求特殊,需要在dubbo中实现一种能指定远程地址的分发机制,使用了dubbo留出来的扩展点的方法实现了这个功能,也就是实现了AbstractLoadBalance接口,并重写了doSelect方法,在doSelect方法实现中,根据调度服务方法传进的参数也就是指定的远程主机的ip地址和端口进行了过滤,最终返回满足该条件的Invoker作为最终的返回值给调用端,
在通过SPI机制将拓展服务负载均衡方式加载到dubbo的服务体系中
主要是在dubbo-2.8.4.jar\META-INF\dubbo\internal\com.alibaba.dubbo.rpc.cluster.LoadBalance
里面增加拓展的服务负载解析器
random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
roundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
leastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
amplify=com.wangyong.service.config.devLoadBalance
dubbo 拓展的负载方式
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance;
import com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* 针对开发场景做的Dubbo的负载均衡策略,可按IP规则做路由配置。
* IP规则例子:192.168.*.*,172.*.*.*
* 使用逗号分隔多个正则表达式规则,如果前面的匹配则不会执行后面的,如果都不匹配则使用默认的路由规则:随机策略。
*/
//@Configuration
public class DevLoadBalance extends AbstractLoadBalance {
@Override
protected <T> Invoker<T> doSelect(List<Invoker<T>> list, URL url, Invocation invocation) {
String config = System.getProperty("loadbalance.dev");
Long bigOrg = 1677773268481736704L;
String orgId = url.getParameter("orgId");
System.out.println("进行服务路由调度");
if (StringUtils.isBlank(config)) {
return new RandomLoadBalance().select(list, url, invocation);
}
String[] patterns = config.split(",");
if (ArrayUtils.isEmpty(patterns)) {
return new RandomLoadBalance().select(list, url, invocation);
}
for (String pattern : patterns) {
for (Invoker<T> invoker : list) {
if (invoker.getUrl().getHost().matches(pattern)) {
return invoker;
}
}
}
return new RandomLoadBalance().select(list, url, invocation);
}
}
dubbo config:dubbo/providers.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="test" owner="testOwner"/>
<!-- 定义 zookeeper 注册中心地址及协议 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" client="zkclient"/>
<dubbo:protocol name="dubbo" port="-1"/>
<dubbo:annotation package="test.service"/>
<dubbo:provider timeout="10000" version="1.0.0" retries="0"/>
<dubbo:consumer check="false" timeout="10000" retries="0" version="1.0.0" loadbalance="dev"/>
</beans>