mock 测试dubbo接口(dubbo测试接口调用)

网友投稿 520 2023-04-29


本篇文章给大家谈谈mock 测试dubbo接口,以及dubbo测试接口调用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享mock 测试dubbo接口的知识,其中也会对dubbo测试接口调用进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Dubbo——Mock 机制

Mock 机制是 RPC 框架中非常常见、也非常有用的功能,不仅可以用来实现服务降级,还可以用来在测试中模拟调用的各种异常情况。Dubbo 中的 Mock 机制是在 Consumer 这一端实现的,具体来说就是在 Cluster 这一层实现的。

在前面深入介绍了 Dubbo 提供的多种 Cluster 实现以及相关的 Cluster Invoker 实现,其中的 ZoneAwareClusterInvoker 就涉及了 MockClusterInvoker 的相关内容。本文我们就来介绍 Dubbo 中 Mock 机制的全链路流程,不仅包括与 Cluster 接口相关的 MockClusterWrapper 和 MockClusterInvoker,还会回顾之前的 Router 和 Protocol 接口,分析它们与 Mock 机制相关的实现。

Cluster 接口有两条继承线(如下图所示):一条线是 AbstractCluster 抽象类,这条继承线涉及的全部 Cluster 实现类;另一条线是 MockClusterWrapper 这条线。

MockClusterWrapper 是 Cluster 对象的包装类,在之前介绍 Dubbo SPI 机制时已经分析过 Wrapper 的功能,MockClusterWrapper 类会对 Cluster 进行包装。下面是 MockClusterWrapper 的具体实现,其中会在 Cluster Invoker 对象的基础上使用 MockClusterInvoker 进行包装:

MockClusterInvoker 是 Dubbo Mock 机制的核心,它主要是通过 invoke()、doMockInvoke() 和 selectMockInvoker() 这三个核心方法来实现 Mock 机制的。

下面就来逐个介绍这三个方法的具体实现。

首先来看 MockClusterInvoker 的 invoke() 方法,它会先判断是否需要开启 Mock 机制。如果在 mock 参数中配置的是 force 模式,则会直接调用 doMockInvoke() 方法进行 mock。如果在 mock 参数中配置的是 fail 模式,则会正常调用 Invoker 发起请求,在请求失败的时候,会调动 doMockInvoke() 方法进行 mock。下面是 MockClusterInvoker 的 invoke() 方法的具体实现:

在 doMockInvoke() 方法中,首先调用 selectMockInvoker() 方法获取 MockInvoker 对象,并调用其 invoke() 方法进行 mock 操作。doMockInvoke() 方法的具体实现如下:

selectMockInvoker() 方法中并没有进行 MockInvoker 的选择或是创建,它仅仅是将 Invocation 附属信息中的 invocation.need.mock 属性设置为 true,然后交给 Directory 中的 Router 集合进行处理。selectMockInvoker() 方法的具体实现如下:

MockInvokersSelector 是 Dubbo Mock 机制相关的 Router 实现,在未开启 Mock 机制的时候,会返回正常的 Invoker 对象集合;在开启 Mock 机制之后,会返回 MockInvoker 对象集合。MockInvokersSelector 的具体实现如下:

在 getMockedInvokers() 方法中,会根据 URL 的 Protocol 进行过滤,只返回 Protocol 为 mock 的 Invoker 对象,而 getNormalInvokers() 方法只会返回 Protocol 不为 mock 的 Invoker 对象。

介绍完 Mock 功能在 Cluster 层的相关实现之后,还要来看一下 Dubbo 在 RPC 层对 Mock 机制的支持,这里涉及 MockProtocol 和 MockInvoker 两个类。

首先来看 MockProtocol,它是 Protocol 接口的扩展实现,扩展名称为 mock。MockProtocol 只能通过 refer() 方法创建 MockInvoker,不能通过 export() 方法暴露服务,具体实现如下:

下面再来看 MockInvoker 是如何解析各类 mock 配置的,以及如何根据不同 mock 配置进行不同处理的。这里重点来看 MockInvoker.invoke() 方法,其中针对 mock 参数进行的分类处理具体有下面三条分支:

MockInvoker.invoke() 方法的具体实现如下所示:

针对 return 和 throw 的处理逻辑比较简单,但 getInvoker() 方法略微复杂些,其中会处理 MOCK_MAP 缓存的读写、Mock 实现类的查找、生成和调用 Invoker,具体实现如下:

在 getMockObject() 方法中会检查 mockService 参数是否为 true 或 default,如果是的话,则在服务接口后添加 Mock 字符串,作为服务接口的 Mock 实现;如果不是的话,则直接将 mockService 实现作为服务接口的 Mock 实现。getMockObject() 方法的具体实现如下:

本文重点介绍了 Dubbo 中 Mock 机制涉及的全部内容:

关于jmeter测试dubbo接口方式

本文章介绍如何使用jmeter测试dubbo接口,涉及如下两种方式

1.使用官方dubbo版本包测试dubbo接口

2.通过自己编写java请求插件,实现dubbo调用

选择方式1或方式2并没有什么区别,取决于部分自研公司对dubbo进行mock 测试dubbo接口了封装,导致官方提供的dubbo包并不适用于方式1,则可以通过方式2去调用

https://github.com/ningyu1/jmeter-plugins-dubbo/releases
解压tar将获取到的jar包放入${JMETER_HOME}\lib\ext路径下(这里获取到的jar包为jmeter-plugins-dubbo-2.7.1-jar-with-dependencies)mock 测试dubbo接口,重启jmeter应用(这里重启完应用会添加取样器会多出一个dubbo sample)

右键添加,选择线程-线程组

2.光标对准线程组右键添加-取样器-dubbo sample

此处需要关注,当方法接收的是一个String,或者List等类型的参数,可参照截图配置
那么当方法接收的参数是一个对象时,需要获取对接接口的api jar包并关联到当前测试计划
选中测试计划,点击下方浏览按钮,选择对应的jar包

传参的具体方式可参照如下

接口1返回:

接口2返回

mock 测试dubbo接口了下网上的大多请求都是单接口请求dubbo,这样就会导致,每次有新的接口的时候都得去更新新的请求,这里提供一个一劳永逸的方法,通过泛化调用,实现一个jar请求可适配所有接口,一般看到这个文章的可能大多都是测试的同学,对于当前方法需要对java有一定的基础,所以这个时候就体验到学习的重要性了,下面开始操作吧

file-new-project,选择maven

输入组织-坐标后点击next

按需配置名称路径后点击finsh

pom.xml配置如下

实现方式如下

打包操作

左侧窗口为生成的jar包和lib目录

这里要说明下,网上提供了一种方式,通过修改安装目录bin下jmeter.properties文件关联lib下的依赖
文件中增加如下(通过尝试,这么做会导致jmeter启动由于jar包加载顺序的问题,ui部分控件不可用)

这里mock 测试dubbo接口我使用的是另一种更为简便的方式
将原安装目录lib下ext修改为extbak
新建ext,并将工程lib下的jar包和dobbo-jmeter-interface-1.0-SNAPSHOT.jar放入之
由于可能会用到随机函数,从extbak获取ApacheJMeter_functions.jar,也放入到新建的ext目录下
重启jmeter,稍等片刻

添加java请求

添加结果树

点击运行后,结果树信息如下

后续可自行配置断言和随机参数等

Dubbo的基本使用

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance
如果在消费端和服务端都配置了负载均衡策略,以消费端为准。

在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不一样的。

消费者调用一个服务,分为三步:
1.消费者发送请求(网络传输)
2.服务端执行服务
3.服务端返回响应(网络传输)

如果在服务端和消费端各配置了一个timeout,那就比较复杂了,假设
1.服务执行为5s
2.消费端timeout=3s
3.服务端timeout=6s
那么消费端掉用服务时,消费端会收到超时异常(因为消费端超时了),服务端一切正常(服务端没有超时)。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/fault-tolerent-strategy/
集群容错表示:服务消费者在掉用某个服务时,这个服务有多个服务提供者,在经过负载均衡后选择其中一个服务提供者之后进行调用,但调用报错后,Dubbo所采取的后续处理策略。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/example/service-downgrade/

服务降级表示:服务消费者在调用某个服务提供者时,如果该服务提供者报错了,所采取的措施。

集群容错和服务降级的区别在于:
1.集群容错时整个集群范围内的容错
2.服务降级时单个服务提供者的自身容错

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-stub/
本地存根:名字很抽象,但实际上不难理解,本地存根就是一段逻辑,这段逻辑是在服务消费端执行的,这段逻辑一般都是由服务提供者提供,服务提供者可以利用这种机制在服务消费者远程调用服务提供者之前或之后再做一些其他事情,比如结果缓存,请求参数验证等等。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-mock
本地伪装就是Mock,Dubbo中的Mock的功能相对于本地存根更简单一点,Mock其实就是Dubbo中的服务容错的解决方案。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/callback-parameter/
如果当前服务支持参数回调,意思就是对于某个服务接口中的某个方法,如果想支持消费者在调用这个方式时能设置回调逻辑,那么该方法就是需要提供一个入参用来表示回调逻辑
因为Dubbo协议是基于长连接,所以消费者在两次调用同一个方法想指定不同的回调逻辑,那么就需要在调用时在指定一定key进行区分。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/async-call/
理解起来比较容易,主要要理解CompletableFuture,如果不理解,就直接把它理解为Future
其他异步调用方式: https://mp.weixin.qq.com/s/U3eyBUy6HBVy-xRw3LGbRQ

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/example/generic-reference/
泛化调用可以用来做服务测试。
在Dubbo中,如果某个服务想要支持泛化调用,就可以将该服务的generic属性设置为true,那对于服务消费者来说,就可以不用依赖该服务的接口,直接利用GenericService接口来进行服务调用

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/generic-service/
实现了GenericService接口就是泛化服务

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/rest/

github地址: https://github.com/apache/dubbo-admin

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/config-rule/
注意动态配置修改的是服务参数,并不能修改服务的协议,IP,PORT,VERSION,GROUP,因为这5个信息是服务的标识信息,是服务的身份证号,是不能修改的。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/example/routing-rule/

https://zhuanlan.zhihu.com/p/42671353 关于mock 测试dubbo接口和dubbo测试接口调用的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 mock 测试dubbo接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于dubbo测试接口调用、mock 测试dubbo接口的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口类的实现(接口的实现类可以有自己的方法吗)
下一篇:在接口中实现方法(接口中的方法必须全部实现吗)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~