早上看到一篇關(guān)于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內(nèi)容較長,抓重點(diǎn)給大家介紹一下這篇文章的核心內(nèi)容,方便大家快速閱讀。
作者采用了一個盡可能貼近現(xiàn)實操作的場景:
這里要對比的兩個核心技術(shù)點(diǎn)是:
不論是Webflux還是虛擬線程,這兩個都是為了提供程序的高并發(fā)能力而生,那么誰更勝一籌呢?下面一起看看具體的測試。
運(yùn)行環(huán)境與工具
數(shù)據(jù)準(zhǔn)備
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)
application.properties配置文件:
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):
@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)用主類:
@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:
import org.springframework.data.repository.CrudRepository;import com.example.demo.User;public interface UserRepository extends CrudRepository<User, String> {}
提供API接口的UserController類:
@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(); }}
application.properties配置文件:
server.port=3000spring.r2dbc.url=r2dbc:mysql://localhost:3306/testdbspring.r2dbc.username=dbserspring.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 }
應(yīng)用主類:
@EnableWebFlux@SpringBootApplicationpublic 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è)務(wù)類UserService:
@Servicepublic 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")); }}
接下來是重頭戲了,作者對兩個技術(shù)方案都做了500w個請求的測試,評估的不同并發(fā)連接級別包含:50、100、300。
具體結(jié)果如下三張圖:
50并發(fā)連接
100并發(fā)連接
300并發(fā)連接
最后,作者得出結(jié)論:Spring Boot Webflux要更優(yōu)于帶虛擬線程的Spring Boot。
似乎引入了虛擬線程還不如已經(jīng)在用的Webflux?不知道大家是否有做過相關(guān)調(diào)研呢?如果有的話,歡迎在留言區(qū)一起聊聊~我們創(chuàng)建了一個高質(zhì)量的技術(shù)交流群,與優(yōu)秀的人在一起,自己也會優(yōu)秀起來,趕緊點(diǎn)擊加群,享受一起成長的快樂。
本文鏈接:http://www.www897cc.com/showinfo-26-60396-0.htmlSpring Boot虛擬線程的性能還不如Webflux?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com