【Quarkus技术系列】「序章」打造基于Quarkus的云原生微服务框架实践的理论知识基础

news2025/1/20 3:57:14

前提介绍

本系列文章主要讲解如何基于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/106052.html

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

相关文章

String类介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一.String类的简单解释二.String类的方法介绍2.1 字符串的声明2.2 字符串的比较第一种比较方法第二种的比较方式第三种比较方式第四种比较的方式2.3字符串的查找…

架构师必读 —— 逻辑模型(12)

头脑风暴的5项原则 为了得出更好的想法,进行发散思维是很重要的,巧妙地运 用头脑风暴来尽情地发散吧!头脑风暴的秘诀就是自由想象。如果因为害怕被骂而怯于表达自己的想法,或者不好意思在人前发言,好不容易想到的点子也…

6.npm

目录 1 下载包 2 下载包非最新的版本 3 package.json 4 一次安装多个包 5 删除 node_modules 6 一次安装项目中的所有包 7 卸载包 8 将包放入devDependencies中 9 换源 9.1 手动换源 9.2 工具换源 10 全局下载 10.1 下载与卸载 10.2 一些常用的全局…

QUIC协议

一 简介 QUIC(Quick UDP Internet Connection)是Google提出的一个基于UDP的传输协议,因其高效的传输效率和多路并发的能力,已经成为下一代互联网协议HTTP/3的底层传输协议。除了应用于Web领域,它的优势同样适用于一些通用的需要低延迟、高吞…

Android入门第53天-在Android手机里使用SQLite内嵌式数据库

介绍 Android内带SQLite内嵌式数据库了。这对于我们存储一些更复杂的结构化数据带来了极大的便利。比如说我们要存储应用内的常用联系人,购物车暂存信息,常量。必竟从xml或者是json里取数据都没有一条Select语句来得简单。 SQLite常用有五种数据类型: …

第04讲:Redis消息的发布和订阅

一、什么是消息的发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Tip:Redis 客户端(redis-cli)可以订阅任意数量的频道。 二、Redis的发布和订阅的原理 客…

ssh端口转发

ssh端口转发ssh端口转发Centos7关闭IPV6sshd服务端sshd_config配置调整(非必需)优化sshd_config配置(非必需)调整ssh客户端配置~/.ssh/config ---必须ssh终端转发socks5端口ssh终端命令行转发到socks5ssh_config配置端口转发SOCKS5使用ssh将后端的服务端口转发到localssh端口转…

selenium网络爬虫去哪儿机票利用performance获取日志截获加载的xhr,ajax,js等数据

这次练习获取的网站使用了许多反爬技术: 1.html页面使用了css字体偏移 2.xhr加载有webdriver反爬检测 3.请求接口使用了多项加密参数以及cookie验证 4.部分js代码用了ob混淆 一开始只是想学习练手一下css偏移学习后是解决了,但想获取页面源代码时候遇…

Apache Traffic Server 存在拒绝服务漏洞

漏洞描述 Apache Traffic Serve(ATS) 是一个开源的 HTTP/1.1 和 HTTP/2 缓存代理服务器,uri_signing 是 ATS 的一款 URI 签名插件,用来阻止所有不具有有效 JWT 的请求。 Apache Traffic Server 的受影响版本中存在拒绝服务漏洞&…

人工神经网络 ANN 基础概念

目录 一:简介 二:感知器 三:权重和阈值 四:多层前馈网络 五:BP神经网络 一:简介 机器学习是实现人工智能的方法,深度学习是实现机器学习的技术。在实现人工智能时需要人工辅助(半自动)&…

图像分类:Pytorch图像分类之--LetNet模型

文章目录前言LetNet简介程序的实现model.py的实现LetNet模型操作流程经过Conv卷积后输出尺寸的计算公式如下Conv2d()函数介绍MaxPool2d()函数介绍Tensor的展平:view()train.py导入数据集加载数据集参数设置训练数据保存模型train_tool.pypred…

前端基础(十四)_隐藏元素的方法

隐藏元素的方法 1、display 通过display:none来控制元素隐藏 不使用&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

以数据驱动的自动驾驶时代,还有多远?丨曼孚科技

自动驾驶即将来到数据驱动时代。 在经历了硬件(激光雷达)、软件(多传感器融合)等技术革新后&#xff0c;自动驾驶迎来了第三波浪潮。 去年&#xff0c;除造车新势力外&#xff0c;国内一批主机厂吉利、上汽、广汽等&#xff0c;纷纷加大了自动驾驶数据标注业务投入。到今年&a…

参加 Spartacus 开源项目开发时需要注意的一些编程规范

我们使用 NgRx 存储来管理 Spartacus 功能中的全局应用程序状态。 使用 NgRx 在性能、更好的可测试性和易于故障排除、方面具有明显的优势。 除非有令人信服的理由不这样做&#xff0c;否则在某项 feature 的开发里&#xff0c;请总是使用 Rgrx 来管理状态。 使用 Store 并不…

PS CS6视频剪辑基本技巧(二)视频剪接和添加图片

上一讲&#xff0c;介绍了PS CS6可以实现视频剪接、添加图片、添加声音、添加字幕、添加logo、添加动画等6种功能&#xff0c;今天这讲介绍一下视频剪接和添加图片这两个功能。 目录 一、基本操作 1、打开时间轴窗口 2、创建时间轴 二、视频剪接 1、打开已存在的视频文件…

c++visualStudio学习笔记

文章目录5 c如何工作5.1include5.2main5.3 <<5.3 linker链接器7 C链接器linker是如何工作的7.1案例10 头函数10.1案例10.2头文件10.3pragma once34const34.1 常数34.2指针34.3类和方法34.4引用34.5mutable5 c如何工作 源文件就是文本文件转化到可执行的二进制文件或者程…

MySQL自增主键一定是连续的吗

测试环境&#xff1a; MySQL版本&#xff1a;8.0 数据库表&#xff1a;T &#xff08;主键id&#xff0c;唯一索引c&#xff0c;普通字段d&#xff09; 如果你的业务设计依赖于自增主键的连续性&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错…

一个大二计算机学生的学期总结(2022末年)

学期总结前言一、本学期的自我反思&#xff08;1&#xff09;返校之前在家期间练习题黑马头条教学管理平台Ajax练习仿写JD&#xff08;2&#xff09;返校之后在学校期间练习题本学期课程hbase、hive、Hadoop一直奉行的话前言 ☀️东流逝水&#xff0c;叶落纷纷&#xff0c;荏苒…

初级程序员 中级程序员 高级程序员级别划分

网络上众说纷纭&#xff0c;大都站立在对某一技术的知识掌握量上来界定&#xff0c;或者有些人说着说着&#xff0c;发现无法自圆其说&#xff0c;然后就说这三种人就是一种叫法&#xff0c;你觉得你是高级你就高级了&#xff0c;从概念上讲&#xff0c;这三者之间必然有质的区…

20221221查看RK3588开发板的LCD屏幕的分辨率(1536x2048)

20221221查看RK3588开发板的LCD屏幕的分辨率 2022/12/21 18:46 方法一&#xff1a;adb/串口 console:/ $ console:/ $ [ 37.217258][ T57] vbus5v0_typec: disabling [ 37.217707][ T57] vcc3v3_pcie20: disabling console:/ $ console:/ $ console:/ $ dumpsys wi…