Dubbo入门

释放双眼,带上耳机,听听看~!

从今天起本人将不定期分享Dubbo框架方面的知识,Dubbo现在是比较常用的RPC通信框架。在公司服务过多时,采用RPC框架调用往往要比直接使用HTTP请求的方式要好。因为RPC底层采用的是TCP/IP协议,而HTTP采用的就是HTTP协议,而HTTP协议又是在TCP协议之上的,所以从这一点上看,采用RPC框架要比HTTP方式的性能更高。


因为Dubbo框架是阿里巴巴开源的项目,所以官方文档是中英文都支持的,所以,本人今后的文章将重点分享Dubbo框架使用,也就是实战方面的内容,而有关Dubbo框架理论方面的知识请大家参考Dubbo框架的官方文档。官网链接:http://dubbo.apache.org/。好了废话不多说,我们下面开始介绍Dubbo框架本篇的内容。本篇将以HelloWorld的例子,来分享Dubbo框架的项目搭建,及其相关配置使用。


因为按照Dubbo框架的架构,服务的提供方和调用方都会依赖接口服务,而大部分的项目架构服务的提供方和调用方都不会在一个项目中,所以这就需要将接口服务在服务的提供方和调用方都部署,这才能保证服务的正常调用,所以,我们在搭建Dubbo项目的时候,通常都会将项目中涉及到的接口单独打包,这样当我们用Maven管理项目时,可以很方便的在服务的提供方和调用方注入此依赖。下面我们创建一个Maven项目并在此项目中创建3个模块分别代表接口、服务提供方、服务调用方。


  • jilinwula-dubbo-api

下面我们这个模块中定义好我们的接口,注意只定义接口,并不需要定义实现类。

/**
 * 接口类
 */
public interface HelloWorld {

    /**
     * 获取HelloWorld信息
     *
     * @return
     */
    String getHelloWorld();

}

因为此模块只是定义接口及相关的Model对象,所以不需要在此项目中添加其它的配置,说白了,这个模块只是定义服务提供方和调用方。统一的接口返回类型及相关参数而已,所以不需要添加其它的配置。


  • jilinwula-dubbo-provider

此模块是服务的提供方,说白了也就是接口的实现方,所以我们先实现api中定义的接口,然后在看具体和Dubbo相关的配置。

/**
 * 接口实现类
 */
public class HelloWorldImpl implements HelloWorld {
    public String getHelloWorld() {
        return "Hello World Dubbo";
    }
}

因为Dubbo框架是采用spring的方式暴露服务的,而刚刚的实现类中又用到了api中的接口,所以我们需要在这个模块中引入api和spring的jar,因为提供方和调用方不在一个项目中所以这时就会用到了PRC功能,也就是Dubbo的主要功能,所以我们还应该将Dubbo的jar也注入到此模块中。

 <dependencies>

        <dependency>
            <groupId>com.jiliwula</groupId>
            <artifactId>jilinwula-dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.14.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.0</version>
        </dependency>

     <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

    </dependencies>

下面我们详细介绍Dubbo中服务提供者的相关配置。下面我们创建一个provider.xml文件,在这个文件中添加和Dubbo相关的参数,文件名字没有要求,但为了方便使用spring的扫描文件的功能,在正式的项目中通常会采用一个约定好的名字为文件前缀,本篇将直接使用provider名字。

<?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="zookeeper://127.0.0.1:2181" />

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

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

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

</beans>

上面使用zookeeper的目的是为了使服务的调用都找到服务的提供者。下面们创建一个启动类来启动Dubbo服务。

/**
 * 启动Dubbo提供方
 */
public class Provider {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"provider.xml"});
        context.start();
        System.in.read();    
    }
}

如果启动时,没有报任何的异常则说明我们的Dubbo提供方启动成功了,下面我们按照提供方的方式,来编写我们的调用方,它们大体配置是一样的,除了个别的参数外。


  • jilinwula-dubbo-consumer

我们同样在调用方中添加相关的依赖,因为服务调用方和提供方依赖的jar是相同的,所以可以提取出来放到公共的依赖库, 本文只是演示Dubbo相关的功能,所以此处请忽略此处不合理。

<dependencies>

        <dependency>
            <groupId>com.jiliwula</groupId>
            <artifactId>jilinwula-dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.0</version>
        </dependency>

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

    </dependencies>


下面我们创建调用方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="zookeeper://127.0.0.1:2181" />

    <!-- Dubbo自动生成远程服务代理 -->
    <dubbo:reference id="helloWorld" interface="com.jilinwula.api.HelloWorld" />

</beans>

下面我们和服务提供者一样,启动Dubbo框架,并直接调提供者提供的接口,看看是否能正确返回数据。

/**
 * 服务调用方
 */
public class Consumer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"});
        context.start();

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

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

    }
}

返回的结果:

img

我们看上图,成功的返回的了我们接口提供方的信息,所以证明我们使用Dubbo框架来远程调用接口成功了。至此有关Dubbo框架的HelloWorld的例子到这里就结束了,在后续的文章中将继续分享Dubbo框架其它的使用。下面链接为上面涉及到的源码。源码下载

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧