一步一步开发一个Dubbo框架的小Demo并用Java和Python调用Dubbo接口
“这是一个基于spring+dubbo开发的小demo。主要用于学习基于spring+dubbo框架的开发流程。用将此项目作为学习使用python进行dubbo接口测试的服务端程序。”
构建测试知识体系,欢迎关注
1. 创建Dubbo项目
1.1 使用Maven创建多模块项目
因为这是一个demo项目,我希望将dubbo provider和comsumer都放到一个工程中方便管理。所以我这里创建了一个Maven多模块工程。操作步骤如下:
打开IntelliJ IDEA——>
File——>New——>Project——>
Maven——>
不要勾选Create from archetype——>Next——>
输入groupId(chunming.liu)和artifactId(dubbo-demo)——>Next——>
设置项目名称dubbodemo——>Finished
这样我们就创建好了一个普通项目,因为该项目是作为一个Parent project存在的,可以直接删除src文件夹。
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。
<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,内容如下:
<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,就可以搭建起来。下面一步一步来做一下。
克隆代码到本地git clone https://github.com/apache/dubbo-admin.git
配置注册中心地址,就是zookeeper的地址啦。编辑dubbo-admin-server/src/main/resources/application.properties,设置实际的zookeeper地址。
admin.registry.address=zookeeper://127.0.0.1:2181
admin.config-center=zookeeper://127.0.0.1:2181
admin.metadata-report.address=zookeeper://127.0.0.1:2181
启动Dubbo-admin,有两种方法:
1)mvn --projects dubbo-admin-server spring-boot:run2)cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar
访问http://localhost:8080,使用用户名root,密码root登录。
4.2 查看dubbo服务
进入首页之后可以看到下面的内容。
基础信息部分可以看到服务的提供者和服务名。
服务信息部分可以看到我们提供的服务
也可以在服务测试页面,对dubbo接口进行测试。
dubbo-admin还提供服务治理功能。
5. 参考资料
https://blog.csdn.net/noaman_wgs/article/details/70214612
https://gitee.com/qianxunclub/java-demo/tree/master/chapter-2
https://www.cnblogs.com/wangmingshun/p/6383576.html
https://www.cnblogs.com/victorbu/p/10895676.html
https://github.com/apache/dubbo-admin
本文分享自微信公众号 - 明说软件测试(liuchunmingnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
算法篇:树之树的层次遍历
算法: 树的层次遍历是树的基本操作之一,包括二叉树的层次遍历,多叉树的层次遍历,以及二叉树层次遍历的变形题目,层次遍历+每一层的节点的翻转等操作。 对于这类题目,典型算法就是先将树按照层次存入数组当中,然后统一对每一层的数据进行数据处理。 题目1: 102. 二叉树的层序遍历 https://leetcode-cn.com/problems/binary-tree-level-order-traversal/ 代码实现: /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ /* 方法1:非递归操作 */ /*func levelOrder(root *TreeNode) [][]int { if root == nil { return nil } var stack []*TreeNode var result [][]int stack = append(stack,root) for { if le...
- 下一篇
丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第298篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 在前几天的文章《为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?》中,我曾经对几款属性拷贝的工具类进行了对比。 然后在评论区有些读者反馈说MapStruct才是真的香,于是我就抽时间了解了一下MapStruct。结果我发现,这真的是一个神仙框架,炒鸡香。 这一篇文章就来简单介绍下MapStruct的用法,并且再和其他几个工具类进行一下对比。 为什么需要MapStruct ? 首先,我们先说一下MapStruct这类框架适用于什么样的场景,为什么市面上会有这么多的类似的框架。 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。很多人都对三层架构、四层架构等并不陌生。 甚至有人说:"计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,如果不行,那就加两层。" 但是,随着软件架构分层越来越多,那么各个层次之间的数据模型就要面临着相互转换的问题,典型的就是我们可以在代码中...
相关文章
文章评论
共有0条评论来说两句吧...