凡科做网站视频,网站哪家好,怀柔网站整站优化公司,小米开发者模式1、前言 在日常开发过程中#xff0c;大家经常都会遇到#xff1a;新需求来了#xff0c;但是需要跟第三方接口来对接#xff0c;第三方服务还没好#xff0c;我们自己的功能设计如何继续呢#xff1f;这里#xff0c;给大家推荐一下Mock方案。 2、场景示例 2.1、场景一… 1、前言 在日常开发过程中大家经常都会遇到新需求来了但是需要跟第三方接口来对接第三方服务还没好我们自己的功能设计如何继续呢这里给大家推荐一下Mock方案。 2、场景示例 2.1、场景一公司外部间的接口调用 我们都知道联调外部接口往往都需要申请测试环境而申请外部测试环境的时间往往都很长、会耗费很多精力。当然一般都是项目经理去协调的但是作为有担当的开发人员不可能在这个空窗期摸鱼划水吧。不然等环境下来之后可就是自己苦日子的开始毕竟不催工期的项目经理还是少见的。 2.2、场景二公司内部之间的接口调用 曾经有一个项目需要我们配合另一个部门一起做。需求宣讲完后就是定排期然后我们就问合作部门“这几个接口什么时候可以联调” 因为合作部门还在赶另外一个项目便回复道“我们先一起对接口等忙完手头这个项目再给出排期可以吗” 然后我们催促道“那也得给出一个具体的上线计划啊” 在我们的催促下合作部门终于给出了一个日期。 过了几天合作部门手头的项目出现了延期又跑过来跟我们说“我们可能晚几天才能提供那些接口。” 因为需要与对方交互的接口的功能迟迟未动我们也不敢释放人手担心人手释放后项目又立马启动开发人员好不容易熟悉了新项目又要回来做这个。 为此我们坐在一起商量了一个解决思路 3、解决思路 我们希望有一个 Mock 接口服务它能提供与正式服务的 URI、出入参一样的接口区别是主机名或者 URL 的前缀不一样。 在开发和测试过程中我们都连接上 Mock 服务。等到接口或环境搭建好后我们无须修改代码通过一个简单的配置切换即可让服务连接到真实接口服务然后通过一些简单的回归测试即可实现上线大大提升了开发效率此时整体的系统架构如下图所示 不过如果我们想实现这一思路可就一点不简单了因为他包含了Mock服务端和Mock服务客户端调用设计。 4、Mock服务端设计 先说下在Mock服务端设计过程中都需要满足哪些需求 4.1、Mock接口支持返回动态字段数据 比如有个接口输入的参数为userId、orderid、redirectUrl如下所示 输出参数为success和startTime如下所示 我们希望每次调用这个Mock接口时startTime都返回当前时间如 {success:true,startTime:2023-11-12 124502} 4.2、Mock接口支持一些简单逻辑 在测试过程中我们会通过不同的测试用例走完不同的流程。 紧接着上面的例子比如我们希望调用 Mock 接口传入的 UserID 是 10001那么 Mock 接口返回的 success 值为 True否则为 False而后系统会根据不同的 success 值进入不同的流程。 4.3、Mock接口支持回调 在实际开发工作中有很多联调接口需要异步回调比如上面的例子中如果返回的 success 值是 True我们希望过一段时间回调 Redirect URL。 4.4、Mock接口支持规则校验 我们希望通过添加一些规则让这个 Mock 服务对传入的参数进行校验比如校验 UserID 是否为数字、OrderID 是否为 15 位数字、Redirect URL 是否为 URL…… 4.5、Mock接口支持接口文档导入 这一点比较特别比如某些团队在设计接口文档时直接将接口定义放在 Wiki 上而某些团队直接写在 Java 代码中再通过 Swagger 生成在线接口文档。 对于前者我们要求定义接口时直接将接口文档放在新的 Mock 服务上。而对于后者因为不想改变他们的习惯所以最终 Mock 服务需要支持 Swagger 文档导入。 根据以上五点需求我们开始在市面上找一些合适的开源框架并发现市面上收费的接口文档管理工具有 Apizza、Eolinker免费的有 YAPI 和 RAP2出于各种原因的考虑最终我们决定在 YAPI 和 RAP2 中进行选择。 这里我们可以看一下YAPI和RAP2对比 通过表中的内容对比很明显YAPI更符合我们的需求。因此在Mock服务端设计过程中我们选择基于YAPI进行二次开发。 5、Mock服务客户端调用设计 说完Mock服务端接下来我们看看调用Mock服务客户端时都需要考虑什么 5.1、Mock服务如何支持基于二进制流的接口调用 因为历史原因有些服务间调用使用 Spring Cloud Feign 而有些服务间调用使用基于二进制流序列化的 RPC当然是基于 TOP 协议。 我们知道如果服务间的通讯是基于二进制流而不是 JSON就没办法在 YAPI 上通过简单的界面定义输入输出参数了且 YAPI 也不支持二进制流的调用此时我们的解决方案如下图所示 在上面框架中我们添加了一个拦截器它会拦截所有服务间调用的请求并增加一个判断。如果访问的地址是 Mock 服务我们就使用 HTTP 协议并且通过 JSON 进行序列化和反序列这样问题就解决了。 这里我们需要补充一点曾经我还碰到过一些第三方接口使用 XML 格式很多银行的接口就是这样最终我们决定先不支持自定义XML格式的接口因为改造 YAPI 的工作量实在太大。 5.2、Mock服务客户端如何简单切换Mock与真实服务 这里我们需要考虑以下两种情况 对于第三方接口我们只需在配置中将第三方接口的 host 改为 Mock 服务的 host 即可。 对于微服务间的调用我们知道 Spring Cloud 中的微服务定义都是服务级别但是在实际开发的场景中我们需要使用接口级别的 Mock比如我们开发的 operationService它依赖 productService 的几个接口。因此在新项目中我们还需要在 productService 中新增几个接口且它们必须调用 Mock 服务的接口而原先的接口继续调用真实的 productService 中原来已经做好的接口。此时我们需要在配置中心增加 2 个配置项mock.apis 和 mock.host每次服务间调用时先判断调用的 URI 是否在 mock.apis 字符串列表中如果在则让它调用 mock.host 这台机器。特别说明一点关于这点曾经我们也出过错。因为在上线时配错了 mock.apis 和 mock.host导致线上环境使用了 Mock 服务的情况所以我们需要多考虑下面这点。 5.3、如何预防线上环境使用Mock服务 对于此问题我们做了一个检查代码在服务启动时先判断当前的环境名称如果是 prod线上环境先判断 mock.apis 中是否有值有值的话提示异常。然后扫描所有的 properties 配置如果配置中包含 Mock 服务地址则说明有些地方配置了 Mock 服务的调用也提示异常。 到这里整体的 Mock 调用方案就完成了。 以上就是关于Mock服务端与客户端的设计与实现思路有更好的方案或思路 可以联系我哦 微信公众号服务端技术精选 淘宝小店淘宝小店 个人小网站小网站 本文由 mdnice 多平台发布