接口测试 02 -- JMeter入门到实战

前言

JM eter毕竟是做压测的工具,自动化这块还是有缺陷。
如果公司做一些简单的接口自动化,可以考虑使用JMeter快速完成,如果想做完善的接口自动化体系,建议还是基于Python来做。
为什么学习接口测试要先从JMeter开始?
工作中,并不是一开始我们就写代码来测接口
只有接口通了,才能开始做接口自动化
即便真的不需要做功能测试,但是做自动化之前,务必要先确保单接口已经调调试通了( JMeter、poastam)

1. JMeter简介及安装

1.1 JMeter的优点

● JMeter是基于Java的开源工具,扩展性强,可自定义开发插件;
● JMeter社区活跃,会定期更新、修改bug、优化功能;
● JMeter学习成本低,提供了方便的图形界面来编辑和开发测试脚本,上手快;
● JMeter可以和很多工具兼容,如Jenkins,方便测试自动化;
● JMeter具有平台无关性,可以轻易在Windows、Linux和macOS上运行。

 1.2 JMeter的安装

① 安装JDK

从官网下载JDK: https://www.oracle.com/cn/java/technologies/download
s/#java8-windows (需要注册)
嫌麻烦的话,可以从这里下:
https://pan.baidu.com/s/15PE5vikEHhma-2rEcjjSzA?pwd=zh57
这是一个其他人帅心善的博主提供的资源,这里借花献佛咯
以下是博主的JDK详细的安装教程:
[ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)_如何安装环境1.8-CSDN博客
或者我的这篇文章中也有介绍JDK安装: pytest -- 进阶使用详解-CSDN博客

② 安装JMeter(windows)

从官网下载JMeter的Binaries版本(可执行的版本),另外一个Source版本是源码,需要自己编译,需注意区别,别下载错了。
官网地址: https://jmeter.apache.org/download_jmeter.cgi

进入官网:点击下载

下载好之后解压文件 -> 运行/bin目录下的 jmeter.bat

即可打开JMeter的图形化界面进行脚本的编写。

建议放在c盘(不用配置环境变量),我尝试了放在D盘,配置环境变量怎么配都启动不了

启动后:会出现左边的cmd,使用过程中不要关闭cmd,关闭了cmd就相当于关闭了jmeter

③ jmeter界面设置

初次启动,界面上的字体小的感人,眼睛快戳瞎了……

界面调整:

中文模式:

但是关掉重启之后,又恢复了一开始那么小的字体、语言又显示成了英文

 找到JMeter的配置文件jmeter.properties,用记事本打开,修改字体设置,找到这两行代码:

前两行默认是注释掉的,把前面的#去掉,最后一行放开并修改后面的数字

jmeter.hidpi.mode=true   #放开
jmeter.hidpi.scale.factor=2.0   #放开
jmeter.hidpi.scale.factor=2.357948  #放开并修改后面的数组

waht?再重新打开还是这么小

然后重新点一下放大,就不需要点很多次,点一次就这么大了

凑合着用吧,目前没找到一次修改配置能够永久性设置的方法

修改语言为中文:配置文件jmeter.properties找到language=这行,改为:下面第一行这样

Preferred GUI language. Comment out to use the JVM default locale's language.
language=zh_CN

#Preferred GUI language. Comment out to use the JVM default locale's language.
#language=en  这是原本的

重新打开,文字显示为中文了

1.3JMeter常用的核心组件介绍

由于JMeter涉及的组件数目很多,据不完全统计至少有110个,而其实只需要掌握 20%的组件就可以完成80%甚至更多的日常工作了,所以接下来我们重点学习使用最频繁的核心组件,只需要优先掌握这10个左右的组件就能应付日常大部分的接口测试工作。
---------------->>>
注意:
(1)所有组件的添加都是通过鼠标右键单击上一层组件的方式选择的。
(2)比较好用的功能是使用鼠标右键单击做启用(enable)或禁用(disable)的切换,对于不想测试的请求可以禁用,而不用删除处理。

Jmeter常用组件的功能

① 测试计划:测试起点,所有组件的容器
② 线程组:代表一定数量的用户
③ 取样器:向服务器发送请求的最小单元
④ 逻辑控制器:结合取样器实现一些复杂的逻辑
⑤ 前置处理器:在请求之前的工作
⑥ 后置处理器:在请求之后的工作
⑦ 断言:判断请求是否成功
⑧ 定时器:负责请求之间的延迟间隔。常用的有固定,高斯,随机
⑨ 配置元件:配置信息
⑩ 监听器:收集结果
------------------->>>
执行顺序:
测试计划 -> 线程组 -> 配置元件 -> 前置处理器 -> 定时器 -> 取样器(请求)-> 后置处理器-> 断言 -> 监听器
作用域:
必须组件:测试计划、线程组、取样器
辅助组件:剩余的
辅助组件作用于父组件,同级组件以及同级组件下的所有子组件

前、后置处理,对应的页面按钮: 


2. 使用jemter接口测试实战

2.1 接口请求分析

目标网站接口信息

以下根据目标网站的注册接口为例:进行接口分析 -> 接口测试

 ● 目标网站域名:http://xxx.com?

 ● 目标网站公共参数

目标网站注册_请求urlapi/user/reg

目标网站注册_请求参数:

参数名
是否必须
类型
默认值
描述
accounts
string
用户名
pwd
string
密码
type
string
类型

公共参数是所有接口都必须带的参数,请求参数对应每个具体接口的参数


接口分析

接口请求四要素

在文档当中找:接口URL、请求方法、请求参数、响应数据

在工作当中:token字段一般是放在对应的请求头(header)

目标网站比较特殊,项目token在url当中(最后面)

目标网站解析:http://xxx.com?

  • s=api/user/login
  • application === app
  • application_client_type=== weixin

根据规则拼凑出一个完整的注册接口:

接口URL : 协议+域名+路径 + 公共参数(用&拼接)

http://xxx.com?s=api/user/reg&application=app&application_client_type=weixin

----------->>>

看到注册接口的请求方式是post,我们第一反应要清楚:

● post请求的请求参数是放在body中的

● body请求参数,与请求头的content-type是一一对应的

body请求数据类型:

那么问题来了:

body的请求数据类型(如上图)有那么多,我们怎么确定是哪一种呢?

● 有些接口文档会注明,它是什么请求类型:那么直接选择即可

● 如果接口文档没写:

        一般默认用form表单提交 (字段相对比较少):x-www-form-urlencoded
        提交需带有对应的图片: from-data
        字段非常多,或者它的数据是{xXXX: XXXX}:raw-json

所有的工具也都是这个规则

得到请求参数(目标网站的body格式josn)

type有手机号、邮箱、自定账号;这里我们使用自定义账号,即username

{accounts":"username",
"pwd":"password",
"type":"username" }

响应数据:

上面我们已经清楚了注册接口的请求url、请求方法、请求参数及body数据类型,根据请求信息,我们就能得到一个请求结果了。

那么根据这个请求,我们期望得到的结果是什么呢?

期望结果:

1. 输入正确的数据:注册成功
2. 输入已经存在的数据:账号已存在测试用例设计

……

这就类似于测试用例设计

请求参数不同数据的组合,得到的对应的结果

考虑正向场景、异常场景,和功能测试的设计思路一致

注册接口测试用例示例 


2.2 单个执行接口测试用例

jmeter执行接口测试用例,详细步骤如下:

① 添加线程组

jmeter属于半自动工具,需要有人的介入,一定数量的用户表示一个【线程组】

右击【测试计划】--> 添加 --> 添加线程组:

② 添加取样器

我们需要做什么?发送一个接口请求:【取样器】

在JMeter中,虽然在取样器的类型中只有HTTP,但是它可以发送HTTPS请求。

要发送HTTPS请求,只需在HTTP请求中指定协议为HTTPS,即在服务器名称或IP地址前加上"https://"前缀。在HTTP请求中,可以使用如下格式的URL来发送HTTPS请求:https://www.example.com 或 https://192.168.0.1。

右键【线程组】右击 --> 添加 --> 选择HTTP请求(我们这里是接口请求属于http) 

 ③ 填写请求信息

上面我们得到的注册接口完整的url是:

http://xxx.com?s=api/user/reg&application=app&application_client_type=weixin

路径从?开始,截图中漏了

④ 添加监听器

添加监听器,是为了方便执行后查看结果

右键接口名 --> 添加 --> 监听器 --> 查看结果树

⑤ 执行接口测试: 

上面截图字打错了,是保存;根据个人需要,也可以不保存 

点击保存后,等1~2秒即出来执行结果:

响应中显示的响应结果,对应这个接口请求的实际结果

测试用例的结果,是我们的期望结果

当然实际工作中,我们不可能一个个点进去,肉眼去确认接口返回的实际结果

那么:我们可以通过添加断言,来看接口的返回是否和我们的期望结果一致

⑤ 添加断言

比如,我就想断言这个注册接口返回的响应josn信息中,msg是否为注册成功

需要对哪个接口进行断言,就右键对应的接口 --> 添加 --> 断言 --> 选择JSON断言

JSON断言中,默认使用的是JOSN path,这个json path填写有一定的规则 

可以先取查看结果树种测试一下,写的对不对,具体见下图备注:

填写断言信息:

重新执行一遍:

查看断言信息、断言失败(只有失败了下面才会显示断言,成功的话不会显示短信信息)

2.3 多个接口执行测试用例

基于上面的注册接口之后,再新建一个登陆接口(即再加一个取样器)

登陆接口请求url:api/user/login

登陆请求参数:与注册一致

jmeter配置原件 

大家可能已经发现了一个问题,就是每增加一个接口,都需要再填一遍HTP请求信息,是不是很麻烦?如果哪天请求的域名变了,那么是不是几十个、几百个接口都得改一遍?那么有没有简单的方法呢?

----------------->>>>

是的,有更简单的方法,就是使用【配置原件】这个功能:

我们的接口是HTTP,那么就选择 HTTP请求默认值 

把域名和协议类型,填在默认请求页面里

下面的注册 和 登陆接口页面中的 域名和协议类型就可以删掉了

重新运行一下:

设置环境变量

根据上面的配置原件使用思路,同理可得:

特别适用于环境切换的修改,比如有测试环境、生产环境,有100个接口

我不需要再两个环境中都去各写100遍接口,只需要加一个【请求默认值】,根据不同环境的域名填写即可

执行哪个环境,就把另一个环境给禁用掉;

比如现在我要在测试环境,把就把生产环境的禁用

禁用后,它的字体颜色就变浅了

设置变量

即用户定义的变量

比如我基于上面测试用例中一个用户名、密码注册好之后,我还需要再次注册账号,那么每换一个不同的账号注册,注册和登陆HTTP请求信息的页面中,都需要取改对应的用户名、密码,是不是也很麻烦?

------->>>

so,偷懒的办法:就是添加一个【用户定义的变量】

定义变量:

在【用户定义的变量】 中定义账号、密码

引用变量:

重新运行一下:可以看到,注册和登陆都成功了

所以:

定义变量,适合请求参数中的某些字段值是经常要变的,就不要固定写死,把它提取出来,放在用户变量里,运行的时候动态来取值引用;

改的时候也只有改一处,其他地方不用动,非常方便


2.4 Jmeter数据驱动测试

数据驱动测试,也叫DDT

--------------->>>>>

例如:上面的excel截图中,一个登陆接口,我们有多种场景需要测试

共同点是:请求URL相同

不同点是:请求参数不同

那么我们能不能把接口数据提取出来?当然可以

再新建一个线程组,可以使用复制黏贴的方式:

选中登陆&注册--ctrl+c  --> 点击测试测试计划  ctrl+v即可

然后把登陆&注册这个case禁用掉:点击登陆&注册 右键 --> 禁用即可

准备数据:

在桌面新建一个文件夹:

这里使用Notepad++这个软件(它不会带任何格式),编写登陆接口的不同测试场景

注意:使用英文逗号,不用加双引号把字符串引起来,jmeter也可以处理

添加配置元件 --> csv

配置csv文件信息

添加循环控制器

因为是一个接口对应4条用例,需要让它循环来执行:

数据驱动tab右键 --> 添加 --> 逻辑控制器  --> 选择‘循环控制器’

注意层级关系:需要让jmeter循环读数据,然后循环进行登录,

所以把数据文件配置、 登陆接口拖到循环控制器的下面

并且在循环控制器中,修改循环次数(根据自己的用例条数,是几条写几)

修改断言

执行测试用例

上面的逐步都配置好了之后,就可以运行用例了

下面三条用例为什么失败了呢?

是因为断言里的预期结果的文案与接口文档中的不一致,需要一致才行

重新修改一下文件中的期望结果文案、重新执行一下,然后全部成功

结果查看--优化

因为上面我们的场景是一个接口对应多条测试用例,当我们运行完之后,没法第一眼就知道哪条结果对应那条用例,所以我们可以在接口名称后面也加一个变量引用:

重新运行一下:查看结果时,清晰明了


2.5 Jmeter接口关联测试

接口关联,可以理解为接口的上下游操作之间的依赖

例如:一个电商平台

1、需要先登陆

2、通过登陆之后选购商品加入到购物车

3、……

=====================================================================

在接口测试中,需要解决的是哪个登录用户的问题,也就是说加入购物车的时候,怎么知道是哪个用户。

鉴别用户身份,通用的方法就是Token(软件中临时身份证号,代表某个具体的账号)

token怎么来的?一般在登陆之后,会在响应数据、或者请求头中

看看上面运行登录接口的接口, token在响应数据的body中

1、需要先登陆:得到token:226795e8cbc5ff159f6befb645b1ee01

2、通过登陆之后选购商品加入到购物车:请求数据需要加上token

3、……

一般token放在head里,但是也有特殊的,是需要直接放在请求url的最后,比如现在这个目标网站就是需要放在url里

=====================================================================

总结来说:

上一个接口的响应数据(token值),作为下一个接口的请求数据(token = token值)

添加后置处理器

前面有了解过,后置处理器,就是处理在请求之后的工作

配置josn提取器

添加下游接口

添加配置信息头管理器

在 JMeter 中,HTTP信息头管理器用于管理 HTTP 请求中的请求头信息。

HTTP 请求头包含了一些关于请求的元数据,例如用户代理、内容类型、授权信息等。

通过使用 HTTP信息头管理器,可以方便地管理这些请求头信息,以便在测试计划中的多个 HTTP请求中重复使用。

具体来说,HTTP信息头管理器可以用于以下几个方面:

  1. 添加通用的请求头信息:可以在 HTTP信息头管理器中添加常用的请求头信息,例如 User-Agent、Accept、Content-Type 等,以便在测试计划中的多个 HTTP请求中重复使用这些信息。

  2. 管理授权信息:可以在 HTTP信息头管理器中添加授权信息,例如 Basic 认证的 Authorization 头部,以便在多个请求中使用相同的授权信息。

  3. 管理自定义的请求头信息:可以在 HTTP信息头管理器中添加自定义的请求头信息,以满足特定的测试需求。

这里,我们添加HTTP信息头管理器的目的:是因为josn格式的body请求信息,需要与请求头当中的 Content-Type一一对应

设置content-type的格式为:application/ison(请求参数格式为josn)

运行接口用例:

接口关联--总结:

1. 上一个接口的响应数据,作为下一个接口的请求数据(比如token)

2. 如果请求参数的数据格式是json,务必要添加配置信息头管理器,设置json格式


2.6 JDBC驱动及数据断言

JMeter中如果要用SQL语句查询数据库,就需要用到JDBC请求和JDBC Connection Configuration了。

也可以作为数据驱动测试的另外一种方式

------------->>>

在测试过程中,对于数据库的操作场景一般有
● 测试数据的制造
● 查询数据用于测试的输入
● 测试完成之后查询数据用于检测结果
● 业务SQL的性能测试

数据库连接JDBC驱动下载

打开MySQL JDBC的下载网站:
https://downloads.mysql.com/archives/cj/,并选择操作系统: Platform Independent。

点击 DOWNLOADS,把页面滚动到最下面,点击 MySQL Community (GPL) Downloads

点击 Connector/J ----进入后选择Platform Independent ---选择zip格式(windows系统选zip)

注意下载驱动的版本要与mysql的版本相匹配,如果驱动版本比msql版本高,可能用不了

点击下载:

下载后,将mysql-connector-java-5.1.48-bin.jar这个文件放到jmeter的bin目录下

Jmeter中关联jar包

点击测试计划 --> 浏览 --> 选中jar包 --> 点击open

必须引用jar包,不然执行会报错

配置连接数据库的配置信息

选择要添加的线程组 --> 添加 --> 配置元件 --> 选择JDBC Connection Configuration

添加JDBC请求配置

JDBC Connection Configuration页面:相当于mysql的链接信息配置 

拉到最下面,把数据库连接的4项信息填上 

Database URL:dbc:mysql://xx域名:3306/数据库地址  (3306是端口号)

添加配置JDBC Request

注意层级关系,把它拖到循环控制器的下面

引用JDBC Connection Configuration中的数据库名字

正常写sql就行 

上面的【HTTP请求默认值】不变(协议、域名),还是使用上面的测试网址信息

【用户定义的变量】,变量信息指明,账号与密码为前面已注册成功的

添加一个【HTTP请求】 ,请求名称使用上面的SQL查询结果变量

【用户定义的变量】中指定了账号与密码的变量,所以使得【JDBC Request】中的查询结果就是查询变量中的账号/密码:

登陆接口基于【JDBC Request】的查询结果,拿到的账号密码执行登录,所以执行成功

这就是为什么登录接口的名称中要引用查询的变量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言数据结构——顺序表

(图片由AI生成) 0.前言 在程序设计的世界里,数据结构是非常重要的基础概念。本文将专注于C语言中的一种基本数据结构——顺序表。我们将从数据结构的基本概念讲起,逐步深入到顺序表的内部结构、分类,最后通过一个实…

Unity常用的优化技巧集锦

Unity性能优化是面试的时候经常被问道的一些内容,今天给大家分享一些常用的Unity的优化技巧和思路,方便大家遇到问题时候参考与学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游…

电脑pdf如何转换成word格式?用它实现pdf文件一键转换

pdf转word格式可以用于提取和重用pdf文档中的内容,有时候,我们可能需要引用或引用pdf文档中的一些段落、表格或数据,通过将pdf转换为可编辑的Word文档,可以轻松地复制和粘贴所需内容,节省我们的时间,那么如…

【守护工地安全】YOLOv8实现安全帽检测

学习《OpenCV应用开发:入门、进阶与工程化实践》一书 做真正的OpenCV开发者,从入门到入职,一步到位! 数据集 该图像数据集包含8000张图像,两个类别分别是安全帽与人、以其中200多张图像为验证集,其余为训…

谁说知识库都是英文的 今天就来一个中文版的

1.安装 1.1创建目录 mkdir -p /opt/trilium-cn cd /opt/trilium-cn 1.2.编写docker-compose.yml文件 version: 3 services:trilium-cn:image: nriver/trilium-cnrestart: alwaysports:- "10012:8080"volumes:# 把同文件夹下的 trilium-data 目录映射到容器内- /opt…

基于JavaWeb+SSM+Vue基于微信小程序生鲜云订单零售系统的设计和实现

基于JavaWebSSMVue基于微信小程序生鲜云订单零售系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计…

6.4.4释放音频

6.4.4释放音频 许多Flash动画里的音乐或歌曲非常好听,能不能在没有源文件的情况下把里面的声音文件取出来呢?利用Swf2VideoConverter2可以轻松做到这一点。 1.单击“添加”按钮,在弹出的下拉菜单中选择“添加文件”,…

java小项目:简单的收入明细记事本,超级简单(不涉及数据库,通过字符串来记录)

一、效果 二、代码 2.1 Acount类 package com.demo1;public class Acount {public static void main(String[] args) {String details "收支\t账户金额\t收支金额\t说 明\n"; //通过字符串来记录收入明细int balance 10000;boolean loopFlag true;//控制循…

iOS中的视频播放

引言 在数字时代,视频已成为我们日常沟通和娱乐不可或缺的一部分。从简短的社交媒体剪辑到全长电影,我们对流畅、高质量视频播放的需求从未如此强烈。对于开发者来说,为iOS用户提供无瑕疵的视频体验是一项挑战,也是一种艺术。本篇…

数据结构之list类

前言 list是列表类。从list 类开始,我们就要接触独属于 Python 的数据类型了。Python 简单、易用,很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。 话不多说,让我们开始学习第一个 Python 数据类型一list。 1. list的赋值 输…

手把手教你使用 VS Code 运行和调试 Python 程序

本文以 Ubuntu 系统为例,介绍如何在 VS Code 上配置 Python 的编程环境,并把 Python 程序运行、调试起来。由于 Python 是解释型语言,并且 VS Code 中提供了内置的调试器可用于调试 Python 代码,因此配置和操作流程比调试 C/C 代码…

SpringSecurity+JWT前后端分离架构登录认证

目录 1. 数据库设计 2. 代码设计 登录认证过滤器 认证成功处理器AuthenticationSuccessHandler 认证失败处理器AuthenticationFailureHandler AuthenticationEntryPoint配置 AccessDeniedHandler配置 UserDetailsService配置 Token校验过滤器 登录认证过滤器接口配置…

C++将信息输入到文件内

第一步检查文件是否打开&#xff0c;用到头文件&#xff1a; #include <fstream> #include <sstream> 文件打开的函数为 file.isopen() 信息输入到文件应该为 file << "" << value; 注意是file<< 如图 定义file ofstream f…

计算机组成原理 第一弹

ps&#xff1a;本文章的图片来源都是来自于湖科大教书匠高老师的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1-2 计算机的发展_哔哩哔哩_bilibili ​​ 目录 &#x1f680;计算机系统 &#x1f680;计…

UI测试脚本录制器已上线,RunnerGo :UI自动化测试平台

想快速配置可视化UI自动化测试脚本&#xff1f;RunnerGo近期上线脚本录制器&#xff0c;根据你的测试操作直接生成UI自动化测试脚本&#xff0c;下面是使用方法 Step1:下载录制器 点击RunnerGo上方插件按钮下载录制器 Step2:录制器使用 将插件文件拖入浏览器扩展程序 点击打…

Zabbix 系统监控详解

1 介绍 1.1 摘要 本文深入浅出&#xff0c;切近实际运维应用&#xff0c;由 zabbix 3.4 版本入手&#xff0c;学习 zabbix 监控告警实现方式&#xff0c;由 zabbix 5.0 浅出实现快速部署、快速应用。本人从业多年&#xff0c;关注 zabbix 开源社区&#xff0c;以及 zabbix 官…

【计算机网络】3、IPv6、网络三层模型、网络的规划与设计、网络的规划与设计、网络存储技术、网络地址翻译NAT、默认网关、虚拟局域网VLAN、虚拟专用网VPN、URL

文章目录 IPv6IPv6的特点IPv4和IPv6的过渡期间主要采用三种基本技术双协议栈隧道技术翻译技术 网络三层模型核心层汇聚层接入层 网络的规划与设计工作区子系统水平布线子系统管理子系统垂直干线子系统设备间子系统建筑群子系统总结 廉价磁盘网络存储技术直接附加存储(DAS)网络附…

Git学习笔记(第1章):Git概述

目录 1.1 版本控制 1.1.1 何为版本控制 1.1.2 为什么需要版本控制 1.1.3 版本控制工具 1.2 发展历史 1.3 工作机制 1.4 代码托管中心&#xff08;远程库&#xff09; Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。…

LeetCode19:删除链表的倒数第N个结点

力扣题目链接 思路&#xff1a;由于本题有可能删除头结点&#xff0c;为保证删除头结点和其他结点的操作一致&#xff0c;因此首先创建一个虚拟头结点dummy。 其次&#xff0c;本题需要删除倒数第N个结点&#xff0c;由于单链表只有next指针&#xff0c;因此需要找到倒数第N1…

事件驱动架构

请求驱动 服务注册&#xff0c;服务发现&#xff0c;虽然调用地址隐藏了&#xff0c;但是调用stub必须相同。 rpc通信&#xff0c;远程调用。 生产者和消费者要有相同的stub存根。 消费者和生产者的调用接口是耦合的。 事件驱动 核心&#xff1a;上下游不进行通信 中间通过M…