jmeter 接口性能测试 学习笔记
目录
- 说明
- 工具准备
- 工具配置
- jmeter 界面汉化配置
- 汉化步骤
- 汉化结果图
- 案例1:测试接口
- 接口准备
- 线程组
- 添加线程组
- 配置线程组值
- 线程数(Number of Threads)
- Ramp-Up 时间(Ramp-Up Period)
- 循环次数(Loop Count)
- 永远循环(Forever)
- 延迟(Delay)
- http请求
- 添加http请求
- 配置HTTP请求值
- 协议 (Protocol)
- 服务器名称或 IP(Server Name or IP)
- 端口号(Port)
- 请求
- 路径(Path)
- 察看结果树
- 添加察看结果树
- 察看结果树内容
- 聚合报告
- 添加聚合报告
- 聚合报告说明
- 文件名
- Label
- 样本 Samples
- 平均值 Average
- 中位数 Median
- 90%百分位 90% Line
- 最小值 Min
- 最大值 Max
- 异常 Error %
- 吞吐量 Throughput
- 传输数据量 KB per Second
- 建立连接时间 Connect Time
- 响应时间 Response Time
- 平均吞吐量 Avg. Throughput
- 总计 Total
- 请求计数 Request Counts and Percentages
- 案例2:导出报告
- 导出html 报告
- 案例3: 计算理论的并发用户数
- 前提
- 结果分析
- 关键指标分析
- 并发用户数估算公式
- 案例4: 携带cookie请求
- 说明
- 接口准备
- 配置测试计划
- 线程组
- http请求
- 添加结果监听器
- 添加步骤
- 添加指定的监听器
- 执行登录http请求
- 添加正则表达式提取器
- 说明
- 介绍
- 添加步骤
- 正则表达式提取器配置说明
- 添加HTTP Cookie管理器
- 添加HTTP Cookie管理器步骤
- 配置HTTP Cookie管理器
- 添加调试取样器
- 添加步骤
- 运行线程组
- 登录结果
- list数据查询结果
- 调试取样器结果
说明
工具准备
- apache-jmeter-5.4.1
- jdk8 +
工具配置
jmeter 界面汉化配置
汉化步骤
jmeter 界面默认是英文,配置成中文。
- 打开 /bin/jmeter.porperties 文件,
- 将 默认的 language=en 改为 language=zh_CN 后,重启jmeter。
汉化结果图
案例1:测试接口
接口准备
spring mvc 项目创建一个接口,来模拟测试的目标接口。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Objects;@RestController
@RequestMapping(value = "test")
public class TestController {@GetMapping(value = "test")public Object test() {return new HashMap<String,Object>() {{put("message", "成功");}};}
}
线程组
添加线程组
配置线程组值
线程数(Number of Threads)
- 定义
这个值指定了要创建的虚拟用户(线程)的数量。每个线程都代表一个独立的用户,因此线程数越多,模拟的并发用户数也就越多。 - 使用场景
如果你想模拟 1000 个并发用户,就设置线程数为 1000。
Ramp-Up 时间(Ramp-Up Period)
- 定义
Ramp-Up 时间是指所有线程(虚拟用户)启动所需的时间,单位是秒。
例如,如果设置了 100 个线程,Ramp-Up 时间为 100 秒,那么每秒会启动一个线程,直到所有线程都被启动。Ramp-Up 时间设置得较长可以避免瞬间发起大量请求,从而导致服务器负载过高。 - 使用场景
如果你希望所有用户在 100 秒内启动,那么 Ramp-Up 时间应设置为 100 秒。
通过这种方式,你可以模拟逐步增加负载的场景。
循环次数(Loop Count)
- 定义
循环次数指定每个线程将执行的次数。如果设置为 1,则每个线程只执行一次。如果设置为 -1,则表示无限循环,直到测试结束时停止。 - 使用场景
如果你希望每个用户执行 10 次请求,可以将 Loop Count 设置为 10;如果希望每个用户一直执行,直到测试结束,则设置为 -1。
永远循环(Forever)
- 定义
这是一个复选框,当勾选时,线程将会不停地循环执行测试计划中的请求,直到测试手动停止。 - 使用场景
如果你正在进行压力测试,并且希望线程永远执行直到你手动停止,可以勾选此选项。
延迟(Delay)
- 定义
该选项可以为每个线程设置一个固定的启动延迟时间。这意味着每个线程启动时,会等待指定的时间,然后再开始执行请求。 - 使用场景
这种配置适合于模拟用户之间有间隔的启动情况。
http请求
添加http请求
配置HTTP请求值
协议 (Protocol)
- 定义
指定协议类型,可以选择 http 或 https。 - 使用场景
如果你测试的是 HTTPS 服务,选择 https
服务器名称或 IP(Server Name or IP)
- 定义
指定请求目标服务器的地址,可以是域名(如 www.example.com)或 IP 地址(如 192.168.1.1)。 - 使用场景
如果目标服务器是 www.example.com,就填写 www.example.com。如果是通过 IP 地址访问,则填写 IP。
端口号(Port)
- 定义
指定服务器的端口号,默认情况下 HTTP 使用端口 80,HTTPS 使用端口 443。如果服务器使用其他端口,可以在此处指定。 - 使用场景
如果你的服务器监听在 8080 端口,则需要设置 8080。
请求
- 定义
选择 HTTP 请求方法,常见的方法包括:
GET:获取资源。
POST:提交数据。
PUT:更新数据。
DELETE:删除资源。
HEAD:请求资源的头信息。
OPTIONS:请求可用的方法。
PATCH:部分更新资源。 - 使用场景
根据目标 API 或 Web 页面请求类型选择合适的 HTTP 方法。
路径(Path)
- 定义
指定访问的具体路径或资源。例如,/login、/api/getData 等。 - 使用场景
请求的具体接口路径,如 https://www.example.com/api/getData 中,/api/getData 为路径。
察看结果树
添加察看结果树
察看结果树内容
聚合报告
添加聚合报告
聚合报告说明
文件名
报告数据输出的文件。必须要先创建此文件,才能指定。报告结果写入此文件。用于导出报告。具体查看本文的导出html报告部分
Label
- 定义
测试请求的名称。通常是测试中每个 HTTP 请求的名称。 - 使用场景
每个请求(或事务)的标识符,可以通过它来查看特定请求的性能表现。
样本 Samples
- 定义
样本数量,表示此请求在整个测试过程中被执行的次数。 - 使用场景
查看某个请求执行的次数。例如,HTTP 请求可能执行了 100 次。
平均值 Average
- 定义
所有请求响应时间的平均值,单位是毫秒(ms)。 - 使用场景
表示请求的平均响应时间。较高的平均响应时间可能表示服务器存在性能瓶颈。
中位数 Median
- 定义
响应时间的中位数,单位是毫秒(ms)。 - 使用场景
中位数是将所有响应时间按升序排列后处于中间位置的值。中位数可以更好地反映出“典型”响应时间,避免了极端值的影响。
90%百分位 90% Line
- 定义
响应时间的第 90 百分位数,表示 90% 的请求响应时间低于该值。 - 使用场景
此值可以帮助分析大多数请求的响应时间,特别是对用户体验影响较大的长时间响应请求。
最小值 Min
- 定义
响应时间的最小值,单位是毫秒(ms)。 - 使用场景
表示最短的响应时间。可以帮助判断在测试过程中是否有异常的快速响应。
最大值 Max
- 定义
响应时间的最大值,单位是毫秒(ms)。 - 使用场景
表示最长的响应时间。非常高的最大响应时间可能表示系统在某些时刻出现了严重的性能瓶颈。
异常 Error %
- 定义
错误率,表示在所有请求中,失败请求所占的百分比。 - 使用场景
错误率高通常意味着系统存在故障或性能瓶颈,可能需要检查相关的错误日志来进一步定位问题。
吞吐量 Throughput
- 定义
吞吐量,表示每秒请求的数量(requests per second, RPS)。 - 使用场景
吞吐量是衡量系统在单位时间内处理请求的能力,较高的吞吐量通常意味着系统能够处理更多的用户请求。
传输数据量 KB per Second
- 定义
每秒传输的数据量,单位是千字节(KB/s)。 - 使用场景
表示在每秒钟内系统传输的数据量。较高的值通常表示系统处理大数据量的能力较强。
建立连接时间 Connect Time
- 定义
建立连接的时间,单位是毫秒(ms)。通常用于 HTTP 请求的连接阶段。 - 使用场景
较高的连接时间可能意味着网络延迟或服务器响应慢,特别是在多用户场景下,连接时间的优化尤为重要。
响应时间 Response Time
- 定义
响应时间,单位是毫秒(ms)。 - 使用场景
响应时间是指从发送请求到收到完整响应的时间,它是评估系统性能最直接的指标之一。通常越低越好。
平均吞吐量 Avg. Throughput
- 定义
平均吞吐量,表示所有请求的吞吐量的平均值。 - 使用场景
平均吞吐量可以帮助判断系统的处理能力。如果某一时刻吞吐量明显下降,可能存在性能瓶颈。
总计 Total
- 定义
总计行,表示所有请求的合计数。 - 使用场景
提供该测试计划所有请求的总的统计数据。
请求计数 Request Counts and Percentages
- 定义
聚合报告还会显示每个请求成功和失败的计数,以及它们在所有请求中的比例。 - 使用场景
可以帮助我们快速评估在负载测试中出现的错误情况和系统的稳定性。
案例2:导出报告
导出html 报告
- 在空文件夹中创建一个 report.txt 的文件。
- 在聚合报告的文件名中填写该文件的全路径。
- 执行测试。测试执行完成后, report.txt 文件中会有测试结果数据。
- 将report.txt 文件的后缀名称更换成csv, 即 report.csv
- 创建一个空的文件夹,存放生成的html。
- 打开导出配置界面
- 配置导出,点击 Generate report 按钮开始导出。
Results file: 选择步骤4中的report.csv文件
user.properties: 选择Jmeter 安装目录 bin 下的user.properties 文件。如下图
Output directory:选择步骤5中创建的空文件夹
- 查看导出结果
导出结束之后,在步骤5的文件夹中会生成报告html。用浏览器打开index.html 即可查看。如下图:
案例3: 计算理论的并发用户数
前提
按照案例1 步骤配置完成后,能正常执行完成得到聚合报告。
将报告导出html后,在html报告中可以查看到以下统计报告表。
例如统计报告表如下:
结果分析
注意:最大并发数需要结合其他信息如测试工具的配置、服务器资源利用率等来确定。以下分析只是基于html导出的统计报告表中的值推断的理论结果。
关键指标分析
- Samples (请求数): 100
- Error % (错误率): 0.00%
- Average (平均响应时间): 198.56 ms
- Min (最小响应时间): 98 ms
- Max (最大响应时间): 269 ms
- Transactions/s (每秒事务数): 362.32
并发用户数估算公式
并发用户数 = 平均响应时间(单位:毫秒) * 每秒事务数 (单位:次/秒)
上例的统计结果表中的理论并发用户估算值为: (198.56 * 1000) * 362.32 = 0.19856 * 362.32 约等于 72
案例4: 携带cookie请求
说明
在进行接口测试的时候需要先进行登录,对于传统的登录,登录成功后,后端使用session存储登录信息并将cookie信息返回给前端,前端请求接口的时候需要携带上cookie进行请求。为此,需要获取到登录成功返回的cookie信息存储在请求头中进行测试。
接口准备
package www.zhang.tomcat.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Objects;@RestController
@RequestMapping(value = "test")
public class TestController {/*** 模拟的登录接口*/@GetMapping(value = "login")public Object login(HttpServletRequest request) {// 登录成功后设计session 设置sessionrequest.getSession().setAttribute("user", "admin");return new HashMap<String,Object>() {{put("message", "成功");}};}/*** 模拟的查询接口*/@GetMapping(value = "list")public Object list(HttpServletRequest request) {// 获取sessionObject user = request.getSession().getAttribute("user");// 没有获取到对应登录信息if(Objects.isNull(user)){return new HashMap<String,Object>() {{put("message", "fail not user");}};}return new HashMap<String,Object>() {{put("message", "成功"+user.toString());}};}
}
配置测试计划
线程组
按照案例1 添加线程组的步骤添加线程组,此处省略
http请求
按照案例1 添加http请求的步骤添加线程组,添加2个http请求。
登录请求login :
查询请求 list:
添加结果监听器
添加步骤
添加指定的监听器
此处主要是为了查看、学习不同监听器的结果而已。按照下图添加以下结果监听器。
执行登录http请求
按实际填写完成http登录请求相关的配置后,启动1次登录测试,并保证此次登录测试要成功。
在察看结果树监听器中可以看到请求记录。点击请求记录,查看响应内容,即可看到登录成功后返回的cookie的信息。如下图
添加正则表达式提取器
说明
由于登录成功后会在响应头中返回cookie的信息,此时可以用提取器获取到响应头中的cookie的信息。
介绍
正则表达式提取器用于从服务器返回的响应数据中提取特定的信息。你可以使用它来提取匹配正则表达式的内容,并将提取到的数据保存为 JMeter 变量,供后续的请求使用。
添加步骤
正则表达式提取器配置说明
-
要检查的信息头
此处要在响应头中获取数据,选择信息头。 -
引用名称
自定义变量名称,获取到的值会赋值给这个变量。其他地前方使用此变量格式:${变量名称} -
正则表达式
根据填写的正则表达式规则来匹配到对应的值。
(.*) 通配符,表示所有。
例如:
根据登录成功后返回的响应头可得cookie中携带的sessionId的格式如下:
HTTP/1.1 200
Set-Cookie: JSESSIONID=DFB85D3D2C35B36792B052E881400A4B; Path=/; HttpOnly
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 20 Dec 2024 09:12:14 GMT
# JSESSIONID=sessionId;
JSESSIONID=(.*); Path=/
从cookie中获取到sessionId 后,只要携带此数据请求接口,后端会自动根据此sessionId 找到登录信息。
-
模板
模板用于指定在响应中提取内容的位置。通常,在正则表达式中使用捕获组,模板就是指定使用哪个捕获组的内容.
例如,此处只需要获取第一个捕获到的值。
模板格式:$序号$
例如:匹配第1个$1$
;匹配第2个$2$
-
匹配数字
用于指定你想要提取第几个匹配项:
0 表示提取所有匹配项。
1 表示提取第一个匹配项(默认值)。
…
-1 表示提取最后一个匹配项。
添加HTTP Cookie管理器
在数据查询接口 list中 添加HTTP Cookie管理器,用于把在登录接口中通过正则表达式提取到的登录sessionid数据获取,放到请求头中。
添加HTTP Cookie管理器步骤
配置HTTP Cookie管理器
根据响应头中的格式数据进行填写
添加调试取样器
调试取样器来获取变量值,用于查看正则表达式的变量是否能提取到值。
添加步骤
运行线程组
运行线程组查看结果
登录结果
list数据查询结果
请求头
响应结果
调试取样器结果
相关文章:

jmeter 接口性能测试 学习笔记
目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1:测试接口接口准备线程组添加线程组配置线程组值线程数(Number of Threads)Ramp-Up 时间(Ramp-Up Period)循环次数(Loop Count&…...
`HashMap`、`Hashtable` 和 `HashSet`的区别
HashMap、Hashtable 和 HashSet 都是 Java 中常用的集合类,它们的功能和实现有所不同,尽管它们都使用哈希表(hash table)作为底层数据结构。以下是它们之间的主要区别: 1. HashMap 和 Hashtable 的区别 特性HashMapH…...

Arduino中解析JSON数据
JSON JSON(JavaScript Object Notation,即JavaScript对象表示法)是一种广泛采用的开放标准文件格式与数据交换格式。它兼具人类可读性和机器易解析性,使得数据的编写、阅读、生成及解析都变得十分便捷。JSON的设计不依赖于特定编…...

linux----文件访问(c语言)
linux文件访问相关函数 打开文件函数 - open 函数原型:int open(const char *pathname, int flags, mode_t mode);参数说明: pathname:这是要打开的文件的路径名,可以是绝对路径或者相对路径。例如,"/home/user/…...
源码分析之Openlayers中MousePosition鼠标位置控件
概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件,该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效,可以实时获取鼠标位置,但是一般控件元素都会自定义。 源码分析 MousePosition…...

以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
myexcel的使用
参考: (1)api文档:https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md (2)源代码: https://github.com/liaochong/myexcel/issues 我: (1)m…...
Unity 上好用的插件
PlayerMaker BehaviorDesigner Cinemachine Timeline Hybrid Addressable AssetBundle Blower Simple Zoom 大地图上缩放和平移使用ScrollRect的好效果实现...

Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
目录 1. 简介 2. VIO 配置 2.1 VIO IP 2.2 VIO 对比 ILA 3. VIO 示例 3.1 Led 3.1.1 工程配置 3.1.2 效果展示 3.2 Key 3.2.1 工程配置 3.2.1 效果展示 3.3 门控触发 3.3.1 工程配置 3.3.2 效果展示 4. 远程调试 4.1 配置目标主机 4.2 配置本机 4.3 vmWare 网…...

双臂机器人
目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…...

【Lua热更新】上篇
Lua 热更新 - 上篇 下篇链接:【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…...
Ubuntu批量修改文件名
文章目录 批量重命名文件:Ubuntu下使用find命令结合sed和mv参考 批量重命名文件:Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中,有时我们需要批量重命名一批文件,比如将文件名中的某个特定字符串替换为另一个字符串。…...

食家巷大烤馍:岁月沉淀下的麦香传奇
在繁华都市的街角巷尾,隐藏着许多不为人知的美食宝藏,食家巷大烤馍便是其中之一。它宛如一位低调的美食大师,默默散发着独特的魅力,用最质朴的味道,征服着每一个过往食客的味蕾。 初见食家巷大烤馍,你会被…...

harmony UI组件学习(1)
Image 图片组件 string格式,通常用来加载网络图片,需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式,可以加载像素图,常用在图片编辑中 Image(pixelMapobject) Resource格式,加…...
BTP Integration Suite CPI Apache Camel
官网文档: https://help.sap.com/docs/integration-suite/sap-integration-suite/what-is-sap-integration-suite CPI 云集成(CPI)有以下几个特性: SAP Cloud Integration通过消息交换支持端到端流程集成。 它基于Apache软件基金会的开源框架Camel。 …...

vitepress-打包SyntaxError: Element is missing end tag.
一、vitepress打包编译报错Element is missing end tag. 背景: 新增了一些笔记准备上传到git仓库,持续集成部署的时候,控制台报错了,错误信息如下: SyntaxError: Element is missing end tag. 仔细看了下控制台几乎没啥…...

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例:重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…...

Java进程占用的内存有哪些部分?
大家好,我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时,会将内存划分为多个区域…...
【华为OD机试真题】【2024年E卷】数值同化-队列BFS(C++/Java/Python)
文章目录 分值:200题目描述思路复杂度分析AC 代码 分值:200 题目描述 存在一个 m * n 的 二维数组只,其成员取值范围为0, 1, 2。其中值为1的元素具备同化特性,每经过1S,将上下左右值为0的元素同化为1。而值为2的元素…...
“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”
想象一下,你有一个神奇的糖果盒,这个糖果盒里有两种糖果:红色的和蓝色的。你闭上眼睛,从盒子里拿出一个糖果,然后尝一尝,你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则࿰…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...