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

news2024/11/24 11:23:35

前提介绍

本系列文章主要讲解如何基于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应用转移到这个平台之上。

分享资源

资源分享
获取以上资源请访问开源项目 点击跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/871191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb_总体介绍

文章目录 1.总括2.JavaWeb项目架构 1.总括 2.JavaWeb项目架构

【Linux】DNS协议——应用层

DNS协议 DNS(Domain Name System,域名系统)协议,是一个用来将域名转化为IP地址的应用层协议。 DNS背景 TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。但IP地址是一长串数字,并不…

阿里云账号注册流程_多种注册方法_图文详解

阿里云账号怎么注册?阿里云账号支持手机号注册、阿里云APP注册、支付宝和钉钉多种注册方式,账号注册后需要通过实名认证才可以购买或使用云产品,阿里云百科来详细说下不同途径注册阿里云账号图文流程: 目录 阿里云账号注册流程 …

利用python实现网络设备配置批量上传和批量下载功能

利用python实现网络设备配置批量上传和批量下载功能 利用ensp实现网络设备和物理主机互通配置网络设备配置批量上传功能配置批量下载功能常见问题 提示: 本文章代码所使用目录均使用相对目录,只需将配置存放目录和文件下载目录(已用符号标出…

Java:正则表达式书写规则及相关案例:检验QQ号码,校验手机号码,邮箱格式,当前时间

正则表达式 目标:体验一下使用正则表达式来校验数据格式的合法性。需求:校验QQ号码是否正确,要求全部是数字,长度是(6-20)之间,不能以0开头 首先用自己编写的程序判断QQ号码是否正确 public static void main(String[] args) {Sy…

走近ChatGPT与类似产品:原理解析与比较

目录 1. 引言1.1 技术的进步与自然语言处理1.2 ChatGPT的崭新概念 2. ChatGPT: 一览众山小2.1 GPT-3.5架构简介2.2 ChatGPT的学习与训练2.3 文本生成的工作原理 3. 市场上类似产品调研3.1 对话式人工智能产品分类3.2 文心一言3.3 讯飞星火 4. 应用前景与局限性展望4.1 ChatGPT的…

STM32 F103C8T6学习笔记6:IIC通信__驱动MPU6050 6轴运动处理组件—一阶互补滤波

今日主要学习一款倾角传感器——MPU6050,往后对单片机原理基础讲的会比较少,更倾向于简单粗暴地贴代码,因为经过前些日子对MSP432的学习,对原理方面也有些熟络了,除了在新接触它时会对其引脚、时钟、总线等进行仔细一些的研究之外…

790. 多米诺和托米诺平铺

题目描述&#xff1a; 主要思路&#xff1a; class Solution { public:int numTilings(int n) {long long f[n][4],mod1e97;f[0][0]1;f[0][1]f[0][2]0;f[0][3]1;for(int i1;i<n;i){f[i][0]f[i-1][3];f[i][1] (f[i-1][0]f[i-1][2])%mod;f[i][2] (f[i-1][0]f[i-1][1])%mod;f…

嵌入式技术,就在你的手边!

嵌入式技术&#xff0c;听起来多么高大上的名词&#xff0c;同时它也确实是当今信息技术的前沿领域&#xff0c;但这并不意味着它就距离我们很遥远。 事实恰恰相反&#xff0c;在当今科技发展迅猛的时代&#xff0c;嵌入式技术成为了人们生活中不可或缺的一部分。它以其小巧、高…

手撕Java集合——链表

链表 一、链表概念特性二、不带头单向非循环链表实现&#x1f351;1、定义结点&#x1f351;2、打印链表&#x1f351;3、使用递归逆序打印链表&#x1f351;4、头插&#x1f351;5、尾插&#x1f351;6、指定位置插入&#x1f351;7、查找是否包含关键字key是否在单链表当中&a…

C#,数值计算——Dynpro的计算方法与源程序

给定向量nstate&#xff0c;其整数值是每个状态中的状态数阶段&#xff08;第一和最后阶段为1&#xff09;&#xff0c;并给定函数成本&#xff08;j&#xff0c;k&#xff0c;i&#xff09;返回在阶段i的状态j和的状态k之间移动的成本阶段i1&#xff0c;此例程返回与nstate长度…

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(8)

1005 0 vs 1 双端队列暴力模拟,时间复杂度为O(n*T) 首先预处理0的右边第一个0的下标,1的右边第一个1的下标,0的左边第一个0的下标,1的左边第一个1的下标 然后进行模拟 如果当前是zero的轮次,那么就看双端队列的两端 如果两头都是1,那么one赢,如果1头是0,1头是1,那么只能选择0 如…

概率图模型(Probabilistic Graphical Model,PGM)

概率图模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;&#xff0c;是一种用图结构来描述多元随机变量之间条件独立性的概率模型。它可以用来表示复杂的概率分布&#xff0c;进行有效的推理和学习&#xff0c;以及解决各种实际问题&#xff0c;如图…

计算机基础概论

一、计算机的组成 1.计算机组成的五大部件 &#xff08;1&#xff09;运算器&#xff1a;也叫算术逻辑单元&#xff0c;完成对数据的各种常规运算&#xff0c;如加减乘除&#xff0c;也包括逻辑运算&#xff0c;位移&#xff0c;比较等。 &#xff08;2&#xff09;控制器&a…

掌握Python的X篇_34_Python朗读文字

各种广告中说python是人工智能的主宰&#xff0c;其实这更多是噱头的成分&#xff0c;但是python确实可以做很多的事情&#xff0c;本篇将会介绍利用pythonAI平台来合成声音。今天将会用到的是百度。 文章目录 1. baiToVoice2. 注册appid3. 合成代码 1. baiToVoice 使用百度A…

详解Mysql——第一篇/连接查询

mysql的连接查询&#xff0c;相必在网上都能找到很多的教程&#xff0c;博主今天不做老话常谈&#xff0c;不走重复路线 1.建表 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编…

ubuntu18.04下配置muduoC++11环境

1.安装muduo依赖的编译工具及库 Cmake sudo apt-get install cmakeBoost sudo apt-get install libboost-dev libboost-test-devcurl、c-ares DNS、google protobuf sudo apt-get install libcurl4-openssl-dev libc-ares-dev sudo apt-get install protobuf-compiler libp…

【单片机毕业设计2-基于stm32c8t6的智能台灯/书桌系统】

【单片机毕业设计2-基于stm32c8t6的智能台灯/书桌系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇2 基于stm32的智能台灯/智能书桌系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖&#xff08;有需可点击…

JavaWeb中Json传参的条件

JavaWeb中我们常用json进行参数传递 对应的注释为RequestBody 但是json传参是有条件的 最主要是你指定的实体类和对应的json参数能否匹配 1.属性和对应的json参数名称对应 2.对应实体类实现了Serializable接口&#xff0c;可以进行序列化和反序列化&#xff0c;这个才是实体类转…

【Minecraft】Fabric Mod开发完整流程4 - 自定义物品方块以及食物、燃料

目录 自定义物品与方块自动侦测矿藏工具工具功能实现执行结果 自定义音乐方块自定义食物自定义燃料 自定义物品与方块 自动侦测矿藏工具 探测器纹理下载地址&#xff1a; https://url.kaupenjoe.net/mbkj57/assets 众所周知&#xff0c;正经人永远不喜欢常规套路挖矿&#xff0…