框架大致介绍
-
成熟度:Java 最成熟,并且也已用于生产环境,Go其次, Rust为近期才完成
-
语言熟悉度: Java=Go>Rust
-
设计思想: 核心只有一个: cdi (context with dependency inject),Go,Rust的框架都源自于Java框架,而Java框架源于Spring,所以可以认为所有的3个框架的核心都是Spring的思想, 但是不会为了ioc 而ioc,导致复杂度几何级上升,3个框架都是实现了功能上的解耦,以插件的形式组合形成一个应用
-
编码思路: 三个框架的编码可以说是一模一样吧,同种思路不同实现而已,Java是注解,Go则是标签,Rust则是宏. 同时编码本来就是A借鉴B,B借鉴C的过程,所以所有框架的实现都借鉴了部分开源代码的实现, 算是活学活用吧,看了很多框架的源码
- Java: spring,springboot-grpc,netty,fabric-sdk-java,rpcx-java,distributor(这个不是非常熟悉)
- Go: rpcx,Hyperledger-Fabric/Fabric-ca ,ipfs,gin,tendermint,cosmos-sdk,libp2p
- Rust: rust确切的说,整体不是非常非常熟悉,但是也大致借鉴了怎么玩的,也是一门挺有意思的语言. 主要是借鉴的tokio 和rocket
-
从开始到基础搭建结束耗时时间而言, Rust>Java>Go,Java大概写了一个月左右吧,Go 很快,基于Java基础的设计,不到一个月就写完了,而Rust 中途磨磨唧唧了挺长一段时间,所以大概是2个月左右搞完(实际编码可能也是1个月吧),这2个月是从0开始边学边写
本篇博文的目的
- 目的很简单,只有一个,那就是测试下框架的一些基础性能
- rest 方面的qps
- … 有想到再补…
压测环境
- 工具
- jmeter
- 配置
- 自身的开发机,mac m1 max 64G,24C
- 压测方案
预期结果
- 预期的话,Rust 会qps最高,Go>=Java,原因的话
- 一部分与编码有关,Go的逻辑处理都是没开routine的我记得,Java都是开了threadpool进行处理,Rust的话,全程异步routine的形式
- 语言方面,无GC的语言自然要比GC语言性能高,但是Go和Java相比的话,Go生态上对标的是Java,虽然号称就是比Java快,但这也太小看Java 了,小看JIT,小看Netty了, 但是Java框架,是在Spring基础上再封装,而Spring已经在servlet基础封装过了,所以多次封装必然会带来性能上的损失
- 测试有关, 压测并不规范,下次压测开始时系统运行情况不会与上次相同,没有控制变量
实际结果
- qps
- 1000线程
- Java: 30820.10/s
- Go: 38862.74/s
- Rust:55222.67/s
- 后续再继续~
- 1000线程