dubbo的端口地址和ip写在那_开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~...

54648a8f04ddc9528d329591f44e1492.png

不知道你是否在工作中有遇到过类似情况:

  • dubbo接口调试复杂,需要通过telnet命令或者通过consumer调用来触发。
  • telnet语句参数格式复杂,每次编写都要小心谨慎,一旦出错又需重来。
  • 复杂对象参数传参调用接口复杂,编写java api调用接口时间成本较高。

ac420a0bae8217f2e84e3c51bb3c56ef.png


上述这些坑我在工作中都有遇见过,发现大部分耗时都会卡在调用dubbo服务做自测的阶段,所以后来花费了写业余时间写了一款高效的dubbo测试工具开源给大家使用。

这款工具目前已在实际工作中应用半年多,基本功能已经成熟,后续依旧会进行版本维护。

相关的代码地址为:

https://gitee.com/IdeaHome_admin/dubbo-proxy-tools

ps: 如果大家喜欢,希望能给出一颗宝贵的star

关于如何部署本工具

下载了gitlab的代码之后,你会看到有两个文件包:iubbo-proxy和iubbo-proxy-web,它们分别正好对应了后端代码和前端代码。

578fb3c76e2d391bed7eb5258d782fc9.png

前端代码的部署

前端采用非常简单的vue技术,只需要将文件部署到一台nginx上边即可运作。
前端的默认访问页面是test-dubbo-web.html。

但是有两个小点需要改动下js配置

constants.js

这份文件里面编写了对应的请求server地址,这块是对应了后端服务的url。

1ff31353f5965995a0071442d9c6c14f.png


由于请求dubbo接口需要通过zk注册中心来拉去服务名列表,所以需要在iubbo.x.js里面的commonzk中做配置:

14881c2887342531737c7611e72d52c0.png


这里的host是一个别称,相当于一个key用于供前端展示,实际上传输给后端的是用ip这个值。

后端代码的部署

后端工程采用了springboot框架技术,核心的配置放在了application.properties里面:

server.port=7089
application.invoker.name=iubbo-invoker-proxyspring.datasource.druid.password=
spring.datasource.druid.username=
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/iubbox-proxy
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Drivermybatis-plus.configuration.map-underscore-to-camel-case=truespring.redis.port=6379
spring.redis.host= 127.0.0.1

然后倒入建表的sql:

CREATE TABLE `t_dubbo_invoke_req_record` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) DEFAULT NULL COMMENT '用户id',`arg_json` varchar(2500) COLLATE utf8_bin DEFAULT NULL COMMENT 'dubbo请求参数',`create_time` datetime DEFAULT CURRENT_TIMESTAMP,`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;CREATE TABLE `t_user` (`id` int(9) NOT NULL AUTO_INCREMENT,`username` varchar(60) COLLATE utf8_bin DEFAULT NULL,`password` varchar(30) COLLATE utf8_bin DEFAULT NULL,`createTime` datetime DEFAULT CURRENT_TIMESTAMP,`updateTime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
  • t_user 用于记录相关的用户账号,方便于保存用户账号信息。
  • t_dubbo_invoke_req_record 用于记录请求dubbo接口的用例信息。

最后就是启动入口类org.iubbo.proxy.DubboInvokerApplication

启动成功截图

67e9131d87bd77e655f9ebfac8ce3abb.png

关于本工具的使用教程

本工具区分了已登录账号和未登录账号两类角色,已登录账号的使用者可以对请求的用例进行保存,方便下一次提取信息,未登录账号虽然没有保存用例的功能,但是不影响其使用本工具进行测试。

首页截图:

92a8bdde9e7a564cea3000095cd00c41.png

1.指定zk地址

在测试dubbo接口之前,我们通常都会去拉取一遍zk上边的service地址,操作如下图:
先在文本框点击,输入和js配置有关的字母或数字会有模糊匹配的选项供各位选择:

afca4b78e0f7f6cf1d2156892472ac51.png


选中了zk地址之后,再去点击拉取zk地址按钮(以前有同事刚接触这个工具的时候,这里被绕蒙了~~)

拉取zk地址的时候,后端会根据文章上边提到的js配置里面的ip值去拉取,拉取成功会有相关提示:

c1351c6de6b6ca6d6ccaeb8ae20b6ed6.png

接下来便是筛选dubbo服务地址的功能,在拉取zk地址下方有一个下拉框,这里面此时应当会被注入zk上所有dubbo服务列表的名称。

8398473a09cb6eb2cc297103429704a3.png


选择对于的service名称,然后在右边的“请输入名称”文本框中输入该接口对应的方法名称(一定要名称对应)


这里以调用MsgService的sendMsg方法为例:

02470785a7c220cd89753a9a0e68e37a.png

然后配置相关的参数和名称


选择对应参数类型和值:

aff536e20eac62939ffd06e57b5492bd.png


最后发起请求:

a9424c1d0ba893e9d3653a0ac9dbff13.png


在基础参数配置项的旁边,还有一个模块是专门配置consumer端的额外内容,这些参数项都是在平时工作中可能会应用到的场景,需要的时候可以进行配置。这里面也配备了工作中非常常用的直连选项。

我个人最喜欢使用的还是直连功能,因为在开发过程中,经常需要直连机器做自测:

1c58ce74bd9792813d78ef9147748e89.png

假如说希望保存自己曾经发送过的dubbo测试用例,那么你只需先进行登录账号,账号直接往t_user表里面写入一条数据即可:

7826c70dd2409194db5f1819ad342b38.png


在首页的右上方有个进入登录页面按钮:

f0151e3a73682ea9850474f37cc85118.png


点击登录

497ad7b5ed025946e36a948167be70d7.png

如何保存请求用例:

6cff999f84fe79acf8d79d93fb203e1f.png


保存用例这里有些小瑕疵,需要用户手动刷新下页面才能显示保存的用例信息:

5d38c81dac76461de58117188f4159cc.png


点击选用参数,则页面又会重新回显之前使用过的请求信息。

特殊参数请求

该工具支持多种开发中常见的参数格式调用,目前支持常规参数

ps:注意这里的参数格式需要和dubbo方法里面的参数格式按照相同顺序相同类型做映射,否则后端程序会返回找不到对应方法

Java的常用基本类型数据:boolean,short,int,long,double,char,float

Java中常用的包装类数据:

java.lang.String,
java.lang.Integer,
java.lang.Object,
java.util.List,
java.lang.Class,
java.lang.Long,
java.lang.Boolean,
java.util.Map,
java.util.Date,
java.lang.Float,
java.lang.Double

对于简单的数据类型传递

9b185f8a3ace9eef0230f1eebc3acf8e.png

多参数,中英文混合传递

6c222909abf52b5c2681c855c05726d5.png

List类型参数的传递

45beb64d61dd3d3b0023d1bdc8dc5df0.png

Class类型的参数传递

1e6300219692458aca929a629b03c648.png

Map类型的参数传递

5c5c8e31f85223e3683856c65d79ae21.png

Date类型的参数传递

b57badf00acbe9d083488d2bc716b98b.png

自定义对象参数传参

如果在实际应用中遇到了这种场景,需要调用以下的接口,那么这个使用就需要使用自定义参数了:

f8e4cae48a57daeaf24726f049e99b83.png

31e999306419cefe400da1f8eb26eba7.png

6015e16ebbd4a8f06f74abd1233a70e5.png

复杂类型自定义参数传递

假设遇到了List类型参数,而且传输的List里面包含有自定义对象,例如下边这种类型:

List<UserDTO> testUserDtoList(List<UserDTO> userDTOList,Class clazz);

那么此时的传参案例可以像下边这样来写:

9a24f3d6c75c9d333a81ce27a185463a.png

易错点归纳

注意请求的参数顺序要和方法对应的参数顺序一致,假设服务的方法定义如下:

<T> List<T> getList(List<Long> var1, Class<T> var2);

那么传入的参数就必须先填List参数,再写Class参数。

  • 正确示例:(先写了List参数,再写Class参数)
  • 错误示例:(先写了Class参数,再写List参数)

作者:Java知音

原文链接:https://mp.weixin.qq.com/s/RczGYu9stYZbhUm6ON31pg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据类型总结

MySQL中的数据类型大的方面来分&#xff0c;可以分为&#xff1a;日期和时间、数值&#xff0c;以及字符串。下面就分开来进行总结。 日期和时间数据类型 MySQL数据类型含义date3字节&#xff0c;日期&#xff0c;格式&#xff1a;2014-09-18time3字节&#xff0c;时间&#xf…

python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)

最近在查阅斐波那契数列时&#xff0c;看到下面的文章&#xff0c;总结得非常好&#xff0c;于是自己上手使用 Python 练习并实现多种求解方法守望&#xff1a;面试官问你斐波那契数列的时候不要高兴得太早​zhuanlan.zhihu.com斐波那契数列的定义&#xff1a;斐波那契数列 又称…

[修复] Firemonkey 使用 DrawPath 断线问题(Android iOS 平台)

问题&#xff1a;使用 Canvas.DrawPath 绘制时&#xff0c;最后一点无法画到终点位置。&#xff08;这个问题要在粗线才能察觉&#xff09; 适用&#xff1a;Delphi 10 Seattle &#xff08;或更早的版本&#xff09; for Android & iOS 修复方法&#xff1a; 请将源码 FMX…

叠加卡片列表_使用PowerBI制作卡片图

如果要汇报重要的指标&#xff0c;比如超额完成的销售额、同比增长率等&#xff0c;不要把它埋没在图表里&#xff0c;用一个大大的数字自豪的展示它吧。卡片图&#xff0c;也被称为大数字磁贴&#xff0c;严格来说不能算是一种图表&#xff0c;只是仪表板的一个组件而已。在仪…

stringbuffer常用方法_第八讲:常用类库API

一、字符串操作---String类1、String可以表示一个字符串&#xff0c;不能被继承(最终类)不可变2、String类实际是使用字符数组存储的String类的两种赋值方式&#xff1a;(1)一种称为直接赋值、Java推荐使用第一种方式String name"小白"(2)通过关键字new调用String的构…

对应版本_Office 开发版本号与版本对应关系

Office从开发至今经历了非常多的版本&#xff0c;如office2000、office2003、office2007、office2010,office 2016到2019等等&#xff0c;那么大家知道吗&#xff1f;其实office还有开发版本号&#xff0c;可能很多用户不太熟悉&#xff0c;其实你打开office安装目录就可以明白…

python的def语句_【零基础学Python】def语句,参数和None值

像之前的print()、input()和len()功能&#xff0c;Python提供了一些类似的内置函数&#xff0c;另外也可以自己编写自定义函数。 示例&#xff1a; def hello(): print(Howdy!) print(Howdy!!!) print(Hello there.) hello() 第一行是def语句&#xff0c;它定义了一个名为hello…

筛选出一证多卡 用sql_对比Excel学习SQL(3):对列和行的操作

本文将从以下几个方面进行&#xff1a;一、对列的查询01 查询单个列03 查询所有列04 对列去重二、对列的值排序01 升序排列02 降序排列03 多个列排序三、对行的筛选01 单条件筛选02 多条件筛选03 IN命令04 LIKE命令正文&#xff1a;一、对列的查询Excel里对于一张表&#xff0c…

jude的一些基本用法

jude的基本使用方法 作为一名软件工程专业的学生&#xff0c;常常需要画各类流程图&#xff0c;数据流图。 说来惭愧&#xff0c;我对于各类图的画法以及各类画图软件并不熟悉。 需求工程老师给我们推荐过jude这个画图软件&#xff0c;但由于我不会使用&#xff0c;折腾了不少时…

python中reduce函数_Python中的reduce()函数

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似&#xff0c;一个函数 f&#xff0c;一个list&#xff0c;但行为和 map()不同&#xff0c;reduce()传入的函数 f 必须接收两个参数&#xff0c;reduce()对list的每个元素反复调用函数f&#xff0…

oracle 存储过程中调用存储过程

create procedure sp_name() begin ……… end 比如&#xff1a; create procedure pro_showdbs() show datebase; end //用exec调用存储过程。 一个带参数的存储过程。SQL> CREATE OR REPLACE PROCEDURE HelloWorld1 (2 p_user_name VARCHAR23 ) AS4 BEGIN5 dbms_output.pu…

序列生成_PR Structured Ⅴ:GraphRNN——将图生成问题转化为序列生成

本文使用 Zhihu On VSCode 创作并发布Paper | Code本文一作实在是太大佬了&#xff0c;让我和小伙伴焦虑了好一阵子。作者主页送你们&#xff0c;将这份焦虑传递下去。Introduction图生成有很多用处&#xff1a;建模physical and social interactions发现新的化学和分子结构构建…

网络资产管理系统_固定资产管理系统网络版的各种语言翻译

固定资产管理系统网络版指的是固定资产管理系统项目的联网版本&#xff0c;适合需要远程操作及多人同时操作的用户&#xff0c;各个版本都提供相应的网络版。固定资产管理系统网络版系统稳定、功能强大&#xff0c;支持局域网内用户联网操作软件&#xff0c;适用于各机关企事业…

数据字典在sga的哪一个组件中缓存_非功能性约束之性能(1)-性能银弹:缓存...

在《什么是架构属性》一文中提到提高「性能」的主要方式是优化&#xff0c;而优化的其中一个主要手段就是添加缓存&#xff01;在软件工程里有这么一句话&#xff1a;「没有银弹」&#xff01;就是说由于软件工程的复杂性&#xff0c;没有任何一种技术或方法能解决所有问题&…

.NET的轻量级IOC框架芮双随笔

面向对象的设计的重用性一直是他的一个重要特性&#xff0c;为了有效定义这一特性&#xff0c;又引申出面向对象设计的几个原则&#xff1a;高内聚、低耦合、功能单一、优先使用聚合、面向接口编程等。依赖这些原则和前人的经验&#xff0c;又发展出形形色色的模式&#xff0c;…

python热部署_关于Spring Cloud 框架热部署的方法

1、在对应的pom.xml 文件中添加依赖org.springframework.bootspring-boot-devtoolstrue2、注&#xff1a;project 中添加 spring-boot-maven-plugin,主要在eclipse中使用&#xff0c;idea中不需要添加此配置。【IDEA 忽略这个步骤哦(⊙o⊙)&#xff1f;】org.springframework.b…

《世界是数字的》读后感

随着科技的发展&#xff0c;我们已经进入数字化的世界。十年前&#xff0c;我们还拿着小灵通、按键手机&#xff0c;十年后&#xff0c;我们每个人的手上都有一部触屏手机。科技的发展使得世上的东西都更新换代的很快&#xff0c;任何东西存在的时间都很短&#xff0c;瞬息间就…

html js css如何关联_会html+css+js就能把前端项目发布到多个平台

在这篇文章中&#xff0c;小编将给大家分享如何让自己的前端代码发布到多个常用的平台。看完这篇文章以后&#xff0c;你就知道了如何让你的前端代码发布到多个平台&#xff0c;如&#xff1a;安卓应用程序&#xff0c;小程序&#xff0c;iOS应用程序&#xff0c;Windows,Mac,L…

机器学习 监督学习论文_NeurIPS 2020最佳机器学习论文奖

NeurIPS 会议在提交的大量论文和1903年被接受的论文中&#xff0c;有3篇被授予。今年获奖的论文有&#xff1a;语言模型是学习者很少广义形式相关平衡的无悔学习动力学列子集选择和Nystrom方法的改进保证和多重下降曲线该NeurIPS委员会由一些指导准则。最好的论文必须具有革命性…

Java--File文件操作

判断文件或目录是否存在 判断File对象所指向的文件或者目录是否存在&#xff0c;使用exists()函数。 File f new File("/Users/bemaster/Desktop/in.txt"); System.out.println(f.exists()); 判断当前File对象是文件还是目录 判断当前File对象是否是文件&#xff0c…