一步一步開發一個Dubbo框架的小Demo並用Java和Python調用Dubbo接口

這是一個基於spring+dubbo開發的小demo。主要用於學習基於spring+dubbo框架的開發流程。用將此項目做爲學習使用python進行dubbo接口測試的服務端程序。
javascript


構建測試知識體系,歡迎關注html

1. 建立Dubbo項目

1.1 使用Maven建立多模塊項目

由於這是一個demo項目,我但願將dubbo provider和comsumer都放到一個工程中方便管理。因此我這裏建立了一個Maven多模塊工程。操做步驟以下:java

  1. 打開IntelliJ IDEA——>python

  2. File——>New——>Project——>git

  3. Maven——>github

  4. 不要勾選Create from archetype——>Next——>web

  5. 輸入groupId(chunming.liu)和artifactId(dubbo-demo)——>Next——>spring

  6. 設置項目名稱dubbodemo——>Finishedapache

  7. 這樣咱們就建立好了一個普通項目,由於該項目是做爲一個Parent project存在的,能夠直接刪除src文件夾。api

1.2 建立dubbo-api子項目

dubbo-api用來存放公共接口,在dubbo-provider和dubbo-consumer上都會用到。

在dubbodemo項目上,點擊右鍵,建立一個Model(該模塊即爲子項目),不要勾選Create from archetype——>Next,輸入artifactId(dubbo-api)——>Next——>Finished。

在dubbo-api子項目中建立package(chunming.liu.dubbo.api),其中建立interface類IDubboService:

public interface IDubboService { public Map<String, List> getPermissins(String id, int count);}

1.3 建立dubbo-provider子項目

參考1.2小節,建立dubbo-provider子項目。

在項目中建立pacakge(chunming.liu.dubbo.provider),在其中建立DubboServiceImpl類,實現1.2中的公共接口IDubboService。代碼以下:

public class DubboServiceImpl implements IDubboService { public Map<String, List> getPermissins(String id, int count) { List<String> demo = new ArrayList<>(); Map<String,List> response = new HashMap<>(); for (int i = 0; i < count; i++) { demo.add(String.format("Permission_%s", id + i)); } response.put("permissions",demo); return response; }}

dubbo-provider子項目的pom文件中加入公共接口所在的依賴包。

<dependency> <groupId>chunming.liu</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version>        </dependency>

用Spring配置聲明暴露服務,在dubbo-provider子項目的resources目錄下,建立META-INF/spring目錄,並在其中建立 Spring 的核心配置文件 applicationContext,起名叫 dubbo-provider-applicationContext.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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識--> <dubbo:application name="dubbo-provider" owner="chunming" organization="liu"/> <!--使用 zookeeper 註冊中心暴露服務,注意要先開啓 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181" timeout="3000"/> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:service interface="chunming.liu.dubbo.api.IDubboService" ref="dubboService" protocol="dubbo" /> <!--增長hessian協議,若是設置server="servlet",則須要web容器支持,咱們的provider是以jar方式運行的,因此用jetty--> <dubbo:protocol name="hessian" port="20881" server="jetty" contextpath="dubbo-provider"/> <dubbo:service interface="chunming.liu.dubbo.api.IDubboService" ref="dubboService" protocol="hessian" /> <!--具體實現該接口的 bean--> <bean id="dubboService" class="chunming.liu.dubbo.provider.DubboServiceImpl"/></beans>

爲了使這個配置生效,須要在dubbodemo項目的pom文件中加入以下依賴:

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.1</version> </dependency>    </dependencies>


其實這個依賴加入到dubbo-provider子項目的pom文件中也是能夠的。只不過由於這些依賴在dubbo-consumer子項目中也會用到,放到dubbodemo項目的pom文件中以後,就不須要在dubbo-consumer子項目再引用一次了。

如今,就能夠編寫啓動dubbo-provider服務的類了。在chunming.liu.dubbo.provider包中建立Provider類,代碼以下:

public class Provider { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/dubbo-provider-applicationContext.xml"); context.start(); System.out.println("服務已經啓動了"); System.in.read(); }}


至此,dubbo-provider服務就寫完了。經過運行Provider類就能夠啓動服務了。

2. 測試Dubbo項目

2.1 建立java版客戶端

建立一個dubbo-consumer子項目,用來測試dubbo-provider。建立方法也是參考1.2小節。項目的pom文件中加入公共接口所在的依賴包:

<dependency> <groupId>chunming.liu</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version>        </dependency>

經過Spring配置引用遠程dubbo服務,方法是:在resources目錄下建立文件夾META-INF/spring,其中建立Spring框架配置文件dubbo-consumer-applicationContext.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-admin 或 dubbo-monitor 會顯示這個名字,方便辨識--> <dubbo:application name="dubbo-consumer" owner="chunming" organization="liu"/> <!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送--> <dubbo:registry address="zookeeper://localhost:2181" timeout="3000"/> <!--使用 dubbo 協議調用定義好的 api.PermissionService 接口--> <!-- 由於 name 指定的是傳輸協議的名稱:dubbo rmi hessian webservice (對應常見的傳輸協議:Dubbo、RMI、Hessain、WebService、Http)--> <dubbo:reference interface="chunming.liu.dubbo.api.IDubboService" id="dubboService" /></beans>

編寫Consumer.java調用遠程dubbo服務的接口:

public class Consumer { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/dubbo-consumer-applicationContext.xml"); context.start(); System.out.println("客戶端已經啓動"); IDubboService dubboService = context.getBean(IDubboService.class); System.out.println("消費"); System.out.println(dubboService.getPermissins("test", 5)); //調用遠程dubbo接口 }}

啓動Consumer,將會獲得以下輸出:

客戶端已經啓動消費{permissions=[Permission_test0, Permission_test1, Permission_test2, Permission_test3, Permission_test4]}

2.2 建立Python版客戶端

不少同窗是使用Python作軟件測試的,Python也能夠調用遠程dubbo接口,代碼以下:

import telnetlib

class Dubbo(telnetlib.Telnet): prompt = 'dubbo>' coding = 'utf-8'
def __init__(self, host=None, port=0, timeout=3000): super().__init__(host, port, timeout) self.write(b'\n')
def command(self, flag, str_=""): data = self.read_until(flag.encode()) self.write(str_.encode() + b"\n") return data
def invoke(self, service_name: str, method_name: str, arg: str): command_str = "invoke {0}.{1}({2})".format(service_name, method_name, arg) print(command_str) self.command(Dubbo.prompt, command_str) data = self.command(Dubbo.prompt, "") return data.decode(Dubbo.coding, errors='ignore').split('\n')[1].strip()

if __name__ == '__main__': conn = Dubbo('127.0.0.1', 20880)
result = conn.invoke( "chunming.liu.dubbo.api.IDubboService", "getPermissins", "'test',5" )    print(result)

4. Dubbo管理後臺

能夠經過Dubbo管理控制檯管理provider和consumer。咱們如今學習下如何搭建和使用Dubbo管理後臺。

4.1 搭建dubbo-admin

參考https://github.com/apache/dubbo-admin#production-setup這個section,就能夠搭建起來。下面一步一步來作一下。

  1. 克隆代碼到本地git clone https://github.com/apache/dubbo-admin.git

  2. 配置註冊中心地址,就是zookeeper的地址啦。編輯dubbo-admin-server/src/main/resources/application.properties,設置實際的zookeeper地址。

# centers in dubbo2.7admin.registry.address=zookeeper://127.0.0.1:2181admin.config-center=zookeeper://127.0.0.1:2181admin.metadata-report.address=zookeeper://127.0.0.1:2181
  1. 啓動Dubbo-admin,有兩種方法:
    1)mvn --projects dubbo-admin-server spring-boot:run

    2)cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar

  2. 訪問http://localhost:8080,使用用戶名root,密碼root登陸。

4.2 查看dubbo服務

進入首頁以後能夠看到下面的內容。

基礎信息部分能夠看到服務的提供者和服務名。

服務信息部分能夠看到咱們提供的服務

也能夠在服務測試頁面,對dubbo接口進行測試。

dubbo-admin還提供服務治理功能。

5. 參考資料

  1. https://blog.csdn.net/noaman_wgs/article/details/70214612

  2. https://gitee.com/qianxunclub/java-demo/tree/master/chapter-2

  3. https://www.cnblogs.com/wangmingshun/p/6383576.html

  4. https://www.cnblogs.com/victorbu/p/10895676.html

  5. https://github.com/apache/dubbo-admin


本文分享自微信公衆號 - 明說軟件測試(liuchunmingnet)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索