Dubbo 的簡單實用

LinvingCode發表於2017-02-12
  1. 使用Dubbo 的安裝一個註冊中心來註冊服務,一般選用的是 zookeeper 。zookeeper的安裝並不是很複雜。
  2. Dubbo採用全spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring載入Dubbo的配置即可,Dubbo基於Spring的Schema擴充套件進行載入。可以直接像使用本地已經實現的介面一樣,通過Spring Bean 容器裡面直接獲取。這也是Dubbo最大的好處之一。

3.結構工程

這是一個簡單的工程結構
這是一個簡單的工程結構:
consumer 消費者 ,消費服務,是使用服務的物件。一個消費者可以消費多個服務。
provider 服務提供者 ,提供實現了的介面。一個服務者也可以像多個消費者提供服務。
interface 公共介面(消費者和服務提供者共用)

(一)Interface
普通 Java 模組,沒有引用其他相關的包

這裡寫圖片描述

定義了一個介面,給 consumer ,provider使用 ,沒有實現。
實現在 provider 裡面。使用在 consumer 裡面。

public interface IUserService {

     boolean login(String username, String password);
}

(二) Provider
主要功能是,實現介面IUserService ,並註冊到註冊中心。

pom.xml

<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>DubboDemo</artifactId>
        <groupId>com.linving.DubboDemo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <version>1.0-SNAPSHOT</version>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.linving.DubboDemo</groupId>
    <artifactId>provider</artifactId>
    <packaging>jar</packaging>

    <name>provider</name>
    <url>http://maven.apache.org</url>

    <!-- **************************** Properties 配置 **************************** -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>3.8.1</junit.version>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <commonsLogging.version>1.2</commonsLogging.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

    <dependencies>
        <!-- **************************** Spring 依賴 **************************** -->
        <!-- 新增Spring-core包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-tx包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring ORM 相關-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-jdbc包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--新增spring-web包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-context包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commonsLogging.version}</version>
        </dependency>
        <!--新增aspectjweaver包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!-- **************************** /Spring 依賴 **************************** -->

        <!-- **************************** Dubbo 依賴 **************************** -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.3</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- **************************** /Dubbo 依賴 **************************** -->

        <!-- **************************** interface 依賴 **************************** -->
        <dependency>
            <groupId>com.linving.DubboDemo</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- **************************** /interface 依賴 **************************** -->
    </dependencies>
</project>

類:

這裡寫圖片描述
UserServiceImpl 是介面的實現。

SpringBeanFactory 是 spring bean載入類,用來啟動spring容器。

provider 一般不用Tomcat或者其他容器中啟動。有個啟動類即可。

在看看 服務是這麼註冊到 註冊中心的。

applicationContext.xml 平常spring 載入的一些配置,沒有什麼特殊的。

spring-provider.xml 負責 註冊到註冊中心並註冊服務。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 新增 DUBBO SCHEMA -->
<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="dubbodemo-provider"/>
    <!-- 連線到哪個本地註冊中心 -->
    <dubbo:registry id="dubbodemo" address="zookeeper://localhost:2181"/>
    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="28080"/>
    <!-- 宣告需要暴露的服務介面 -->
    <dubbo:service timeout="3000" interface="com.linving.service.IUserService" ref="userService"/>
    <!-- 掃描註解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 -->
    <!--<dubbo:annotation package="com.linving.service.impl" />-->
</beans>

就這樣就可以 釋出一個服務了。 記得開啟註冊中心。

Consumer
服務消費者

pom.xml

<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>DubboDemo</artifactId>
        <groupId>com.linving.DubboDemo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.linving.DubboDemo</groupId>
    <artifactId>consumer</artifactId>
    <packaging>jar</packaging>

    <name>consumer</name>
    <url>http://maven.apache.org</url>

    <!-- **************************** Properties 配置 **************************** -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>3.8.1</junit.version>
        <springframework.version>4.1.6.RELEASE</springframework.version>
        <commonsLogging.version>1.2</commonsLogging.version>
    </properties>
    <!-- **************************** /Properties 配置 **************************** -->

    <dependencies>
        <!-- **************************** Spring 依賴 **************************** -->
        <!-- 新增Spring-core包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-tx包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- Spring ORM 相關-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-jdbc包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--新增spring-web包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- 新增spring-context包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>${commonsLogging.version}</version>
        </dependency>
        <!--新增aspectjweaver包 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!-- **************************** /Spring 依賴 **************************** -->

        <!-- **************************** Dubbo 依賴 **************************** -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.3.3</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- **************************** /Dubbo 依賴 **************************** -->

        <!-- **************************** interface 依賴 **************************** -->
        <dependency>
            <groupId>com.linving.DubboDemo</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- **************************** /interface 依賴 **************************** -->
    </dependencies>
</project>

這裡寫圖片描述

Consumer 服消費者:實際運用一般是一個WebApp ,在容器中啟動。這裡沒有寫成一個web 專案。
看看是怎麼獲取註冊中心的資訊的:

spring-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 新增 DUBBO SCHEMA -->
<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="dubbodemo-consumer"/>
    <!-- 連線到哪個註冊中心(連線到本機的2181埠zookeeper) -->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 消費方用什麼協議獲取服務(用dubbo協議在20880埠暴露服務) -->
    <dubbo:protocol port="28080"/>
    <!-- 呼叫哪些服務 -->
    <dubbo:reference id="userService" interface="com.linving.service.IUserService"/>
    <!-- 掃描註解包路徑,多個包用逗號分隔,不填pacakge表示掃描當前ApplicationContext中所有的類 -->
    <!--<dubbo:annotation package="com.linving" />-->
</beans>

UserServiceConsumer.java

@Component
public class UserServiceConsumer {

    private static Logger logger = LoggerFactory.getLogger(UserServiceConsumer.class);

    public static void main(String args[]) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //呼叫遠端服務 
        IUserService userService = (IUserService) ctx.getBean("userService");
        logger.info("執行結果:" + userService.login("hello", "hello"));
    }
}


可像呼叫本地 實現一樣呼叫遠端服務了。


專案程式碼地址: 
https://git.oschina.net/linving/DubboDemo.git

相關文章