Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)
早上看到一篇关于SpringBoot虚构线程和Webflux性能对比的文章,感觉还不错。内容较长,抓重点给大家引见一下这篇文章的外围内容,繁难大家极速浏览。
测试场景
作者驳回了一个尽或者贴近事实操作的场景:
测试技术
这里要对比的两个外围技术点是:
不论是Webflux还是虚构线程,这两个都是为了提供程序的高并发才干而生,那么谁更胜一筹呢?上方一同看看详细的测试。
测试环境
运转环境与工具
数据预备
mysql>descusers;+--------+--------------+------+-----+---------+-------+|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||+--------+--------------+------+-----+---------+-------+6rowsinset(0.00sec)
测试代码
带虚构线程的SpringBoot程序
lication.properties性能文件:
server.port=3000spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=falsespring.datasource.username=testuserspring.datasource.pass=testpwdspring.jpa.hibernate.ddl-auto=updatespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
User实体类(为了让文章让繁复一些,这里DD省略了getter和setter):
@Entity@Table(name="users")publicclassUser{@IdprivateStringemail;privateStringfirst;privateStringlast;privateStringcity;privateStringcounty;privateintage;}
运行主类:
@SpringBootApplicationpublicclassUserApplication{publicstaticvoidmain(String[]args){SpringApplication.run(UserApplication.class,args);}@BeanpublicProtocolHandlerCustomizer<?>protocolHandlerVirtualThreadExecutorCustomizer(){returnprotocolHandler->{protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());};}}
提供CRUD操作的UserRepository:
importorg.springframework.data.repository.CrudRepository;importcom.example.demo.User;publicinterfaceUserRepositoryextendsCrudRepository<User,String>{}
提供API接口的UserController类:
@RestControllerpublicclassUserController{@AutowiredUserRepositoryuserRepository;privateSignatureAlgorithmsa=SignatureAlgorithm.HS256;privateStringjwtSecret=System.getenv("JWT_SECRET");@GetMapping("/")publicUserhandleRequest(@RequestHeader(HttpHeaders.AUTHORIZATION)StringauthHdr){StringjwtString=authHdr.replace("Bearer","");Claimsclaims=Jwts.parser().setSigningKey(jwtSecret.getBytes()).parseClaimsJws(jwtString).getBody();Optional<User>user=userRepository.findById((String)claims.get("email"));returnuser.get();}}
SpringBootWebflux程序
application.properties性能文件:
server.port=3000spring.r2dbc.url=r2dbc:mysql://localhost:3306/testdbspring.r2dbc.username=dbserspring.r2dbc.password=dbpwd
User实体(这里DD也省略了结构函数、getter和setter):
publicclassUser{@IdprivateStringemail;privateStringfirst;privateStringlast;privateStringcity;privateStringcounty;privateintage;//省略了结构函数、getter、setter}
运行主类:
@EnableWebFlux@SpringBootApplicationpublicclassUserApplication{publicstaticvoidmain(String[]args){SpringApplication.run(UserApplication.class,args);}}
提供CRUD操作的UserRepository:
publicinterfaceUserRepositoryextendsR2dbcRepository<User,String>{}
提供依据id查用户的业务类UserService:
@ServicepublicclassUserService{@AutowiredUserRepositoryuserRepository;publicMono<User>findById(Stringid){returnuserRepository.findById(id);}}
提供API接口的UserController类:
@RestController@RequestMapping("/")publicclassUserController{@AutowiredUserServiceuserService;privateSignatureAlgorithmsa=SignatureAlgorithm.HS256;privateStringjwtSecret=System.getenv("JWT_SECRET");@GetMapping("/")@ResponseStatus(HttpStatus.OK)publicMono<User>getUserById(@RequestHeader(HttpHeaders.AUTHORIZATION)StringauthHdr){StringjwtString=authHdr.replace("Bearer","");Claimsclaims=Jwts.parser().setSigningKey(jwtSecret.getBytes()).parseClaimsJws(jwtString).getBody();returnuserService.findById((String)claims.get("email"));}}
测试结果
接上去是重头戏了,作者对两个技术打算都做了500w个恳求的测试,评价的不同并发衔接级别蕴含:50、100、300。
详细结果如下三张图:
50并发衔接
100并发衔接
300并发衔接
最后,作者得出论断:SpringBootWebflux要更优于带虚构线程的SpringBoot。
仿佛引入了虚构线程还不如曾经在用的Webflux?不知道大家能否有做过相关调研呢?假设有的话,欢迎在留言区一同聊聊~咱们创立了一个高品质的技术交换群,与低劣的人在一同,自己也会低劣起来,连忙点击加群,享用一同生长的快乐。
我的ide新建springboot项目怎么和网上的都不一样
选第一个没错的,第二个reactive web是 webflux 除了出现在教程中,其他使用者都是一些大公司的小团队或者小作坊团队在用,这个技术目前还比较新,目前很少有人使用,不过webflux带来的好处太多了估计很快就能大规模应用了吧
SpringCloud Alibaba组件
一.组件组成
二. 各个组件的介绍
2.1. Gateway
GateWay是在spring生态系统上构建的API网关服务,它是基于springboot2,spring5,和project Reactor等技术
2.1.2 作用:
2.1.3优势 性能方面比zuul要好,因为gateway是基于webFlux框架实现(底层是Reactor模式的netty)
2.1.4特点
2.1.5为什么选择gateway?
3.三大核心概念 路由:是构建网关的基本模块,他由id,目标url,一系列的断言和过滤器组成,如果断言为true则匹配该路由. 断言: 过滤: 过滤请求用的
4.工作流程 路由转发+ 过滤器链
二: config 分布式配置中心 1. 产生背景: 微服务项目中会根据业务来拆分成一个个子服务,而每个服务都会有自己的配置文件为了统一管理,所以configserver应运而生了. 2.概念: springcloud config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为 各个不同的微服务 应用的所有环境提供一个 中心化的外部配置 .
3.作用: 1. 为了集中式和动态的管理配置信息 2.运行期间动态调整配置不在需要在每个服务器上部署的机器上编写配置文件,服务会向配置中心统一拉取配置信息 3.动态加载配置信息,服务不用重启就可以感知配置的变化并应用配置 4.把配置信息以rs风格接口的形式暴露(post或curl命令) ps: 其实就相当于项目里的公共模块,一个意思
那我们如何使用它呢? 一. 首先config分为客户端和服务端. 二. 服务端其实就是我们常说的 分布式配置中心 ,它是一个独立的微服务应用, 可以用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等接口. 三. 而客户端是通过指定的配置中心来管理应用资源,这样有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理来访问配置内容. 四.分布式配置动态刷新问题 实现步骤: 里添加actuator监控 暴露监控端点 3. 启动类上加 @RefreshScope -XPOST(每次修改后必须执行这个,否则客户端还是读取不到最新的配置信息) 五.如果有多个客户端,难道每个微服务都要执行一次post命令? 可不可以只改一处,让其他的地方都生效 三. Bus 消息总线 1.概念 springcloudBus 是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了java的时间处理机制和消息中间件的功能
五 1.概念 nacos是一个更易于构建云原生应用的动态服务发现, 配置管理和服务管理平台. 2. 各个配置中心对比
六 . Sentinel 1.概念 把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性. 七. Seata 1. 概念 阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案.
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。