Java应用的云原生化痛点

Java技术栈作为企业级开发的利器已经发展了快二十多年,大家基于Java技术栈开发了大量的应用。随着云原生架构的普及,越来越多的用户开始使用容器技术来运行微服务应用程序。借助容器技术构建的通用轻量级虚拟机已经帮助我们屏蔽了底层操作系统的差别,JVM的加载Java字节码解释执行所带来的一次编译到处运行优势逐渐变成了劣势。微服务架构的引入,将我们的服务颗粒度变得越来越小,轻量且能快速启动的应用能够更好的适应容器化环境。 以我们目前常规的Spring Boot Java应用来说,一般Restful服务的jar包大概是30M左右, 如果我们将JDK运行时以及相关应用打包成docker镜像文件大概是140M左右。而常规的Go 语言的可执行程序生成镜像包一般不会超过50M。 如何让原有臃肿的Java应用瘦身,易于容器化成为Java应用云原生化需要解决的问题。

上图展示的是一个典型的Java应用各模块执行时间的分布情况,大家可以看到,从JVM启动到真的应用程序执行需要经历VM加载,字节码文件加载,以及JVM为了提升效率,借助JIT(just in time)及时编译技术对解释执行的字节码进行局部优化,通过编译器生成本地执行代码的过程,同时还需要加上了JVM内部垃圾回收所耗费的时间。 这样一来典型的Java应用加载时间一般都是秒级起步,如果遇到比较大的应用初始花费几分钟都是正常的。 以往由于我们很少重新启动Java应用,Java应用启动时间长的问题一般很少暴露出来。但是在云原生应用场景下,我们会经常不断重启应用来实现滚动升级或者无服务应用场景。 Java应用启动时间长的问题就变成了Java应用云原生化亟待解决的问题。

通过GraalVM 提升Java应用执行效率

之前JVM为了提升效率,借助JIT(just in time)及时编译技术对解释执行的字节码进行局部优化,通过编译器生成本地执行代码提升应用执行效率。GraalVM是Oracle实验室开发的新一代的面向多种语言的JVM即时编译器,在性能以及多语言互操作性上有比较好的表现。与Java HotSpot VM相比,Graal借助内联,逃逸分析以及推出优化技术可以提升2至5倍的性能提升。

如果我们能够直接将Java应用编译成本地执行文件,可以极大提升Java应用启动速度同时降低为了支持动态特性而带来的内存消耗。GraalVM项目借助AOT技术为我们提供了native-image工具,能够将大多数的Java代码在不做修改的情况下转换成本地可执行程序。

不幸的是GraalVM提供的静态编译功能,只能针对其编译时能够看得的封闭世界进行优化,对于那些使用了反射、动态加载、以及动态代理的代码是无能为力的。为了能让我们日常的Java应用能够正常运行起来,需要我们对应用所使用到的框架和类库进行相关修改适配。由于Java代码所使用的类库很多,这部分的工作量还是相当巨大的,虽然GraalVM已经推出超过一年多的时间,但是还是很少见到大规模Java应用转移到这个平台之上。

Quarkus介绍

红帽最近开源的Quarkus项目,借助开源社区的力量,通过对业界广泛使用的框架进行了适配工作,并结合云原生应用的特点,提供了一套端到端的Java云原生应用解决方案。

Quarkus

采用扩展(Extension)​quarkus.io

的方式接入第三方的Java库,以最近刚刚release了

1.0.0-M2​github.comapache/camel-quarkus​github.com

为例,针对Apache Camel core 有关加载Camel组件的部分进行

比较大量扩展​github.com

,同时Apache Camel 3.0 也针对组件的动态加载进行了优化。

如何安装使用Quarkus

  • 选择一个适合的IDE
  • 安装JDK 1.8+, 设置 JAVA_HOME
  • 安装GraalVM,设置GRAALVM_HOME
  • 配置C语言开发环境
    • Linux 安装GCC
    • macOS 执行 xcode-select —install
    • windows GraalVM本地编译版本刚刚提供支持,需要按照Windows SDK。
  • 安装Docker
    • 可以编译docker native image

笔者最近基于Quarkus写了两个简单的Web应用 notification-service 和 visitor-service ,后续我会再写一篇文章,把相关的开发细节介绍给大家。值得一提是通过这个docker文件构建的基于alpine构建Linux X86本地镜像不到30M,这应该是我见到过的最小的Java应用的镜像了。
最后附上有关Quarkus的相关资源,希望能够对大家有所帮助。

Quarkus Github​github.comQuarkus - Get Started​quarkus.ioQuarkus - Guides​quarkus.ioquarkusio/quarkus-quickstarts​github.com

java 秒变成时间_使用Quarkus开发Java云原生应用相关推荐

  1. 小程序云开发_小程序开发进入云原生时代 加速构建开发者生态

    2019-11-07 16:44 作为Serverless理念大规模落地的最佳实践,"小程序·云开发"正受到越来越多的关注. 11月7日,在腾讯Techo开发者大会"小程 ...

  2. Java web小项目_个人主页(1)—— 云环境搭建与项目部署

    摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...

  3. 基于 Go 语言开发 Serverless 云原生应用

    Golang 无疑是云原生领域开发的首选开发语言,继 Docker.Kubernetes 等大作之后 Knative 又是一个基于 Go 语言的云原生范式.Knative 提供了一整套云原生应用的 S ...

  4. java获取秒时间_关于java:以秒为单位获取当前时间

    有没有办法在几秒钟内获得当天的当前时间? 注意我问的是当天的时间,而不是UTC时间. 我想要的是0到86,400(12:00 AM - 11:59 PM)之间的值(以秒为单位). 我正在开发一个每天工 ...

  5. 用java编写打印时间_编写一个java程序,读取系统时间,然后将时间用中文输出...

    展开全部 import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.Calendar; ...

  6. java下拉菜单_薪资对比:Java开发和web前端薪资哪个好

    Web前端开发和Java开发哪个薪资更高,Web前端开发和Java开发发展前景更好? 互联网行业飞速发展,因此有很多小伙伴想要进入IT行业分一杯羹,但是学什么技术更好,哪一个语言的就业薪资更高,就成了 ...

  7. 李兴华java视频在线观看_李兴华Java开发实战经典视频教程_IT教程网

    资源名称:李兴华Java开发实战经典视频教程 资源目录: [IT教程网]010201_[第2章:简单Java程序]_简单Java程序 [IT教程网]010301_[第3章:Java基础程序设计]_Ja ...

  8. 李兴华java实战经典视频_李兴华Java开发实战经典视频教程

    资源名称:李兴华Java开发实战经典视频教程 资源目录:[一品资源网]010201_[第2章:简单Java程序]_简单Java程序[一品资源网]010301_[第3章:Java基础程序设计]_Java ...

  9. editplus java语法_用Editplus开发Java

    原标题:用Editplus开发Java ☆ 准备工作 ①,已安装好jdk,同时配置系统变量(3个,JAVA_HOME,PATH,CLASSPATH) ②,电脑已安装Editplus,并做好设置. ☆ ...

最新文章

  1. c++ vector 存放指针_STL-C++ vector部分
  2. mysql的in查询是可以用到索引吗?亲测详解
  3. 编程之美-只考加法的面试题整理
  4. GitHub 上 6 款牛哄哄的后台模板
  5. Java对象容器——Hash表/散列表
  6. 考系统架构设计师必看--《软件工程》网页教程
  7. excel 单元格求和大于某个数后返回列号_Excel最常用的几个函数,我都帮你整理好了!...
  8. Python操作Memcache
  9. Python 多线程中死锁了怎么办?
  10. 实录:VCS双机使用DiskReservation资源导致多路径失效
  11. ncf 推荐系统_TopN物品推荐算法评测设置回顾
  12. Swift中的willSet与didSet
  13. 新视角 | 新形势下工厂设备管理的5大误区
  14. 【综述】植物防御假说——Out of the quagmire of plant defense hypotheses
  15. Apache Kylin使用总结
  16. 解决Duplicate entry '……
  17. 蓝桥杯:排列字母(C++)
  18. Mysql 存储引擎
  19. Problem C: 零起点学算法82——数组中查找数
  20. php 框架注解,laravel框架常用的注解

热门文章

  1. 书写css伪类时冒号前或后多个空格导致该规则失效-softbar
  2. 2009-08-02 XEIM 2.8 beta 迅速发布
  3. 你的导师是哪种类型?
  4. xgboost算法_XGBoost算法可能会长期占据你的视野!
  5. 组合数学 算法导论 具体数学 博弈论 计算机科学数学
  6. 36产生用户恶情绪和报复情绪的原因
  7. 【PMP学习笔记】:二、项目运行环境
  8. Composer报错Could not find a matching version of package解决方式
  9. 求一列数据中的波峰_用python进行数据分析的套路
  10. 【分享-EasyRecovery】删除的文件找不回?不存在的!