dubbo分组聚合

/ Dubbo / 没有评论 / 618浏览

今天我们介绍dubbo中的分组聚合功能。分组聚合一看名字就知道它和dubbo中的分组有关系。我们知道dubbo中分组的作用是当一个接口有多种实现时,客户端调用时可以⽤group区分调用不同的实现。 分组聚合的功能就是客户端在调用时,可以将不同group中的结果合并返回, 这样客户端在调用时只需调用一次即可获取到所有guoup中的结果。因为我们在上一篇中已经介绍了group的使用,所以这里就不在做过多的介绍了,我们直接看代码。


provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 提供方信息-->
    <dubbo:application name="jilinwula"/>

    <!-- 使用zookeeper暴露服务地址 -->
    <dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/>

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

    <!-- 声明需要暴露的服务接⼝ -->
    <dubbo:service interface="com.jilinwula.api.HelloWorld" ref="helloWorldImpl" group="hello1"/>

    <dubbo:service interface="com.jilinwula.api.HelloWorld" ref="helloWorldImpl2" group="hello2"/>

    <!-- component-scan自动扫描注解 -->
    <context:component-scan base-package="com.jilinwula.*"/>

</beans>

服务提供者和上一篇中的group配置一样没有任何区别,dubbo中的分组聚合是在服务消费者配置的。

consumer.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="jilinwula"/>

    <!-- 使用zookeeper查找服务地址 -->
    <dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/>

    <!-- Dubbo自动生成远程服务代理 -->

    <dubbo:reference id="helloWorld" interface="com.jilinwula.api.HelloWorld" group="*" merger="false">
        <dubbo:method name="getHelloWorld" merger="true"/>
    </dubbo:reference>

</beans>

我们在使用dubbo分组聚合功能时,要配置几个属性,下面我们分别介绍一下这些属性的作用:

按照我们上面文件配置,则表示helloWorld接口默认所有分组都不参与合并,而method方法配置了merger为true,所以方法getHelloWorld参与合并。因为我们consumer.xml文件中没有配置任何的合并策略,也就是指定dubbo以哪种方式合并结果。下面我们介绍一下怎么配置合并策略。在dubbo中要指定合并策略需要在resources文件夹中新建WETA-INF.dubbo目录。并且在改目录中新建com.alibaba.dubbo.rpc.cluster.Merger文件,然后在该文件中指定合并策略的处理类。因为我们在本篇最后会上传项目源码。所以这里就不在详细的介绍合并策略的配置了,我们直接看合并策略的处理类。

HelloWorldMerger:

@Service
public class HelloWorldMerger implements Merger<String> {
    @Override
    public String merge(String... strings) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < strings.length; i++) {
            stringBuffer.append(strings[i]).append("|");
        }
        return stringBuffer.toString();
    }
}

要想让该类成为合并的策略类必须要实现Merger接口,该接口支持泛型,泛型类型和服务端提供的接口返回值一致即可。上述代码我们处理的逻辑是将不同的group结果用竖号分割。实际开发时,可以具体实现。下面我们来调用测试用例来演示一下dubbo中的分组合并功能。

Consumer:

public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"});
        context.start();

        HelloWorld helloWorld = context.getBean("helloWorld", HelloWorld.class);

        System.out.println(helloWorld.getAllHelloWorld());

        System.out.println(helloWorld.getHelloWorld());
    }
}

测试用例和普通的服务调用没有任何区别,下面我们看一下执行结果,看看是不是我们上面介绍的那样。

执行结果:

2018-07-30 18:21:46:044 INFO [ProductBossService,com.alibaba.dubbo.config.ReferenceConfig,425]:  [DUBBO] Refer dubbo service com.jilinwula.api.HelloWorld from url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=jilinwula&check=false&dubbo=2.6.0&generic=false&getHelloWorld.merger=true&group=*&interface=com.jilinwula.api.HelloWorld&merger=false&methods=getHelloWorld,getAllHelloWorld&pid=10424&register.ip=192.168.5.179&remote.timestamp=1532946093795&side=consumer&timestamp=1532946105091, dubbo version: 2.6.0, current host: 192.168.5.179
All Hello World Dubbo
Hello World Dubbo|Hello World Dubbo 2|
2018-07-30 18:21:46:230 INFO [ProductBossService,com.alibaba.dubbo.config.AbstractConfig$1,80]:  [DUBBO] Run shutdown hook now., dubbo version: 2.6.0, current host: 192.168.5.179

我们看结果因为我们只设置了getHelloWorld方法合并,所以输出的结果All Hello World Dubbo没有合并,下面我们将consumer.xml文件中的merger参数修改为true,在看一下执行结果。 consumer.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="jilinwula"/>

    <!-- 使用zookeeper查找服务地址 -->
    <dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/>

    <!-- Dubbo自动生成远程服务代理 -->

    <dubbo:reference id="helloWorld" interface="com.jilinwula.api.HelloWorld" group="*" merger="true">
        <dubbo:method name="getHelloWorld" merger="true"/>
    </dubbo:reference>

</beans>

执行结果:

2018-07-30 18:26:13:137 INFO [ProductBossService,com.alibaba.dubbo.config.ReferenceConfig,425]:  [DUBBO] Refer dubbo service com.jilinwula.api.HelloWorld from url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=jilinwula&check=false&dubbo=2.6.0&generic=false&getHelloWorld.merger=true&group=*&interface=com.jilinwula.api.HelloWorld&merger=true&methods=getHelloWorld,getAllHelloWorld&pid=12740&register.ip=192.168.5.179&remote.timestamp=1532946347836&side=consumer&timestamp=1532946371900, dubbo version: 2.6.0, current host: 192.168.5.179
All Hello World Dubbo|All Hello World Dubbo 2|
Hello World Dubbo|Hello World Dubbo 2|
2018-07-30 18:26:13:291 INFO [ProductBossService,com.alibaba.dubbo.config.AbstractConfig$1,80]:  [DUBBO] Run shutdown hook now., dubbo version: 2.6.0, current host: 192.168.5.179

如果我们在将consumer.xml文件中的method中的merger参数修改为false,则getHelloWorld方法不会合并,因为method参数的优先级比reference的优先级高。

consumer.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="jilinwula"/>

    <!-- 使用zookeeper查找服务地址 -->
    <dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/>

    <!-- Dubbo自动生成远程服务代理 -->

    <dubbo:reference id="helloWorld" interface="com.jilinwula.api.HelloWorld" group="*" merger="true">
        <dubbo:method name="getHelloWorld" merger="false"/>
    </dubbo:reference>

</beans>

执行结果:

2018-07-30 18:28:33:592 INFO [ProductBossService,com.alibaba.dubbo.config.ReferenceConfig,425]:  [DUBBO] Refer dubbo service com.jilinwula.api.HelloWorld from url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=jilinwula&check=false&dubbo=2.6.0&generic=false&getHelloWorld.merger=false&group=*&interface=com.jilinwula.api.HelloWorld&merger=true&methods=getHelloWorld,getAllHelloWorld&pid=9580&register.ip=192.168.5.179&remote.timestamp=1532946347836&side=consumer&timestamp=1532946512305, dubbo version: 2.6.0, current host: 192.168.5.179
All Hello World Dubbo|All Hello World Dubbo 2|
Hello World Dubbo
2018-07-30 18:28:33:900 INFO [ProductBossService,com.alibaba.dubbo.config.AbstractConfig$1,80]:  [DUBBO] Run shutdown hook now., dubbo version: 2.6.0, current host: 192.168.5.179

上述内容就是dubbo中的分组聚合功能,如有问题不正确的地方,欢迎留言,谢谢,下面链接为项目源码。

项目源码