Dubbo学习笔记(一) 初识

2019-12-18  本文已影响0人  云师兄

1. 引子

为什么突然想起来要学Dubbo呢,原因有下:

2. 环境搭建

Dubbo官网文档地址为:http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html。下面就先照着官网文档内容进行环境搭建。

2.1 zookeeper

dubbo的服务注册依赖于zookeeper,在zookeeper官网下载包,分别执行下面的命令。

2.2 dubbo快速启动

​ dubbo官网已经提供了一个demo,基于这个demo,我们可以快速创建出服务提供者和消费者。这里直接从码云上将dubbo代码拉取下来:

git clone https://gitee.com/mirrors/dubbo.git

不使用官网写的github,因为下载速度太慢了。

​ 下载后可以看到这个一个整体的大目录,下面有以"dubbo-"开头的各种包。其使用IDEA将dubbo/dubbo-demo/dubbo-demo-xml这个目录导入成一个maven工程。该maven工程中包含了名为dubbo-demo-xml-consumer和名为dubbo-demo-xml-provider的两个模块。

2.2.1 公共模块

在dubbo中,服务提供者提供的方法要以接口的形式单独打成一个jar包,然后分别被服务提供者和服务消费者引入。为此先新建一个只定义接口的maven工程:在dubbo-demo-xml这个大工程下,新建一个module,名为api。该模块只定义一个接口:

package org.apache.dubbo.demo;

public interface DemoService {
    String sayHello(String name);
}

然后,pom.xml文件修改如下:

<groupId>com.dubbo.api</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

这样,在根目录下执行mvn install命令,将应用api打包成一个jar包(target目录下)。

生成jar包后,还要将这个jar包发布到本地的maven仓库中,发布命令为:

mvn install:install-file -Dfile=/Users/yubuyun/Documents/workspace/dubbo/dubbo/dubbo-demo/dubbo-demo-xml/api/target/api-1.0-SNAPSHOT.jar -DgroupId=com.dubbo.api -DartifactId=api -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

这样本地仓库就有这个api-1.0-SNAPSHOT.jar了。

2.2.2 服务提供者

添加依赖


首先修改pom.xml文件,将公共模块这个jar包引入:

<dependency>
    <groupId>com.dubbo.api</groupId>
    <artifactId>api</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>

访问接口实现


然后服务提供者应用中就可以直接实现DemoService这个接口了:

public class DemoServiceImpl implements DemoService {
    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }
}

这里服务提供者只是打印和返回了字符串。

配置文件


dubbo官方的demo中在resources目录下还提供了dubbo配置文件,名为dubbo-provider.xml,内容如下:

<dubbo:application name="demo-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo"/>
<bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>

表示将当前应用起名为demo-provider,注册到本地的zookeeper,并且指定了接口实现类并注入到Spring容器中。

启动服务提供者


main函数定义如下:

public class Application {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
        context.start();
        System.in.read();
    }
}

就是解析dubbo配置到容器中,然后启动。

2.2.3 服务消费者

添加依赖


首先修改pom.xml文件,将公共模块这个jar包引入:

<dependency>
    <groupId>com.dubbo.api</groupId>
    <artifactId>api</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>

配置文件


dubbo官方的demo中在resources目录下还提供了dubbo配置文件,名为dubbo-consumer.xml,内容如下:

<dubbo:application name="demo-consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService" timeout="2000"/>

表示将当前应用起名为demo-consumer,注册到本地的zookeeper,并且将通过demoService接口访问其他应用。

启动服务消费者


启动类定义如下:

public class Application {
    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 result = demoService.sayHello("hello");
        System.out.println("consumer:"+result);
    }
}

启动过程中,服务消费者本身并没有实现DemoService接口实现,但是仍然可以直接调用该接口的访问,这时直接就访问到了服务提供者上。这就是RPC调用的优点:像本地调用一样进行远程调用。

2.2.4 调试

首先启动zookeeper,然后启动服务提供者,再启动服务消费者,就会发现,服务提供者打印:

provider.DemoServiceImpl: Hello hello, request from consumer: /99.15.214.152:55576

服务消费者收到返回值后打印:

consumer:Hello hello, response from provider: 99.15.214.152:20880

这就说明两个应用之间RPC调用成功了。

3. 其他

本文示例代码的地址为:https://gitee.com/yubuyun/dubbo-study

上一篇 下一篇

猜你喜欢

热点阅读