欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略

 更新時(shí)間:2020年09月26日 10:16:21   作者:showme1111  
這篇文章主要介紹了淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

工程做好之后,需要對(duì)接口進(jìn)行壓力測(cè)試??梢宰约壕帉?xiě)線程池模擬多用戶(hù)訪問(wèn)測(cè)試,也可以使用jmeter進(jìn)行壓測(cè)。jmeter的好處是測(cè)試方便,并且有完善的結(jié)果分析功能。本次采用jmeter進(jìn)行壓力測(cè)試。

1.準(zhǔn)備數(shù)據(jù),為了測(cè)試準(zhǔn)備200w條以上的數(shù)據(jù)。一個(gè)簡(jiǎn)單的方法是使用下面的sql快速創(chuàng)建。

INSERT INTO table (user_name,address)

SELECT user_name, address FROM table;

但這樣創(chuàng)建的數(shù)據(jù)不同記錄的重復(fù)部分太多,和實(shí)際業(yè)務(wù)不太相符。一般業(yè)務(wù)上,除了主鍵之外還會(huì)有某一個(gè)字段是唯一,比如手機(jī)號(hào),用戶(hù)名等。本次將user_name設(shè)置為唯一,簡(jiǎn)單采用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ù)來(lái)生成數(shù)據(jù)。部分參數(shù)參考自己的配置進(jìn)行設(shè)置。我這里采用核心線程數(shù)10,最大線程數(shù)20,阻塞隊(duì)列容量10w,拒絕策略CallerRunsPolicy的參數(shù)來(lái)生成。

數(shù)據(jù)生成以后,確認(rèn)下生成數(shù)量,可以看到所有的user_name都是不同的。

select count(*),count(distinct user_name) from user

2.改造接口。為了測(cè)試方便,使用公共mapper。引入依賴(lài)

<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>

修改啟動(dòng)類(lèi)MapperScan注解為import tk.mybatis.spring.annotation.MapperScan;

mapper接口繼承extends Mapper,(import tk.mybatis.mapper.common.Mapper;)。這樣就會(huì)為mapper生成insert,select等基本方法。

3.測(cè)試。

所測(cè)試的接口為

@RequestMapping(value = "/hello", method = {RequestMethod.POST})
public List<User> getUser(User user) {
return userService.getUserByUser(user);
}

打開(kāi)jmeter,通過(guò)Option選擇中文語(yǔ)言。創(chuàng)建測(cè)試計(jì)劃,這次僅對(duì)接口進(jìn)行壓力測(cè)試。

測(cè)試參數(shù)選擇userName,并使用隨機(jī)生成的UUID,這樣可以保證最終訪問(wèn)DB時(shí)不觸發(fā)任何緩存。

1.文件-新建測(cè)試計(jì)劃

2.編輯-添加-線程-線程組

3.選中線程組,編輯-添加-邏輯控制器-事務(wù)控制器

4.選中事務(wù)控制器,編輯-添加-取樣器-BeanShell 取樣器

5.選中事務(wù)控制器,編輯-添加-HTTP請(qǐng)求

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請(qǐng)求,設(shè)置如下,其中參數(shù)部分內(nèi)容為:

名稱(chēng)
userName ${user_Name}

這樣就可以將步驟6生成的參數(shù)傳遞為HTTP POST請(qǐng)求的參數(shù)了。

添加結(jié)果樹(shù),匯總報(bào)告等,最終結(jié)構(gòu):

8.選中線程組,設(shè)置線程數(shù)等信息,詳細(xì)請(qǐng)參照官網(wǎng):https://jmeter.apache.org/usermanual/index.html

這里先設(shè)置線程數(shù)為2000,由于要壓力測(cè)試,設(shè)置Ramp-up為1秒,即1秒內(nèi)啟動(dòng)所有線程。

9.啟動(dòng)線程組。在這里插入圖片描述

10.結(jié)果樹(shù)里面可以確認(rèn)具體每次請(qǐng)求的參數(shù):

匯總報(bào)告里面可以查看總體信息:

通過(guò)以上步驟,可以初步預(yù)估下系統(tǒng)各個(gè)接口的吞吐量等信息。第一次壓測(cè)中user_name自動(dòng)沒(méi)有設(shè)置索引,可以通過(guò)一些方法來(lái)提高系統(tǒng)性能:

1.為user_name設(shè)置索引。

2.使用redis緩存,其一是緩存最近檢索數(shù)據(jù),其二是將表中所有user_name存入緩存(Set),請(qǐng)求到來(lái)時(shí)首先去緩存中查看是否存在,只有存在的時(shí)候才去檢索DB。

3.若數(shù)據(jù)量過(guò)大,可采用布隆過(guò)濾器存儲(chǔ)user_name。

4.限流,這里只說(shuō)API層面的,guava包下RateLimiterJ;自寫(xiě)切面+Redis;Spring Cloud GateWay。

工程地址:https://github.com/showsys20/spring-demo-cm.git

以上這篇淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java由JABXContext注解讀取xml配置文件方式

    java由JABXContext注解讀取xml配置文件方式

    這篇文章主要介紹了java由JABXContext注解讀取xml配置文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java?map為什么不能遍歷的同時(shí)進(jìn)行增刪操作

    Java?map為什么不能遍歷的同時(shí)進(jìn)行增刪操作

    這篇文章主要介紹了Java?map為什么不能遍歷的同時(shí)進(jìn)行增刪操作,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    很多人在使用MyBatis的緩存后經(jīng)常會(huì)遇到MySQL分頁(yè)查詢(xún)的顯示問(wèn)題,針對(duì)于此,這里我們就來(lái)詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來(lái)回顧一下MyBatis的緩存機(jī)制與執(zhí)行:
    2016-06-06
  • 使用MyBatis-Plus實(shí)現(xiàn)聯(lián)表查詢(xún)分頁(yè)的示例代碼

    使用MyBatis-Plus實(shí)現(xiàn)聯(lián)表查詢(xún)分頁(yè)的示例代碼

    本文主要講述了如何在SpringBoot項(xiàng)目中使用MyBatis-Plus的分頁(yè)插件,通過(guò)這個(gè)示例,可以學(xué)會(huì)如何利用MyBatis-Plus進(jìn)行高效的分頁(yè)查詢(xún),感興趣的可以了解一下
    2024-10-10
  • SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的實(shí)現(xiàn)

    SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的實(shí)現(xiàn)

    我們?cè)谶M(jìn)行接口對(duì)接時(shí),會(huì)出現(xiàn)報(bào)文形式的信息傳遞,這篇文章主要給大家介紹了關(guān)于SpringBoot接收與響應(yīng)xml報(bào)文請(qǐng)求的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Springboot項(xiàng)目如何獲取所有的接口

    Springboot項(xiàng)目如何獲取所有的接口

    這篇文章主要介紹了Springboot項(xiàng)目如何獲取所有的接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化

    淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化

    下面小編就為大家?guī)?lái)一篇淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 詳解Servlet之過(guò)濾器(Filter)

    詳解Servlet之過(guò)濾器(Filter)

    本篇文章主要介紹了Servlet——過(guò)濾器(Filter),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 修改idea的這些啟動(dòng)參數(shù),令你的idea健步如飛

    修改idea的這些啟動(dòng)參數(shù),令你的idea健步如飛

    這篇文章主要介紹了修改idea的這些啟動(dòng)參數(shù),令你的idea健步如飛~具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • SpringBoot集成使用Redis及搭建過(guò)程

    SpringBoot集成使用Redis及搭建過(guò)程

    jackson-json 工具提供了 javabean 與 json 之 間的轉(zhuǎn)換能力,可以將 pojo 實(shí)例序列化成 json 格式存儲(chǔ)在 redis 中,也可以將 json 格式的數(shù)據(jù)轉(zhuǎn)換成 pojo 實(shí)例,本文給大家介紹SpringBoot集成使用Redis及搭建過(guò)程,感興趣的朋友一起看看吧
    2022-01-01

最新評(píng)論