国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較

這篇具有很好參考價值的文章主要介紹了Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

早上看到一篇關于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內(nèi)容較長,我就不翻譯了,抓重點給大家介紹一下這篇文章的核心內(nèi)容,方便大家快速閱讀。

測試場景

作者采用了一個盡可能貼近現(xiàn)實操作的場景:

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

測試技術

這里要對比的兩個核心技術點是:

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

不論是Webflux還是虛擬線程,這兩個都是為了提供程序的高并發(fā)能力而生,那么誰更勝一籌呢?下面一起看看具體的測試。

測試環(huán)境

運行環(huán)境與工具

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

數(shù)據(jù)準備

  • 在Bombardier中準備100000個JWT列表,用來從中隨機選取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表準備100000條用戶數(shù)據(jù)

測試代碼

帶虛擬線程的Spring Boot程序

application.properties配置文件:

server.port=3000

spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=false
spring.datasource.username= testuser
spring.datasource.password= testpwd
spring.jpa.hibernate.ddl-auto= update
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

User實體類(為了讓文章讓簡潔一些,這里DD省略了getter和setter):

@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;

}

應用主類:

@SpringBootApplication
public 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

import org.springframework.data.repository.CrudRepository;
import com.example.demo.User;

public interface UserRepository extends CrudRepository<User, String> {

}

提供API接口的UserController類:

@RestController
public 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配置文件:

server.port=3000

spring.r2dbc.url=r2dbc:mysql://localhost:3306/testdb
spring.r2dbc.username=dbser
spring.r2dbc.password=dbpwd

User實體(這里DD也省略了構(gòu)造函數(shù)、getter和setter):

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
  
}

應用主類:

@EnableWebFlux
@SpringBootApplication
public class UserApplication {

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

}

提供CRUD操作的UserRepository

public interface UserRepository extends R2dbcRepository<User, String> {

}

提供根據(jù)id查用戶的業(yè)務類UserService

@Service
public class UserService {

  @Autowired
  UserRepository userRepository;

  public Mono<User> findById(String id) {
    return userRepository.findById(id);
  }
}

提供API接口的UserController類:

@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é)果

接下來是重頭戲了,作者對兩個技術方案都做了500w個請求的測試,評估的不同并發(fā)連接級別包含:50、100、300。

具體結(jié)果如下三張圖:

Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較

Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較

Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較

最后,作者得出結(jié)論:Spring Boot Webflux要更優(yōu)于帶虛擬線程的Spring Boot。

Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較

似乎引入了虛擬線程還不如已經(jīng)在用的Webflux?不知道大家是否有做過相關調(diào)研呢?如果有的話,歡迎在留言區(qū)一起聊聊~

如果您學習過程中如遇困難?可以加入我們超高質(zhì)量的Spring技術交流群,參與交流與討論,更好的學習與進步!更多Spring Boot教程可以點擊直達!,歡迎收藏與轉(zhuǎn)發(fā)支持!如果您對這篇內(nèi)容的原文感興趣的話,也可以通過點擊這里查看。

歡迎關注我的公眾號:程序猿DD。第一時間了解前沿行業(yè)消息、分享深度技術干貨、獲取優(yōu)質(zhì)學習資源文章來源地址http://www.zghlxwxcb.cn/news/detail-712195.html

到了這里,關于Spring Boot虛擬線程與Webflux在JWT驗證和MySQL查詢上的性能比較的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 一次搞清Spring 、Spring Boot、Spring Web MVC、Spring WebFlux

    一次搞清Spring 、Spring Boot、Spring Web MVC、Spring WebFlux

    介紹Spring生態(tài)系統(tǒng),辨析Spring、Spring Boot、Spring Web MVC和Spring WebFlux。 微信搜索關注《Java學研大本營》 在軟件開發(fā)中,應用框架為代碼庫提供基礎設施支持,使編程更容易。Spring是Java領域最受歡迎的開源應用框架。Spring由多個模塊和附加組件組成,術語“Spring”通常用來指代

    2024年02月19日
    瀏覽(25)
  • Spring Boot 3.0系列【23】應用篇之集成Spring WebFlux

    有道無術,術尚可求,有術無道,止于術。 本系列Spring Boot版本3.0.4 源碼地址:https://gitee.com/pearl-organization/study-spring-boot3 官方文檔地址 Spring MVC 是 Spring 專門為 Servlet API 和 Servlet 容器而設計的 Web 框架, 在 5.0 版本中加入了基于響應式的 Web 框架 Spring WebFlux ,它是完全 非阻

    2023年04月14日
    瀏覽(25)
  • 用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務器有多快?

    用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務器有多快?

    Spring Boot 3.2 于 2023 年 11 月大張旗鼓地發(fā)布,標志著 Java 開發(fā)領域的一個關鍵時刻。這一突破性的版本引入了一系列革命性的功能,包括: 虛擬線程:利用 Project Loom 的虛擬線程釋放可擴展性,從而減少資源消耗并增強并發(fā)性。 Native Image支持:通過Native Image編譯制作速度極快

    2024年02月03日
    瀏覽(26)
  • 微服務系列-使用WebFlux的WebClient進行Spring Boot 微服務通信示例

    公眾號「架構(gòu)成長指南」,專注于生產(chǎn)實踐、云原生、分布式系統(tǒng)、大數(shù)據(jù)技術分享。 在之前的教程中,我們看到了使用 RestTemplate 的 Spring Boot 微服務通信示例。 從 5.0 開始,RestTemplate處于維護模式,很快就會被棄用。因此 Spring 團隊建議使用 org.springframework.web.reactive.clien

    2024年02月05日
    瀏覽(19)
  • 詳解數(shù)據(jù)庫分片,大幅提升Spring Boot查詢MySQL性能

    詳解數(shù)據(jù)庫分片,大幅提升Spring Boot查詢MySQL性能

    微服務項目中通常包含各種服務。其中一項服務與存儲用戶相關的數(shù)據(jù)有關。我們使用Spring Boot作為后端,使用MySQL數(shù)據(jù)庫。 隨著用戶基數(shù)的增長,服務性能受到了影響,延遲也上升了。由于只有一個數(shù)據(jù)庫和一張表,許多查詢和更新由于鎖異常返回錯誤。此外,隨著數(shù)據(jù)庫

    2024年01月16日
    瀏覽(26)
  • Spring boot 整合 JWT

    Spring boot 整合 JWT

    第一章 Java線程池技術應用 第二章 CountDownLatch和Semaphone的應用 第三章 Spring Cloud 簡介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 第九章 代碼管理gitlab 使用 第十章 Spr

    2024年02月05日
    瀏覽(19)
  • spring boot security使用jwt認證

    spring boot security使用jwt認證

    在前面的幾篇文章中: spring boot security快速使用示例 spring boot security之前后端分離配置 spring boot security自定義認證 spring boot security驗證碼登錄示例 基本對常用的基于cookie和session的認證使用場景都已覆蓋。但是session屬于有狀態(tài)認證,本文給出一個無狀態(tài)的認證:jwt認證示例。

    2024年02月12日
    瀏覽(17)
  • Shiro + JWT + Spring Boot Restful 簡易教程

    GitHub 項目地址:github.com/Smith-Cruis… 。 原文地址:www.inlighting.org/archives/sp…。 我也是半路出家的人,如果大家有什么好的意見或批評,請務必 issue 下。 如果想要直接體驗,直接 clone 項目,運行 mvn spring-boot:run 命令即可進行訪問。網(wǎng)址規(guī)則自行看教程后面。 如果想了解 Sp

    2024年01月19日
    瀏覽(44)
  • spring boot kotlin webflux 或 web 多文件上傳 報錯400 415 No primary or single unique constructor found for

    spring boot kotlin webflux 或 web 多文件上傳 報錯400 415 No primary or single unique constructor found for

    #當我們使用Kotlin編寫Spring Boot進行多文件上傳的時候,傳統(tǒng)的方法如下: 此時會有如下幾種情況: 以上是第一種情況,直接報錯,并提示無主構(gòu)造函數(shù)。這時我們通過互聯(lián)網(wǎng)搜索可能會在形參上加上: @RequestParam (web)或者 @RequestPart (webflux)。如下: 然后后端沒報錯了,返回值

    2024年02月15日
    瀏覽(22)
  • Spring Boot + JWT = 安全無憂的RESTful API

    在構(gòu)建現(xiàn)代Web應用程序時,安全性是一個不可或缺的要素。JSON Web Token(JWT)提供了一種簡潔的方式來保護我們的RESTful接口。在本篇博客中,我們將一步步探索如何在Spring Boot應用中整合JWT,確保你的API安全、高效且易于管理。 JWT(JSON Web Token)是一個開放標準(RFC 7519),它

    2024年02月02日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包