一步一步开发一个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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索