写点什么

Springboot vs Quarkus

作者:Geek_69ef3d
  • 2023-09-26
    广东
  • 本文字数:1903 字

    阅读完需:约 6 分钟

近些年,随着 Reactive 模式的盛行,Redhat 推出了一个新的框架 Quarkus,主要目的是让 Java 在云生态下可以更好的发挥作用,Quarkus 由于是后面才产生的,它使用的大部分都是 Jakarta 的标准,可以更方便后续的移植,Quarkus 是基于容器优先的原则来创建的,所以用 native image 构建的包能够获得更好的性能。


而对于写 Java 的开发来说,Springboot 一定不会陌生,它的横空出现,迅速成为了 Java 微服务开发的代表,我是比较早接触微服务的,在 springboot 出现之前,还用过 Play framework 开发微服务,随着 springboot 的出现,也将原有的 Play 开发项目转成 Springboot,因为 Springboot 对于 Java 开发者来说,有着更好的社区资源。


这篇文章将会讲述两者之间的优劣势。

Starter

热启动

  • Springboot 能做热启动,但整个配置过程比较繁琐。需要手动添加spring-boot-devtools去实现这功能。

  • Quarkus 在开发环境上,默认支持热启动,不需要额外配置。

内置容器

  • Springboot 支持多种容器,例如 tomcat,netty,undertow,开发者可以通过配置来决定使用哪种容器。

  • Quarkus 目前只支持 Netty 容器。

开发监控

  • Springboot 可以通过引入 spring-boot-actuator 以及引入其他对应的可视化工具来实时监控。

  • Quarkus 默认提供一个 Dev UI,只在开发环境上能用,如果需要监控生产环境,需要做一些开发暴露出服务 health 的状况,然后引入到其他对应的可视化工具。

启动步骤

  • Springboot 在项目启动过程中会经历以下几个步骤:

  • 将项目中的标注为@SpringApplication的类作为 primary source 传入到容器中。

  • 通过META-INF/spring.factories 获取到 SpringfactoryInstance。

  • 启动一个 BootstrapContext。

  • 获取所有的SpringApplicationRunListener,启动监听器,springboot 自带一个监听器,会在每一步执行的时候输出对应的日志。

  • 获取配置,包括启动参数,系统参数,以及配置文件参数。

  • 准备环境,将所有的配置以及 listener attach 到 BootstrapContext 当中。

  • 根据 classpath 下的DispatchHandle 或者 DispatchSevlet来判断 webtype,同时创建一个 ApplicationContext。

  • 准备容器,刷新容器,完成容器刷新过程。这一步主要是通过***DI(Dependency injection)***的方式来完成 bean 的初始化。

  • 启动所有的 runner,包括ApplicationRunnerCommandLineRunner

  • 没有报错,整个启动过程完成。

  • Quarkus 在项目启动过程会经历以下几个步骤:

  • 会去寻找项目找标注为@QuarkusMain的类,如果没有,会自动创建一个。

  • 创建一个ApplicationLifecycleManager

  • 注册 hooks。

  • 读取配置,包括启动参数,系统参数,以及配置文件参数。

  • 通过 CDI(context dependency injection)的方式来初始化 bean。

  • 创建CreationalContext

  • 运行 run 方法。


从上面启动过程中,可以看出 Quarkus 的启动步骤会更好,因为它支持的类型少,两者都用到了 SPI 去创建相应的依赖。差别比较大的一点就是 Springboot 使用的是 DI 的方式去初始化 Bean,而 Quarkus 是用 CDI 的方式去初始化 bean。在 DI 的模式下,所有的 bean 都会被初始化,除了那些加了@Lazy的注解 bean 之外,而 CDI 的模式,引入了一个代理,所有的 bean 都是 Lazy creation,所有的依赖都是以引用的方式,所以注入以后,还是会监听到依赖的变化,因为依赖都只是一个引用,所有的调用都是通过代理去调用,所以即使出现循环依赖也不会有问题。CDI 有一个重要的原则就是exactly one bean must be assignable to an injection point, otherwise the build fails**

Reactive

为了更好的利用服务器的资源,能够用 reactive 模式编写的,尽量都用 reactive 模式来编写,reactive 模式底层都是基于 netty 的 eventgroup 和 workgroup 来实现的。reactive 的核心观点是 noblocking,用少量线程支持大量的事件,通过事件流和回调来减少 cpu 的等待事件,同时也避免线程切换消耗的资源。


  • Springboot 支持 reactive,基于 spring 的 Mono 和 Flux。

  • Quarkus 支持 reactive,它是基于 eclipse 的 vert.x,默认核心线程是 20 个。


我个人更加倾向于使用 vert.x 来写 reactive,api 使用起来更加的简洁。

Conclusion

基于微服务的开发,个人更加倾向于使用 Quarkus,原因如下:

1、它创建的初衷就是容器优先的原则,所以在云平台上有更好的性能。

2、跟 GravaalVM 可以做更简单的集成,提供各种 docker image 的生成,包括 native-image,可以让你更简单的容器化应用。


不过技术的选择都是要考虑个人或者团队的技术栈,目前由于 springcloud 的完整生态,Springboot 依然会是主流,这篇文章只是提供另外一个选择。

发布于: 刚刚阅读数: 4
用户头像

Geek_69ef3d

关注

还未添加个人签名 2019-02-25 加入

还未添加个人简介

评论

发布
暂无评论
Springboot vs Quarkus_Geek_69ef3d_InfoQ写作社区