dubbo入門示例


本文主要介紹阿里dubbo的基本使用,關於dubbo的相關基礎概念請自行參考dubbo官網:http://www.dubbo.io

dubbo是一個服務治理的框架,在如今大規模的分布式應用和SOA架構中,服務治理的問題顯的尤為的重要。

以我個人使用dubbo的場景來總結,dubbo主要解決如下問題:

  1.項目服務化后,項目之間的高性能通訊問題。(項目被拆分成多個服務模塊后必然會涉及模塊之間的通訊)

  2.服務的URL管理,當項目拆分為N個服務並且不斷增加時,如何有效的管理的服務URL

  3.服務發現和服務移除,動態的管理服務

帶着以上三個問題開始dubbo的學習和入門demo的開發。

示例項目分為三個,分別是:

  1. dubbo-api:提供統一的接口,最終會打為jar包,供consumer和provider引用

  2.dubbo-provider:服務提供者,包含api接口的實現類,提供服務的實現邏輯

  3.dubbo-consumer:該項目是一個web項目,有幾個作用,首先該項目以http的形式提供前端和瀏覽器訪問的接口,

    其次,該項目也是dubbo消費者,用來消費dubbo-provider項目提供的服務。所以該項目可以通過瀏覽器調用接口測試,

    也可以使用postman或者前端js來調用進行測試,比較接近真實環境的使用場景。

首先開發dubbo-api

  項目結構如下圖:

  

  該項目只有一個文件,是一個接口,他定義了統一的接口讓provider和consumer來引用,接口文件內容如下:

  

public interface UserService {
    String sayHi(String name);
}

 

很純粹的一個java接口,不再多解釋什么了。

在該項目的classpath路徑下提供了一個xml配置,該配置文件其實就是dubbo消費者的相關配置,后邊消費者項目引入api之后可以直接使用該文件。

文件內容如下:

<?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:reference id="userService" interface="com.dubbo.api.UserService" cluster="failfast" check="false"/>
</beans>

 

拋開xml頭文件,該文件的內容也只有一行而已,通過<dubbo:reference>標簽來引用服務配置。

其次是該項目的pom文件:

<?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">
    <modelVersion>4.0.0</modelVersion>

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

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

 

pom文件中在引入dubbo包時,排除掉了dubbo自帶的spring引用,因為dubbo自帶的spring依賴版本過低,我們使用自己導入的spring版本

到此位置dubbo-api項目已開發完成。

通過maven將其打成jar包,一會consumer和provider需要引入該包。

 

接着我們開發dubbo-provider,項目結構如下:

  

該項目只有兩個類,一個是服務實現類UserServiceImpl,代碼如下:

public class UserServiceImpl implements UserService {
    public String sayHi(String s) {
        return "hello " + s + "!";
    }
}

另外一個Main文件是啟動dubbo服務的,內容如下:

public class Main {
    public static void main(String[] args) {
        com.alibaba.dubbo.container.Main.main(args);
    }
}

該類是dubbo框架提供,作用是啟動dubbo服務,dubbo會在啟動服務時,讀取classpath下一個名為dubbo.properties文件的屬性值。

並指定了屬性key,只要按照dubbo的規則配置相關參數即可。有興趣的可以去查看下dubbo的源碼。

dubbo.properties文件配置如下:

dubbo.container=spring
#set dubbo Sping load setting xmls
dubbo.spring.config=classpath:dubbo-provider.xml
dubbo.protocol.name=dubbo
dubbo.protocol.port=28511

dubbo.container指定了dubbo的容器使用spring,dubbo內部有四種容器實現,SpringContainer是其中一種,也是默認的容器

dubbo.spring.config指定了dubbo在啟動服務時加載的spring配置文件。

dubbo.protocol.name和dubbo.protocol.port分別指定使用的協議名和端口

貼一下dubbo的源碼,SpringContainer類中定義了兩個常量,SPRING_CONFIG和DEFAULT_SPRING_CONFIG,

大概讀一下代碼就可以知道,start方法在執行時,會讀取dubbo.spring.config屬性值,該值指定的就是spring的配置文件,如果沒讀到,則使用默認的配置

默認配置為classpath下META-INF/spring/*.xml,意思是讀取classpath下META-INF文件夾下的spring文件夾中的所有xml文件。

所以我們也可以不配置dubbo.spring.config,但是要遵循dubbo默認的讀取路徑,將spring配置文件放置在META-INF/spring文件夾下。

 

接下來看dubbo-provider.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="dubbo-provider"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:provider cluster="failfast"/>
    <bean id="userService" class="com.dubbo.provider.UserServiceImpl"/>
    <dubbo:service interface="com.dubbo.api.UserService" ref="userService"/>
</beans>

該文件其實就是一個spring配置文件,只不過引入了dubbo相關的配置。

<dubbo:application>指定了程序名稱,我們可以在dubbo管理后台中通過該名稱更清晰的區分服務

<dubbo:registry>指定了注冊中心的地址

<dubbo:provider>指定了集群容錯模式,此處為快速失敗

<bean> 普通的spring依賴注入

<dubbo:service>服務導出,引用<bean>標簽注入的類

最后來看下provider項目的pom文件:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yinyuetai.dubbo</groupId>
    <artifactId>dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <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.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.demo.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

</project>

此處引入了zk相關的包,因為服務提供者在啟動時會向注冊中心注冊服務。

此處的provider引入了dubbo-api的jar包。

到此位置,provider項目的開發已經完成。

 

最后來看dubbo-consumer這個web項目,相對來說也是三個項目中最為負責的一個。

項目結構:

UserController類就是個控制器,使用requestMapping注解提供http接口服務,內容如下:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/hello.html")
    @ResponseBody
    public String sayHello(String name) {
        String welcome = userService.sayHi(name);
        return welcome;
    }
}

接下來看配置文件,首先看web.xml:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

    <!-- 配置Spring配置文件路徑 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:spring-config.xml
        </param-value>
    </context-param>
    <!-- 配置Spring上下文監聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>


</web-app>

<context-param>配置了spring配置文件的位置

下邊servlet中配置spring-mvc配置文件的位置,都是spring開發的基本配置。不多解釋了

spring-config.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:context="http://www.springframework.org/schema/context"
       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"
       default-autowire="byName">

    <!-- 開啟注解配置 -->
    <context:annotation-config/>

    <import resource="classpath:dubbo-consumer.xml"/>

</beans>

開啟了注解支持,並且通過import導入了另一份配置文件

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="dubbo-consumer"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <dubbo:consumer check="false"/>

    <!-- 導入dubbo配置 -->
    <import resource="classpath*:user-reference.xml"/>
</beans>

該配置指定了應用程序的名稱,注冊中心地址,以及dubbo-api項目中定義的dubbo配置文件。

spring-mvc.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:context="http://www.springframework.org/schema/context"
       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">

    <!-- 配置自動掃描的包路徑 -->
    <context:component-scan base-package="com.dubbo.consumer.web"/>
</beans>

僅僅定義了自動掃描的包路徑而已

最后看下pom文件:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yinyuetai.dubbo</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>dubbo-consumer Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <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>

        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.demo.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>dubbo-consumer</finalName>
    </build>
</project>

到此。dubbo的入門demo已經全部開發完成。

先通過Main.java中的main方法 啟動dubbo-provider項目。

然后將dubbo-consumer項目打成war包,部署到tomcat或其他web容器中。

在瀏覽器中訪問:localhost:tomcatport/dubbo-consumer/hello.html?name=test

tomcatport換成你本地的tomcat端口號

可以看到瀏覽器輸出:

 

說明我們的項目已經成功部署,可以成功調用了。

此時觀察dubbo管理后台,可以看到如圖所示:

兩個應用分別對應我們開發的provider和consumer,而名字則是由<dubbo:application name>指定的。

一個消費者,一個服務提供者,和我們開發的東西完全吻合。到此為止dubbo的入門示例已經全部完成。

相關的代碼放在了碼雲,懶的動手的可以直接下載運行看看效果。

碼雲地址:

dubbo-api:https://git.oschina.net/li_mingzhu/dubbo-api.git

dubbo-provider:https://git.oschina.net/li_mingzhu/dubbo-provider.git

dubbo-consumer:https://git.oschina.net/li_mingzhu/dubbo-consumer.git

 

關於dubbo管理后台,其實就是一個war包,只要部署在web容器運行即可。

暫時還沒有整理關於dubbo管理后台部署的文章,后續整理了我會補發鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM