首页 > 其他分享 >【Quarkus技术系列】打造基于Quarkus的云原生微服务框架实践(1)

【Quarkus技术系列】打造基于Quarkus的云原生微服务框架实践(1)

时间:2023-08-13 11:33:45浏览次数:96  
标签:原生 Java 框架 编译器 Quarkus 应用 C2 Graal

推荐超值课程:点击获取

前提介绍

本系列文章主要讲解如何基于Quarkus技术搭建和开发"专为Kubernetes而优化的Java微服务框架"的入门和实践,你将会学习到如何搭建Quarkus微服务脚环境及脚手架,开发Quarkus的端点服务,系统和应用层级的配置介绍与Quarkus的编程模型分析,创建Quarkus的应用Uber-jar文件以及集成到Kubernetes的环境中。

  1. 学习Quarkus的云原生微服务的零基础搭建和开发实践
  2. 分析Quarkus的编程模型以及与Kubernetes环境进行集成

面向的人群

Java软件开发人员、系统架构师、微服务开发爱好者、运维部署人员等。

目前的状况

近几年由于云原生技术的普及,越来越多的用户开始使用容器来运行微服务应用,随着微服务的快速发展,spring全家桶已然成为了java框架的事实标准,包括单体应用使用的spring Framework和springboot,微服务间服务治理框架spring cloud,生态系统完善,各种组件层出不穷。

Java云原生化痛点

  • 轻量化容器技术的诞生促使JVM服务变得更加臃肿
    • 微服务架构的引入,使我们的服务颗粒度变得越来越小,轻量且能快速启动的应用能够更好的适应容器化环境。 以我们目前常规的Spring Boot应用来说,一般Restful服务的jar包大概是30M左右,如果我们将JDK以及相关应用打包成docker镜像文件大概是140M左右。
    • 常规的Go语言的可执行程序生成镜像包一般不会超过50M。如何让臃肿的Java应用瘦身使他易于容器化,成为Java应用云原生化需要解决的问题。
  • 轻量化容器技术的诞生促使JVM服务内容使用量变得过大
    • JVM对于内存的使用量变的越来越大,会促使FullGC的过多甚至OOM。
  • SpringBoot的微服务应用启动的速度越来越慢(JVM启动速度)
    • 从JVM启动到真的应用程序执行需要经历VM加载,字节码文件加载,以及JVM为了提升效率,借助JIT(just in time)及时编译技术对解释执行的字节码进行局部优化,通过编译器生成本地执行代码的过程,同时还需要加上了JVM内部垃圾回收所耗费的时间。

典型的Java应用加载时间一般都是秒级起步,如果遇到比较大的应用初始花费几分钟都是正常的。 以往由于我们很少重新启动Java应用,Java应用启动时间长的问题一般很少暴露出来。

  • 但是在云原生应用场景下,随着粒度变的非常细,所以导致部署频率过于频繁
    • 我们会经常不断重启应用来实现滚动升级或者无服务应用场景。 Java应用启动时间长的问题就变成了Java应用云原生化亟待解决的问题。

Quarkus的介绍

  • Quarkus定位为GraalVM和OpenJDK HotSpot量身定制的Kubernetes Native Java框架。
  • Quarkus是红帽开源的项目,借助开源社区的力量,通过对业界广泛使用的框架进行了适配,并结合云原生应用的特点,提供了一套端到端的Java云原生应用解决方案。
  • 虽然开源时间较短,但是生态方面也已经达到可用的状态,自身包含扩展框架,已经支持像Netty、Undertow、Hibernate、JWT等框架,足以用于开发企业级应用,用户也可以基于扩展框架自行扩展。

向原生迈进

对需要长时间运行的应用来说,由于经过充分预热,热点代码会被HotSpot的探测机制准确定位捕获,并将其编译为物理硬件可直接执行的机器码,在这类应用中Java的运行效率很大程度上是取决于即时编译器所输出的代码质量。

HotSpot虚拟机中包含有两个即时编译器,分别是编译时间较短但输出代码优化程度较低的客户端编译器(简称为C1)以及编译耗时长但输出代码优化质量也更高的服务端编译器(简称为C2),通常它们会在分层编译机制下与解释器互相配合来共同构成HotSpot虚拟机的执行子系统的。

新一代即时编译器(Graal VM)

自JDK 10起,HotSpot中又加入了一个全新的即时编译器:Graal编译器,看名字就可以联想到它是来自于前一节提到的Graal VM,Graal编译器是作为C2编译器替代者的角色登场的。

C2编译器的问题

C2的历史已经非常长了,可以追溯到Cliff Click大神读博士期间的作品,这个由C++写成的编译器尽管目前依然效果拔群,但已经复杂到连Cliff Click本人都不愿意继续维护的程度。

Graal编译器本身就是由Java语言写成,实现时又刻意与C2采用了同一种名为"Sea-of-Nodes"的高级中间表示(High IR)形式,使其能够更容易借鉴C2的优点。

Graal编译器比C2编译器晚了足足二十年面世,有着极其充沛的后发优势,在保持能输出相近质量的编译代码的同时,开发效率和扩展性上都要显著优于C2编译器,这决定了C2编译器中优秀的代码优化技术可以轻易地移植到Graal编译器上,但是反过来Graal编译器中行之有效的优化在C2编译器里实现起来则异常艰难。

Graal编译器

Graal的编译效果短短几年间迅速追平了C2,甚至某些测试项中开始逐渐反超C2编译器。

Graal能够做比C2更加复杂的优化,如"部分逃逸分析"(Partial Escape Analysis),也拥有比C2更容易使用"激进预测性优化"(Aggressive Speculative Optimization)的策略,支持自定义的预测性假设等等。

Graal编译器尚且年幼,还未经过足够多的实践验证,所以仍然带着"实验状态"的标签,需要用开关参数去激活,这让笔者不禁联想起JDK 1.3时代,HotSpot虚拟机刚刚横空出世时的场景,同样也是需要用开关激活,也是作为Classic虚拟机的替代品的一段历史。

Graal编译器未来的前途可期,作为Java虚拟机执行代码的最新引擎,它的持续改进,会同时为HotSpot与Graal VM注入更快更强的驱动力。

GraalVM的总结分析

GraalVM:JVM为了提升效率,借助JIT及时编译技术对解释执行的字节码进行局部优化,通过编译器生成本地执行代码提升应用执行效率。

GraalVM是Oracle实验室开发的新一代的面向多种语言的JVM即时编译器,在性能以及多语言互操作性上有比较好的表现。与Java HotSpot VM相比,Graal借助内联,逃逸分析以及推出优化技术可以提升2至5倍的性能提升。

GraalVM提供的静态编译功能,只能针对其编译时能够看得的封闭世界进行优化,对于那些使用了反射、动态加载、以及动态代理的代码是无能为力的。

  • 为了能让我们日常的Java应用能够正常运行起来,需要我们对应用所使用到的框架和类库进行相关修改适配。
  • 由于Java代码所使用的类库很多,这部分的工作量还是相当巨大的,虽然GraalVM已经推出超过一年多的时间,但是还是很少见到大规模Java应用转移到这个平台之上。

分享资源

资源分享
扫码关注发送:资源 获取以上资源
字节技术

标签:原生,Java,框架,编译器,Quarkus,应用,C2,Graal
From: https://www.cnblogs.com/3shu/p/17626305.html

相关文章

  • 【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云
    推荐超值课程:点击获取云原生时代下的Java"拯救者"在云原生时代,其实Java程序是有很大的劣势的,以最流行的springboot/springcloud微服务框架为例,启动一个已经优化好,很多bean需要lazyload的application至少需要3-4秒时间,内存需要几百M,业务逻辑稍微复杂一点点,没有1G以上的内存是......
  • Go语言gorm框架MySQL实践
    gorm是一个使用Go语言编写的ORM框架。文档齐全,对开发者友好,支持主流数据库。我最近在补齐Go语言各类基础的框架和操作库的知识,终于进展到了数据库阶段,搜资料的时候基本都是推荐这个框架,可见其之流行程度。在不断尝试练习之后,总结了一些经验和使用方式,供初学者参考。在之前使用Jav......
  • 基于ssm框架的小区物业管理系统的设计与实现
    随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。小区物业管理系统,主要的模块包括查看首页、个人中心、业主管理、新闻公告管理、楼房信息管理、业主投诉管理、业主报修管理、投诉处理管理、维修回复管理、缴费信息管理......
  • Java源码解析-重点集合框架篇
    Java源码解析,集合篇一:故事背景二:数据结构2.1线性结构2.2非线性结构三:集合分类3.1结构图四:详细分析4.1List4.1.1ArrayList4.1.1.1底层结构4.1.1.2主要特点4.1.2LinkedList4.1.2.1底层结构4.1.2.2主要特点4.1.3Vector和Stack4.1.3.1Vector4.1.3.1Stack五:总结提升一:故......
  • java之手搓简单ORM框架--SQL的DELETE
    1.手搓简单SQL增删改查框架-删除1.1创建简单类,并使用泛型类,这里可能使用到之间写的三篇知识的内容,如果不了解的小伙伴可以去java高级之泛型java高级之映射java高级之反射当然,前提是必须要把数据库相关连接弄好,这里会专门出一篇java之jdbc现在咱们继续手搓框架开始叭!1.2前......
  • quarkus依赖注入之十三:其他重要知识点大串讲(终篇)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本篇是《quarkus依赖注入》系列的终篇,前面十二篇已覆盖quarkus依赖注入的大部分核心内容,但依然漏掉了一些知识点,今天就将剩下的内容汇总,来个一锅端,轻松愉快的结......
  • java之手搓简单ORM框架--SQL的UPDATA
    1.手搓简单SQL增删改查框架-更改1.1创建简单类,并使用泛型类,这里可能使用到之间写的三篇知识的内容,如果不了解的小伙伴可以去java高级之泛型java高级之映射java高级之反射当然,前提是必须要把数据库相关连接弄好,这里会专门出一篇java之jdbc现在咱们继续手搓框架开始叭!由于上......
  • java之手搓简单ORM框架--SQL的INSERT
    1.手搓简单SQL增删改查框架-插入1.1创建简单类,并使用泛型类,这里可能使用到之间写的三篇知识的内容,如果不了解的小伙伴可以去java高级之泛型java高级之映射java高级之反射当然,前提是必须要把数据库相关连接弄好,这里会专门出一篇java之jdbc现在直接手搓框架开始叭!1.2准备工......
  • android_HAL框架源码分析
    ANDROIDHALAlbertLuoandroidHAL是什么?为什么有它?硬件抽象层是介于android内核kernel和上层之间的抽象出来的一层结构。他是对linux驱动的一个封装,对上层提供统一接口,上层应用不必知道下层硬件具体怎么实现工作的,它屏蔽了底层的实现细节。它在整个android架构中的位置如下图所......
  • Django原生分页功能的实现
    分页类的封装"""如果想要以后使用分页,需要以下两个步骤:在视图函数:defcustomer_list(request):#这里是获取搜索form表单提交的搜索关键字keyword=request.GET.get('keyword','').strip()#使用Q对象进行或查询con=Q()ifkeyword:con.c......