文档章节

使用Dubbo的SPI扩展机制实现自定义LoadBalance——方法一 修改Dubbo源代码

o
 osc_a22drz29
发布于 2019/03/21 18:31
字数 894
阅读 10
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一. 拉取源码

到Dubbo官网 https://github.com/apache/incubator-dubbo/tree/2.5.x 下载源码,解压。

 

二. 导入IDEA

选择解压后的源码目录,一路点击next

三. 实现LoadBalance接口

在loadbalance包中,创建一个class,并实现LoadBalance接口。  如下:创建SameSessionIdLoadBalance类实现LoadBalance接口

 

/**
* 保存sessionId和服务地址的映射关系
* invoker.getUrl().getAddress()可以获取到该invoker的服务地址信息
* sessinoId存在,那么就返回sessionId所在的invoker
* sessionId不存在,那么就轮训的找一个invoker返回
*/
public
class SameSessionIdLoadBalance implements LoadBalance { private final static Logger logger = LoggerFactory.getLogger(SameSessionIdLoadBalance.class); private Map<String,String> sessionIdAddress = new ConcurrentHashMap<String,String>(256); private AtomicInteger index = new AtomicInteger(0); @Override public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException { Invoker result = null;
     //约定方法的第一个参数就是sessionId String sessionId
= (String) invocation.getArguments()[0]; if(!sessionIdAddress.containsKey(sessionId)){ result = invokers.get(index.getAndIncrement()%invokers.size()); sessionIdAddress.put(sessionId,result.getUrl().getAddress()); }else{ String destAddress = sessionIdAddress.get(sessionId); for (Invoker<T> invoker : invokers) { if(invoker.getUrl().getAddress().equals(destAddress)){ result = invoker; } } } logger.info("sesisonId: " + sessionId + " ,method: " + invocation.getMethodName() + " ,select " + result.getUrl().getAddress() + " broker"); return result; } }

四. 添加配置信息

添加的samesessionloadbalance就是该负载均衡的名字。

五. 构建安装源码

打开终端控制台执行mvn clean install -Dmaven.test.skip

最后会在maven的本地仓库中生成jar包

可以通过360解压缩查看jar包中的class文件,看看我们的代码是否编译进去了。

 

六. 测试代码

公共接口

public interface DemoService {
    String saySomething(String msg);
}

provider实现该接口

public class DemoServiceImpl implements DemoService {
    public String saySomething(String msg) {
     //每次启动 把20880改成相应的端口 方便观察结果。
return "this is 20880 " + msg; } }

Provider启动

public class Provider {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:provider.xml");
        ctx.start();
        System.in.read();
    }
}

provider.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-4.3.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="hello-world-app"  />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://10.130.41.36:2181"/>

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 声明需要暴露的服务接口 -->
    <!--samesessionloadbalance-->
    <dubbo:service interface="com.xxx.testdubbo.DemoService" ref="demoService" loadbalance="samesessionloadbalance"/>

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.xxx.testdubbo.provider.DemoServiceImpl" />

</beans>

Consumer启动

public class Customer {
    public static void main(String[] args){
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:customer.xml");
        DemoService ds = (DemoService) ctx.getBean("demoService");
        System.out.println(ds.saySomething("001"));
    }
}

customer.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-4.3.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app"  />

    <!-- 使用zookeeper注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://10.130.41.36:2181" />

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.xxx.testdubbo.DemoService" />
</beans>

 

七.启动实例测试

Dubbo使用一些容错机制,里面会有一些判断。如下图所示:

当invoker只有一个那么就直接返回

当invoker有两个那么使用轮序机制

当有三个或三个以上的invoker时,才会触发loadbalance机制。

所以我们要启动三个Provider

更改provider.xml中Dubbo的监听端口为20880,20881,20882分别启动实例

在DemoServiceImpl中,每启动一个Provider实例,该方法返回相应的ip+端口号信息。

最后启动Customer,观察端口号结果。

 

八. 调试自定义LoadBalance

在项目里面一定引用了Dubbo的jar包,找到SameSessionIdLoadBalance文件,下断点,Consumer调试运行就可以了。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
聊聊Dubbo - Dubbo可扩展机制实战

1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 如同罗马不是一天建成的,任何系统都一定是从小系统不...

中间件小哥
2018/05/29
0
0
聊聊Dubbo - Dubbo可扩展机制实战

摘要: 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能...

阿里云云栖社区
2018/06/04
199
1
聊聊Dubbo - Dubbo可扩展机制实战

摘要: 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能...

猫耳m
2018/06/04
4
0
Dubbo原理和源码解析之“微内核+插件”机制

github新增仓库 "dubbo-read"(点此查看),集合所有《Dubbo原理和源码解析》系列文章,后续将继续补充该系列,同时将针对Dubbo所做的功能扩展也进行分享。不定期更新,欢迎Follow。 1 框架设...

osc_joco7w0s
2018/08/14
8
0
使用Dubbo的SPI扩展机制实现自定义LoadBalance——方法一 修改Dubbo源代码

一. 拉取源码 到Dubbo官网 https://github.com/apache/incubator-dubbo/tree/2.5.x 下载源码,解压。 二. 导入IDEA 选择解压后的源码目录,一路点击next 三. 实现LoadBalance接口 在loadbal...

我最喜欢三大框架
2019/03/24
13
0

没有更多内容

加载失败,请刷新页面

加载更多

会议通知 | 2020中国计算与认知神经科学会议

关于大会关于 计算神经科学以神经生物实验为基础,以建立数学模型,开展计算模拟和分析作为基本手段,来刻画和描述大脑的神经活动,探究神经系统各种复杂活动和认知功能包括注意、学习、记忆...

脑机接口社区
06/02
20
0
大神分享快3怎么算下期和值

大神分享快3怎么算下期和值{叩67790572}使用的标签:constructor-arg标签出现的位置:bean标签的内部标签中的属性type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个...

yiren081
25分钟前
21
0
Matlab系列之运算符和标点符号的功能介绍

本来月初就打算接着写的,但是电脑不小心进水,主板什么的都废了,周末才找时间拿去修好,心塞。 就不多讲太多废话了,开始分享今天的内容,对MATLAB的运算符做个介绍,然后再对标点符号进行...

狂人V
07/06
9
0
Java源码系列(1):Comparable和Comparator的区别

在讲Comparable和Comparator区别之前,先补充一个知识点。 先看代码: Person类 1public class Person<T> { 2  private T id; 3 4  public T getId() { 5    return i...

学习Java的小姐姐
2018/09/19
25
0
ThreadPoolTaskScheduler手写调度中心

先贴一个自己写的demo把,原理其实就是这样的。 CronTrigger这个类可以将cron表达式转换成Date,可以查看schedule源码学到不少东西,下面代码就是转换成下一执行时间。 public Date nextEx...

朝如青丝暮成雪
46分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部