淺談Spring Boot: 接口壓測及簡要優(yōu)化策略
工程做好之后,需要對接口進(jìn)行壓力測試??梢宰约壕帉懢€程池模擬多用戶訪問測試,也可以使用jmeter進(jìn)行壓測。jmeter的好處是測試方便,并且有完善的結(jié)果分析功能。本次采用jmeter進(jìn)行壓力測試。
1.準(zhǔn)備數(shù)據(jù),為了測試準(zhǔn)備200w條以上的數(shù)據(jù)。一個簡單的方法是使用下面的sql快速創(chuàng)建。
INSERT INTO table (user_name,address)
SELECT user_name, address FROM table;
但這樣創(chuàng)建的數(shù)據(jù)不同記錄的重復(fù)部分太多,和實際業(yè)務(wù)不太相符。一般業(yè)務(wù)上,除了主鍵之外還會有某一個字段是唯一,比如手機(jī)號,用戶名等。本次將user_name設(shè)置為唯一,簡單采用UUID的方式生成。
@RequestMapping("/create") public Integer createData(Integer password) { if (password != 1024) { return 0; } ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 20, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(100000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); int max = 1000000; for (int i = 0; i < max; i++) { poolExecutor.execute(() -> { Date now = new Date(); User user = new User(); user.setStatus(0); user.setUserName(UUID.randomUUID().toString().replace("-", "")); user.setAddress(""); user.setCreateTime(now); user.setUpdateTime(now); userService.saveUser(user); }); } return 1; }
采用線程池技術(shù)來生成數(shù)據(jù)。部分參數(shù)參考自己的配置進(jìn)行設(shè)置。我這里采用核心線程數(shù)10,最大線程數(shù)20,阻塞隊列容量10w,拒絕策略CallerRunsPolicy的參數(shù)來生成。
數(shù)據(jù)生成以后,確認(rèn)下生成數(shù)量,可以看到所有的user_name都是不同的。
select count(*),count(distinct user_name) from user
2.改造接口。為了測試方便,使用公共mapper。引入依賴
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> </dependency>
修改啟動類MapperScan注解為import tk.mybatis.spring.annotation.MapperScan;
mapper接口繼承extends Mapper,(import tk.mybatis.mapper.common.Mapper;)。這樣就會為mapper生成insert,select等基本方法。
3.測試。
所測試的接口為
@RequestMapping(value = "/hello", method = {RequestMethod.POST}) public List<User> getUser(User user) { return userService.getUserByUser(user); }
打開jmeter,通過Option選擇中文語言。創(chuàng)建測試計劃,這次僅對接口進(jìn)行壓力測試。
測試參數(shù)選擇userName,并使用隨機(jī)生成的UUID,這樣可以保證最終訪問DB時不觸發(fā)任何緩存。
1.文件-新建測試計劃
2.編輯-添加-線程-線程組
3.選中線程組,編輯-添加-邏輯控制器-事務(wù)控制器
4.選中事務(wù)控制器,編輯-添加-取樣器-BeanShell 取樣器
5.選中事務(wù)控制器,編輯-添加-HTTP請求
6.選中BeanShell取樣器,將下面代碼復(fù)制到腳本框里面,內(nèi)容即為設(shè)置user_name變量為UUID。
import java.util.UUID; UUID uuid1 = UUID.randomUUID(); vars.put("user_name",(uuid1.toString()).toUpperCase().replaceAll("-",""));
7.選中HTTP請求,設(shè)置如下,其中參數(shù)部分內(nèi)容為:
名稱 | 值 |
---|---|
userName | ${user_Name} |
這樣就可以將步驟6生成的參數(shù)傳遞為HTTP POST請求的參數(shù)了。
添加結(jié)果樹,匯總報告等,最終結(jié)構(gòu):
8.選中線程組,設(shè)置線程數(shù)等信息,詳細(xì)請參照官網(wǎng):https://jmeter.apache.org/usermanual/index.html
這里先設(shè)置線程數(shù)為2000,由于要壓力測試,設(shè)置Ramp-up為1秒,即1秒內(nèi)啟動所有線程。
9.啟動線程組。在這里插入圖片描述
10.結(jié)果樹里面可以確認(rèn)具體每次請求的參數(shù):
匯總報告里面可以查看總體信息:
通過以上步驟,可以初步預(yù)估下系統(tǒng)各個接口的吞吐量等信息。第一次壓測中user_name自動沒有設(shè)置索引,可以通過一些方法來提高系統(tǒng)性能:
1.為user_name設(shè)置索引。
2.使用redis緩存,其一是緩存最近檢索數(shù)據(jù),其二是將表中所有user_name存入緩存(Set),請求到來時首先去緩存中查看是否存在,只有存在的時候才去檢索DB。
3.若數(shù)據(jù)量過大,可采用布隆過濾器存儲user_name。
4.限流,這里只說API層面的,guava包下RateLimiterJ;自寫切面+Redis;Spring Cloud GateWay。
工程地址:https://github.com/showsys20/spring-demo-cm.git
以上這篇淺談Spring Boot: 接口壓測及簡要優(yōu)化策略就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)
很多人在使用MyBatis的緩存后經(jīng)常會遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:2016-06-06使用MyBatis-Plus實現(xiàn)聯(lián)表查詢分頁的示例代碼
本文主要講述了如何在SpringBoot項目中使用MyBatis-Plus的分頁插件,通過這個示例,可以學(xué)會如何利用MyBatis-Plus進(jìn)行高效的分頁查詢,感興趣的可以了解一下2024-10-10SpringBoot接收與響應(yīng)xml報文請求的實現(xiàn)
我們在進(jìn)行接口對接時,會出現(xiàn)報文形式的信息傳遞,這篇文章主要給大家介紹了關(guān)于SpringBoot接收與響應(yīng)xml報文請求的相關(guān)資料,需要的朋友可以參考下2023-06-06淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化
下面小編就為大家?guī)硪黄獪\談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11修改idea的這些啟動參數(shù),令你的idea健步如飛
這篇文章主要介紹了修改idea的這些啟動參數(shù),令你的idea健步如飛~具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01