云原生时代的Spring Boot

Spring Boot毫无疑问是Java后端开发的第一大框架,基于Spring Boot有着一套完整的工具链,各种各样的starter。对于日常业务开发而言,可以说是轮子很全。

但随着云原生时代的到来,Spring Boot应用或者说是Java应用却暴露出了一些问题,其中比较突出的有:

  • 启动慢

  • 应用内存占用多

其中启动慢的主要原因:代码编译。

当然对于Spring Boot来说,Bean实例注入也会花费一定的时间,但花费时间相比编译会小的多。大家可以通过开启延迟初始化试试。

1
2
3
spring:
  main:
    lazy-initialization: true

Spring Boot 2.2开始支持。

个人本地开启延迟初始化之后,启动能快了1~2秒,整个启动时间10秒左右。

测试机配置:i7-6500U 2.50@GHz 内存:16G

内存占用多主要是内存占用后不会归还操作系统,这个正在逐步改善:

  • G1 JDK12及之后 已支持

  • ZGC JDK13及之后 已支持

由于Java语言的特性及Spring Boot的一些实现方式,决定了即便是开启了G1/ZGC的未使用内存及时归还操作系统,Spring Boot的内存占用,仍然远大于Golang这种编译型语言。

2017年9月,Java 9发布,在Java 9中引入了AOT(Ahead-of-Time Compilation)。

AOT在内部使用是通过GraalVM来生成代码的。

但对于普通用户而言通过Java的AOT去编译Spring程序还是不可行的。

那么有没有一种比较优雅的解决方案呢?既能使用Spring Boot又能像Golang一样启动快、内存占用低?

有朋友可能想到了Quarkus、Micronaut,但这两个框架如果是从头开始开发,可以考虑一下,但还是要注意两点:

  • 需要去学习使用

  • 某些库有可能不支持

其实,Java想要解决云原生时代的问题,目前的方案基本都是基于GraalVM来的,不管是Quarkus还是Micronaut都是。

那么,Spring Boot有没有类似的方案呢?

答案是有的。

在spring-projects-experimental Organizations下有这么一个项目:spring-graalvm-native

目前已发布到0.7.0 release,不过从github的文档中可以看到这个项目的状态仍然是alpha,也就是说目前用到生产中还是为时过早。

希望能早日spring-graalvm-native能早日发布生产可用版本吧。

graalvm+AOT如此美好?

其实,GraalVM目前来看还是有一些局限的:

Not Supported

  • Dynamic Class Loading/Unloading

  • Runtime Bytecode Generation *

  • InvokeDynamic Bytecode and Method Handles

  • ……

Require Configuration

  • Resource Access

  • Reflection

  • Dynamic Proxy(JDK,not CGLIB)

  • JNI (Java Native Interface)

  • ……

更详细限制可以看:

https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md

同时,由于提前编译无法像JIT那样获取到运行时的信息,所以在做Profile-Guided Optimization,PGO时,会更麻烦。

具体做法:https://www.graalvm.org/docs/release-notes/19_2/

JIT会做的典型的PGO1

  • type-feedback optimization:主要针对多态的面向对象程序来做优化。根据profile收集到的receiver type信息来把原本多态的虚方法调用点(virtual method call site)或属性访问点(property access site)根据类型来去虚化(devirtualize)。

  • single-value profiling:这个相对少见一些。它的思路是有些参数、函数返回值可能在一次运行中只会遇到一个具体值。如果是这样的话可以把那个具体值给记录下来,然后在JIT编译时把它当作常量来做优化,于是常见的常量相关优化(常量折叠、条件常量传播等)就可以针对一个静态意义上本来不是常量的值来做了。branch-profile-based code scheduling:主要目的是把“热”的(频繁执行的)代码路径集中放在一起,而把“冷”的(不频繁执行的)代码路径放到别的地方。AOT编译的话常常会利用一些静态的启发条件来猜测哪些路径比较热,或者让用户指定哪些路径比较热(例如likely()/unlikely()宏),而JIT搭配PGO的话可以有比较准确的路径热度信息,对应可以做的优化也就更吻合实际执行情况,于是效果会更好。

  • profile-guided inlining heuristics:根据profile信息得知函数调用点的热度,从而影响内联决策——对某个调用点,到底值不值得把目标函数内联进来。

  • implicit exception:隐式异常,例如Java/C#的空指针异常检查,又例如Java/C#的除以零检查。这些异常如果在某块代码里从来没有发生过,就可以用更快的方式来实现,而不必生成显式检查代码。但如果在某块代码经常发生这种异常,则显式检查会更快。

附录:

1.

JIT会做的典型的PGO

https://www.zhihu.com/question/52572852↩︎

个人思考:

其实,通过openjdk jeps及spring boot的一些实验性的项目可以看出,Java正在实现一些新的特性:比如本文提到的AOT,Loom来解决Java的一些痛点。

但这些新的特性具体什么时候能用于生产还是一个未知数。

相对于Golang,在使用Java的过程中,我个人感觉有以下几个痛点:

  • 没有协程,无法轻量的异步。

  • 也正是没有协程,IO请求的阻塞,会导致线程上下文的切换,成本太高。

  • 内存占用过高

  • 没有Context,调用方请求取消,感知不到;调用别人的时候,也没有办法很好的传递调用状态及请求取消。

< END >

 or 

            

推荐阅读:

展开阅读全文

spring boot2.0实战中间件redisson与典型的应用场景

02-16
概要介绍: 本课程主要是介绍并实战一款java中间件~redisson,介绍redisson相关的核心技术栈及其典型的应用场景,其中的应用场景就包括布隆过滤器、限流器、短信发送、实时/定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在java项目里正确使用redis的姿势。本课程的目标就在于带领各位小伙伴一起学习、攻克redisson,更好地巩固自己的核心竞争力,而至于跳槽涨薪,自然不在话下!  课程内容: 说起redisson,可能大伙儿不是很熟悉,但如果说起redis,想必肯定很多人都晓得。没错,这家伙字如其名,它就是架设在redis基础上的一款综合性的、新型的中间件,号称是java企业级应用开发中正确使用redis的姿势/客户端实例。 它是架设在redis基础之上,但拥有的功能却远远多于原生Redis 所提供的,比如分布式对象、分布式集合体系、分布式锁以及分布式服务调度等一系列具有分布式特性的对象实例… 而这些东西debug将在本门课程进行淋漓尽致的介绍并实战,除此之外,我们将基于spring boot2.0搭建的多模块项目实战典型的应用场景:对象存储、数据字典、短信发送、实时/定时邮件发送、布隆过滤器、限流组件、分布式服务调度....课程大纲如下所示: 下面罗列一下比较典型的核心技术栈及其实际业务场景的实战,如下图所示为redisson基于订阅-发布模式的核心技术~主题Topic的实际业务场景,即实时发送邮件: 而下图则是基于“多值映射MultiMap”数据结构实战实现的关于“数据字典”的缓存管理: 除此之外,我们还讲解了可以与分布式服务调度中间件dubbo相媲美的功能:分布式远程服务调度,在课程中我们动手搭建了两个项目,用于分别充当“生产者”与“消费者”角色,最终通过redisson的“服务调度组件”实现服务与服务之间、接口与接口之间的调用!  课程收益: (1)认识并掌握redisson为何物、常见的几种典型数据结构-分布式对象、集合、服务的应用及其典型应用场景的实战; (2)掌握如何基于spring boot2.0整合redisson搭建企业级多模块项目,并以此为奠基,实战企业级应用系统中常见的业务场景,巩固相应的技术栈! (3)站在项目管理与技术精进的角度,掌握对于给定的功能模块进行业务流程图的绘制、分析、模块划分、代码实战与性能测试和改进,提高编码能力与其他软实力; (4)对于Java微服务、分布式、spring boot精进者而言,学完本课程,不仅可以巩固提高中间件的实战能力,其典型的应用场景更有助于面试、助力相关知识点的扫盲! 如下图所示: 关键字:Spring Boot,Redis,缓存穿透,缓存击穿,缓存雪崩,红包系统,Mybatis,高并发,多线程并发编程,发送邮件,列表List,集合Set,排行榜,有序集合SortedSet,哈希Hash ,进阶实战,面试,微服务、分布式 适用人群:redisson学习者,分布式中间件实战者,微服务学习者,java学习者,spring boot进阶实战者,redis进阶实战者
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值