dubbo实战之一:准备和初体验

《dubbo实战》系列的父工程

为了方便管理《dubbo实战》系列的代码和依赖库版本的管理,这里创建名为dubbopractice的父maven工程,整个系列的后续源码都会作为它的子工程;

dubbopractice的pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modules>

        <module>practiceinterface</module>

        <module>helloxmldirectprovider</module>

        <module>helloxmldirectconsumer</module>

        <module>springbootzkprovider</module>

        <module>springbootzkconsumer</module>

        <module>springbootmulticastprovider</module>

        <module>springbootmulticastconsumer</module>

    </modules>

    <properties>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <maven.compiler.source>1.8</maven.compiler.source>

        <maven.compiler.target>1.8</maven.compiler.target>

        <java.version>1.8</java.version>

        <dubbo.version>2.7.6</dubbo.version>

        <springboot.version>2.3.3.RELEASE</springboot.version>

    </properties>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bolingcavalry</groupId>

    <artifactId>dubbopractice</artifactId>

    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.apache.dubbo</groupId>

                <artifactId>dubbo-dependencies-bom</artifactId>

                <version>${dubbo.version}</version>

                <type>pom</type>

                <scope>import</scope>

            </dependency>

            <dependency>

                <groupId>io.netty</groupId>

                <artifactId>netty-all</artifactId>

                <version>4.1.25.Final</version>

            </dependency>

            <!-- dubbo相关 -->

            <dependency>

                <groupId>org.apache.dubbo</groupId>

                <artifactId>dubbo</artifactId>

                <version>${dubbo.version}</version>

            </dependency>

            <dependency>

                <groupId>org.apache.dubbo</groupId>

                <artifactId>dubbo-dependencies-zookeeper</artifactId>

                <version>${dubbo.version}</version>

                <type>pom</type>

            </dependency>

            <dependency>

                <groupId>org.apache.dubbo</groupId>

                <artifactId>dubbo-spring-boot-starter</artifactId>

                <version>${dubbo.version}</version>

            </dependency>

            <dependency>

                <groupId>org.apache.dubbo</groupId>

                <artifactId>dubbo-registry-multicast</artifactId>

                <version>${dubbo.version}</version>

            </dependency>

            <dependency>

                <groupId>org.apache.zookeeper</groupId>

                <artifactId>zookeeper</artifactId>

                <version>3.4.7</version>

            </dependency>

            <dependency>

                <groupId>com.github.sgroschupf</groupId>

                <artifactId>zkclient</artifactId>

                <version>0.1</version>

            </dependency>

            <dependency>

                <groupId>org.projectlombok</groupId>

                <artifactId>lombok</artifactId>

                <version>1.16.16</version>

            </dependency>

            <dependency>

                <groupId>com.fasterxml.jackson.core</groupId>

                <artifactId>jackson-databind</artifactId>

                <version>2.11.0</version>

                <scope>compile</scope>

            </dependency>

            <dependency>

                <groupId>com.fasterxml.jackson.datatype</groupId>

                <artifactId>jackson-datatype-jdk8</artifactId>

                <version>2.11.0</version>

                <scope>compile</scope>

            </dependency>

            <dependency>

                <groupId>org.slf4j</groupId>

                <artifactId>slf4j-log4j12</artifactId>

                <version>1.7.25</version>

                <scope>compile</scope>

            </dependency>

            <dependency>

                <groupId>commons-io</groupId>

                <artifactId>commons-io</artifactId>

                <version>2.7</version>

                <scope>compile</scope>

            </dependency>

            <dependency>

                <groupId>org.apache.commons</groupId>

                <artifactId>commons-lang3</artifactId>

                <version>3.10</version>

                <scope>compile</scope>

            </dependency>

            <!-- swagger依赖 -->

            <dependency>

                <groupId>io.springfox</groupId>

                <artifactId>springfox-swagger2</artifactId>

                <version>2.5.0</version>

            </dependency>

            <!-- swagger-ui -->

            <dependency>

                <groupId>io.springfox</groupId>

                <artifactId>springfox-swagger-ui</artifactId>

                <version>2.5.0</version>

            </dependency>

        </dependencies>

    </dependencyManagement>

</project>

《dubbo实战》系列的二方库

涉及到多个工程之间的服务调用,因此要有个工程保存公用的数据结构、接口定义等,因此新建名为practiceinterface的子工程;

practiceinterface工程的pom.xml内容如下,非常简单:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <artifactId>dubbopractice</artifactId>

        <groupId>com.bolingcavalry</groupId>

        <version>1.0-SNAPSHOT</version>

        <relativePath>../pom.xml</relativePath>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bolingcavalry</groupId>

    <artifactId>practiceinterface</artifactId>

    <version>1.0-SNAPSHOT</version>

    <name>practiceinterface</name>

    <description>Beans of all app</description>

</project>

此工程目前只有一个接口定义,后面多个子工程都会用到:

package com.bolingcavalry.dubbopractice.service;

public interface DemoService {

    String sayHello(String name);

}

编码(服务提供方)

先创建提供服务的工程helloxmldirectprovider,一共要创建6个文件,创建顺序和功能如下表:

创建顺序 文件名 作用

1 pom.xml 工程的pom文件

2 src/main/java/com/bolingcavalry/helloxmldirectprovider/ProviderApplication.java 启动类

3 src/main/java/com/bolingcavalry/helloxmldirectprovider/service/impl/DemoServiceImpl.java 提供具体的服务

4 src/main/resources/log4j.properties 日志配置文件

5 src/main/resources/dubbo.properties dubbo配置文件

6 src/main/resources/spring/dubbo-provider.xml spring的bean配置

完整的文件位置如下图:

在这里插入图片描述

接下来逐个创建上述内容;

创建名为helloxmldirectprovider的子工程,pom.xml内容如下,可见刚才新建的二方库practiceinterface也被依赖了:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <artifactId>dubbopractice</artifactId>

        <groupId>com.bolingcavalry</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bolingcavalry</groupId>

    <artifactId>helloxmldirectprovider</artifactId>

    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>

            <groupId>com.bolingcavalry</groupId>

            <artifactId>practiceinterface</artifactId>

            <version>${project.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.dubbo</groupId>

            <artifactId>dubbo</artifactId>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

        </dependency>

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-log4j12</artifactId>

        </dependency>

    </dependencies>

</project>

编写启动类ProviderApplication.java,可见就是个普通的后台程序,加载spring配置做初始化:

package com.bolingcavalry.helloxmldirectprovider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ProviderApplication {

    public static void main(String[] args) throws Exception {

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");

        context.start();

        System.in.read();

    }

}

编写提供具体服务的业务实现类DemoServiceImpl.java,只是个简单的接口实现类而已:

package com.bolingcavalry.helloxmldirectprovider.service.impl;

import com.bolingcavalry.dubbopractice.service.DemoService;

import lombok.extern.slf4j.Slf4j;

import org.apache.dubbo.rpc.RpcContext;

@Slf4j

public class DemoServiceImpl implements DemoService {

    @Override

    public String sayHello(String name) {

        log.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();

    }

}

日志配置文件log4j.properties,内容如下:

###set log levels###

log4j.rootLogger=info, stdout

###output to the console###

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n

在同样位置创建dubbo配置文件dubbo.properties,内容很简单只有qos的端口设置,用于支持telnet命令:

dubbo.application.qos.port=22222

在resources目录下新建文件夹spring,在此文件夹下创建文件dubbo-provider.xml,要重点关注的是dubbo:registry的配置,其address属性值为multicast://224.5.6.7:1234,代表当前服务通过广播让消费者获得自身信息:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"

      xmlns="http://www.springframework.org/schema/beans"

      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

      http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="demo-provider"/>

    <!--广播模式-->

    <dubbo:registry address="multicast://224.5.6.7:1234" />

    <bean id="demoService" class="com.bolingcavalry.helloxmldirectprovider.service.impl.DemoServiceImpl"/>

    <dubbo:service interface="com.bolingcavalry.dubbopractice.service.DemoService" ref="demoService"/>

</beans>

至此,服务提供方编码完成,直接在IDEA上运行ProviderApplication类即可启动服务,启动成功后的日志输出如下图:

在这里插入图片描述

编码(服务消费方)

现在网络上已经有了服务,接下来创建一个消费该服务的工程helloxmldirectconsumer,一共要创建5个文件,创建顺序和功能如下表:

创建顺序 文件名 作用

1 pom.xml 工程的pom文件

2 src/main/java/com/bolingcavalry/helloxmldirectconsumer/ConsumerApplication.java 启动、调用远端服务、再结束自身进程

3 src/main/resources/log4j.properties 日志配置文件

4 src/main/resources/dubbo.properties dubbo配置文件

5 src/main/resources/spring/dubbo-consumer.xml spring的bean配置

完整的文件位置如下图:

在这里插入图片描述

接下来逐个创建上述文件;

创建名为helloxmldirectconsumer的子工程,pom.xml内容如下,可见刚才新建的二方库practiceinterface也被依赖了:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <artifactId>dubbopractice</artifactId>

        <groupId>com.bolingcavalry</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bolingcavalry</groupId>

    <artifactId>helloxmldirectconsumer</artifactId>

    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>

            <groupId>com.bolingcavalry</groupId>

            <artifactId>practiceinterface</artifactId>

            <version>${project.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.dubbo</groupId>

            <artifactId>dubbo</artifactId>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

        </dependency>

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-log4j12</artifactId>

        </dependency>

    </dependencies>

</project>

编写唯一的java文件ConsumerApplication.java,里面用了最简单的方法初始化spring环境,然后取得服务实例,执行过方法后结束进程:

package com.bolingcavalry.helloxmldirectconsumer;

import com.bolingcavalry.dubbopractice.service.DemoService;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ConsumerApplication {

    public static void main(String[] args) throws Exception {

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");

        context.start();

        DemoService demoService = context.getBean("demoService", DemoService.class);

        String hello = demoService.sayHello("world1");

        System.out.println("result: " + hello);

    }

}

日志配置文件log4j.properties,内容如下:

###set log levels###

log4j.rootLogger=info, stdout

###output to console###

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n

在同样位置创建dubbo配置文件dubbo.properties,内容很简单只有qos的端口设置,用于支持telnet命令,本例中是用不上的,因为远程调用后进程就会结束:

dubbo.application.qos.port=33333

在resources目录下新建文件夹spring,在此文件夹下创建文件dubbo-consumer.xml,要重点关注的是dubbo:registry的配置,其address属性值为multicast://224.5.6.7:1234?unicast=false,代表当前服务通过广播让消费者获得自身信息,unicast=false表示多个消费者都能收到广播:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"

      xmlns="http://www.springframework.org/schema/beans"

      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

      http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="demo-consumer"/>

    <dubbo:registry address="multicast://224.5.6.7:1234?unicast=false"/>

    <dubbo:reference id="demoService" check="false" interface="com.bolingcavalry.dubbopractice.service.DemoService" timeout="2000"/>

</beans>

上面的dubbo-consumer.xml中还有一处要注意,就是dubbo:reference的timeout属性,这是远程调用的超时时间,此处设置为2秒,要注意的是前面helloxmldirectprovider提供的服务延时了1秒才返回,所以这里设置不能低于1秒;

至此,服务消费方编码完成,直接在IDEA上运行ConsumerApplication类即可启动,如下图,红框中就是远程调用helloxmldirectprovider服务返回的内容:

亚马逊测评 www.yisuping.cn

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容