日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Spring Boot虛擬線程的性能還不如Webflux?

來源: 責(zé)編: 時間:2024-01-10 17:24:55 321觀看
導(dǎo)讀早上看到一篇關(guān)于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內(nèi)容較長,抓重點(diǎn)給大家介紹一下這篇文章的核心內(nèi)容,方便大家快速閱讀。測試場景作者采用了一個盡可能貼近現(xiàn)實操作的場景:從授權(quán)頭信息中提取JW

早上看到一篇關(guān)于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內(nèi)容較長,抓重點(diǎn)給大家介紹一下這篇文章的核心內(nèi)容,方便大家快速閱讀。7zB28資訊網(wǎng)——每日最新資訊28at.com

測試場景

作者采用了一個盡可能貼近現(xiàn)實操作的場景:7zB28資訊網(wǎng)——每日最新資訊28at.com

  1. 從授權(quán)頭信息中提取JWT
  2. 驗證JWT并從中提取用戶的Email
  3. 使用用戶的Email去MySQL里執(zhí)行查詢
  4. 返回用戶記錄

測試技術(shù)

這里要對比的兩個核心技術(shù)點(diǎn)是:7zB28資訊網(wǎng)——每日最新資訊28at.com

  1. 帶有虛擬線程的Spring Boot:這不是一個跑在傳統(tǒng)物理線程上的Spring Boot應(yīng)用,而是跑在虛擬線程上的。這些輕量級線程簡化了開發(fā)、維護(hù)和調(diào)試高吞吐量并發(fā)應(yīng)用程序的復(fù)雜任務(wù)。雖然虛擬線程仍然在底層操作系統(tǒng)線程上運(yùn)行,但它們帶來了顯著的效率改進(jìn)。當(dāng)虛擬線程遇到阻塞 I/O 操作時,Java 運(yùn)行時會暫時掛起它,從而釋放關(guān)聯(lián)的操作系統(tǒng)線程來為其他虛擬線程提供服務(wù)。這個優(yōu)雅的解決方案優(yōu)化了資源分配并增強(qiáng)了整體應(yīng)用程序響應(yīng)能力。
  2. Spring Boot Webflux:Spring Boot WebFlux是Spring生態(tài)系統(tǒng)中的反應(yīng)式編程框架,它利用Project Reactor庫來實現(xiàn)非阻塞、事件驅(qū)動的編程。所以,它特別適合需要高并發(fā)和低延遲的應(yīng)用程序。依靠反應(yīng)式方法,它允許開發(fā)人員有效地處理大量并發(fā)請求,同時仍然提供與各種數(shù)據(jù)源和通信協(xié)議集成的靈活性。

不論是Webflux還是虛擬線程,這兩個都是為了提供程序的高并發(fā)能力而生,那么誰更勝一籌呢?下面一起看看具體的測試。7zB28資訊網(wǎng)——每日最新資訊28at.com

測試環(huán)境

運(yùn)行環(huán)境與工具7zB28資訊網(wǎng)——每日最新資訊28at.com

  • 一臺16G內(nèi)存的MacBook Pro M1
  • Java 20
  • Spring Boot 3.1.3
  • 啟用預(yù)覽模式,以獲得虛擬線程的強(qiáng)大能力
  • 依賴的第三方庫:jjwt、mysql-connector-java
  • 測試工具:Bombardier
  • 數(shù)據(jù)庫:MySQL

數(shù)據(jù)準(zhǔn)備7zB28資訊網(wǎng)——每日最新資訊28at.com

  • 在Bombardier中準(zhǔn)備100000個JWT列表,用來從中隨機(jī)選取JWT,并將其放入HTTP請求的授權(quán)信息中。
  • 在MySQL中創(chuàng)建一個users表,表結(jié)構(gòu)如下:
mysql> desc users;+--------+--------------+------+-----+---------+-------+| Field  | Type         | Null | Key | Default | Extra |+--------+--------------+------+-----+---------+-------+| email  | varchar(255) | NO   | PRI | NULL    |       || first  | varchar(255) | YES  |     | NULL    |       || last   | varchar(255) | YES  |     | NULL    |       || city   | varchar(255) | YES  |     | NULL    |       || county | varchar(255) | YES  |     | NULL    |       || age    | int          | YES  |     | NULL    |       |+--------+--------------+------+-----+---------+-------+6 rows in set (0.00 sec)
  • 為users表準(zhǔn)備100000條用戶數(shù)據(jù)

測試代碼

帶虛擬線程的Spring Boot程序

application.properties配置文件:7zB28資訊網(wǎng)——每日最新資訊28at.com

server.port=3000spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=falsespring.datasource.username= testuserspring.datasource.password= testpwdspring.jpa.hibernate.ddl-auto= updatespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

User實體類(為了讓文章讓簡潔一些,這里DD省略了getter和setter):7zB28資訊網(wǎng)——每日最新資訊28at.com

@Entity@Table(name = "users")public class User {  @Id  private String email;  private String first;  private String last;  private String city;  private String county;  private int age;}

應(yīng)用主類:7zB28資訊網(wǎng)——每日最新資訊28at.com

@SpringBootApplicationpublic class UserApplication {    public static void main(String[] args) {        SpringApplication.run(UserApplication.class, args);    }    @Bean    public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {        return protocolHandler -> {            protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());        };    }}

提供CRUD操作的UserRepository:7zB28資訊網(wǎng)——每日最新資訊28at.com

import org.springframework.data.repository.CrudRepository;import com.example.demo.User;public interface UserRepository extends CrudRepository<User, String> {}

提供API接口的UserController類:7zB28資訊網(wǎng)——每日最新資訊28at.com

@RestControllerpublic class UserController {    @Autowired    UserRepository userRepository;    private SignatureAlgorithm sa = SignatureAlgorithm.HS256;    private String jwtSecret = System.getenv("JWT_SECRET");    @GetMapping("/")    public User handleRequest(@RequestHeader(HttpHeaders.AUTHORIZATION) String authHdr) {        String jwtString = authHdr.replace("Bearer","");        Claims claims = Jwts.parser()            .setSigningKey(jwtSecret.getBytes())            .parseClaimsJws(jwtString).getBody();        Optional<User> user = userRepository.findById((String)claims.get("email"));        return user.get();    }}

Spring Boot Webflux程序

application.properties配置文件:7zB28資訊網(wǎng)——每日最新資訊28at.com

server.port=3000spring.r2dbc.url=r2dbc:mysql://localhost:3306/testdbspring.r2dbc.username=dbserspring.r2dbc.password=dbpwd

User實體(這里DD也省略了構(gòu)造函數(shù)、getter和setter):7zB28資訊網(wǎng)——每日最新資訊28at.com

public class User {  @Id  private String email;  private String first;  private String last;  private String city;  private String county;  private int age;  // 省略了構(gòu)造函數(shù)、getter、setter  }

應(yīng)用主類:7zB28資訊網(wǎng)——每日最新資訊28at.com

@EnableWebFlux@SpringBootApplicationpublic class UserApplication {  public static void main(String[] args) {    SpringApplication.run(UserApplication.class, args);  }}

提供CRUD操作的UserRepository:7zB28資訊網(wǎng)——每日最新資訊28at.com

public interface UserRepository extends R2dbcRepository<User, String> {}

提供根據(jù)id查用戶的業(yè)務(wù)類UserService:7zB28資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic class UserService {  @Autowired  UserRepository userRepository;  public Mono<User> findById(String id) {    return userRepository.findById(id);  }}

提供API接口的UserController類:7zB28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMapping("/")public class UserController {  @Autowired  UserService userService;  private SignatureAlgorithm sa = SignatureAlgorithm.HS256;  private String jwtSecret = System.getenv("JWT_SECRET");  @GetMapping("/")  @ResponseStatus(HttpStatus.OK)  public Mono<User> getUserById(@RequestHeader(HttpHeaders.AUTHORIZATION) String authHdr) {    String jwtString = authHdr.replace("Bearer","");    Claims claims = Jwts.parser()        .setSigningKey(jwtSecret.getBytes())        .parseClaimsJws(jwtString).getBody();    return userService.findById((String)claims.get("email"));  }}

測試結(jié)果

接下來是重頭戲了,作者對兩個技術(shù)方案都做了500w個請求的測試,評估的不同并發(fā)連接級別包含:50、100、300。7zB28資訊網(wǎng)——每日最新資訊28at.com

具體結(jié)果如下三張圖:7zB28資訊網(wǎng)——每日最新資訊28at.com

7zB28資訊網(wǎng)——每日最新資訊28at.com

50并發(fā)連接7zB28資訊網(wǎng)——每日最新資訊28at.com

7zB28資訊網(wǎng)——每日最新資訊28at.com

100并發(fā)連接7zB28資訊網(wǎng)——每日最新資訊28at.com

7zB28資訊網(wǎng)——每日最新資訊28at.com

300并發(fā)連接7zB28資訊網(wǎng)——每日最新資訊28at.com

最后,作者得出結(jié)論:Spring Boot Webflux要更優(yōu)于帶虛擬線程的Spring Boot。7zB28資訊網(wǎng)——每日最新資訊28at.com

7zB28資訊網(wǎng)——每日最新資訊28at.com

似乎引入了虛擬線程還不如已經(jīng)在用的Webflux?不知道大家是否有做過相關(guān)調(diào)研呢?如果有的話,歡迎在留言區(qū)一起聊聊~我們創(chuàng)建了一個高質(zhì)量的技術(shù)交流群,與優(yōu)秀的人在一起,自己也會優(yōu)秀起來,趕緊點(diǎn)擊加群,享受一起成長的快樂。7zB28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-60396-0.htmlSpring Boot虛擬線程的性能還不如Webflux?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C# 如何判斷某個 TCP 端口是否被占用?

下一篇: Docker鏡像與容器的交互及在容器內(nèi)部執(zhí)行代碼的原理與實踐

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 6月安卓手機(jī)好評榜:魅族20 Pro蟬聯(lián)冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機(jī)好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時間業(yè)務(wù)團(tuán)隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 三言兩語說透設(shè)計模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計模式,它所創(chuàng)建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統(tǒng)中的其他對象共享,從而減少
  • 一篇聊聊Go錯誤封裝機(jī)制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動了近年來最大的人力制度改革,目前已形成一
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關(guān)于華為新旗艦的爆料日漸密集。據(jù)此前多方爆料,今年華為將開始恢復(fù)一年雙旗艦戰(zhàn)略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 蘋果公司要求三星和LG Display生產(chǎn)「無邊框」OLED iPhone顯示屏

    據(jù) The Elec 報道,蘋果已要求其供應(yīng)商為未來的 iPhone 型號開發(fā)「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發(fā)新的 OLED 顯示面
Top 主站蜘蛛池模板: 理塘县| 留坝县| 鹿泉市| 台南市| 县级市| 嘉义县| 镇坪县| 固原市| 九龙城区| 西乡县| 淮安市| 诸暨市| 文成县| 阿拉尔市| 犍为县| 涟水县| 彝良县| 泰顺县| 连江县| 沙雅县| 临安市| 壤塘县| 积石山| 平邑县| 乌拉特中旗| 色达县| 金沙县| 武乡县| 德惠市| 滦南县| 宜兰县| 吴旗县| 泰和县| 铁岭县| 定州市| 新竹县| 诸城市| 舒城县| 同心县| 舒兰市| 文昌市|