quarkus云原生微服务-技术知识理解 weir 2022-04-05 21:46:22.0 java,quarkus 595  quarkus云原生微服务框架-基础知识。我不知道这样定义会不会有妥当,但是这是目前我所认知的对quarkus最直观的理解。 大概有十多年了吧,在国内spring绝对是java应用系统领域的首选框架,似乎我们都习惯了spring,无论是学习还是求职,这期间也出来不少的人写的类似的框架,不管是想展示自己的水平还是自己真的有水平,大概率都无法撼动spring体系的诱人。 当然我并不想高谈阔论的说很多quarkus多么的优秀,这其实是徒劳的,更多地还是自己的理解和认知,说起基础其实要分不同人群:学生和有一定开发经验的人。对于学生来说并不存在困难而是认知和热情,有这两点学什么都能学进去;而对于有一定经验的开发者来说反倒不是那么的容易接收全新玩法的东西,这一点我也很有同感。  quarkus的基础知识确实大部分都是非常的新,我指的这个新是有相对性的。vert.x、SmallRye、RESTEasy、MicroProfile这些对国内开发者来说确实很新。  vert.x java反应式编程范式框架性能的天花板,无论你是否了解他出现已经至少6、7年了,为什么无人问津,更没有多少人宣传使用,最近这两年才有人浮出水面来或多或少的普及也好,这里面更大的原因可能出来**反应式编程范式**,可能会吓住很多人你虽然性能很高但是望而却步。  说完vert.x我要先把MicroProfile说了但是之前我还要提及的是JAKARTA EE,JAKARTA EE有人了解么?我想会有你可能是看了spring官方的博客说spring6和springboot3开始要基于java17和JAKARTA EE规范。JAKARTA EE就是J2EE我想就这对于很多人来说都是陌生的,因为spring体系从来都不会拿J2EE出来说事情,spring彻底把败了J2EE至少在国内是这样,但是spring体系里面一直有J2EE的规范存在,只是大家不太关注而已。 我个人理解是在java web 领域vert.x把web请求的性能做到了极致, 其一底层归功于netty的强大性能优势,其二是对web的完美异步(反应式编程能力)请求封装, 换句话说就是对多线程的利用达到了极致。 vert.x在国内没有火起来主要是对反应式编程的理解和认识不够, 更为突出的是思想的转变没有国外同行那么敏锐, 纵然反应式编程给开发管理测试带来全新的思路模式很难接受,但是反应式编程思想也出来好多年了, 国内几乎纹丝不动,大厂默默地进行着反应式异步改造,从来没有看到在这方面的呼声和倡导, 更没有呼唤大家接触异步反应式编程的呼声,这就是vert.x 出来这么多年在国内平平无奇的现状。 vert.x目前在国内学习成本和理解难度那就可想而知了,没有长期的技术铺垫可能入门都是困难的, B站寥寥无几的几个教程也是轻轻点水,在我的认知里面反应式异步编程如果让大家熟悉像阻塞编程一样的容易接受,就需要把api设计的足够让人能理解,这也是我后面会介绍smallrye并使用的一些感受。   SmallRye这个绝对的全新的,基本是专门对vert.x和quarkus、还有就是MicroProfile,目标就是让反应式编程更加容易一点,反应式编程其实是个不好讲的话题,spring Reactive 也出来来几年了国内用的基本也是非常少,还是我说的大家排斥反应式编程的原因很多,但是我总结就是两点:其一API好不好理解和使用,说白了就是写代码,你定义一个方法开发者好不好理解好不好使用,就像背单词一样这个大家最有体会,说你智商多高api你不需要记忆么?不需要理解么?对不对?其二我本来觉得不是问题有人提出来测试或者调试代码的问题,大家都知道反应是编程从url请求完之后就是异步的这对调试带来了新的麻烦。 smallrye可以理解为专门为反应式异步编程设计的各种api类库, 比如hibernate怎么来做反应式异步编程,web api接口怎么开发, 我们的业务代码怎么结合反应式异步编程的,微服务之间的调用,容错,消息中间件等等 你会发现它是一套完整的涉及到单应用开发和微服务开发甚至领域开发的各个层面的异步开发api类库。 可以这么说有了它你的后端服务无论哪个层级都是异步的  RESTEasy我想从名字上可以看出端倪,REST 和 easy 对于开发者来说都不陌生,他就是跟前端打交道的一组工具,GET、POST、PUT、DELET等请求,上传下载,返回json还是文本还是文件还是xml等等。 RESTEasy你可以理解为专门为web的输入输出设计的一套具有restfull风格的web规范类库。 比如url请求 get,post,put,delete等等,还包括上传下载,当然也包括反应式异步编程的支持, 宗旨是处理前端跟后端交互的桥梁作用 相对而言涉及的内容都比较容易理解api作用也比较明晰,你可以理解为springmvc,Struts等框架作用  对于HIbernate/jpa情节很深,十多年前刚学习java框架的时候接触EJB3.0在中国刚刚起步, 就直接学习了JPA技术当然是离不开hibernate的影子, 随后几年hibernate和mybatis争执不休, 说hibernate速度慢的有,开发起来复杂的也有,SQL不好管理的也有等等 再接着就是在某些大厂的宣传下mybatis成了大厂标配,逐渐hibernate被嫌弃, 我也是16年开始做互联网项目开始使用mybatis,但是我刚开始就在寻找在mybatis之上的封装库, 在我的认知里面单表CRUD写sql纯属浪费开发效率,当时我负责的项目就使用上了mybatis-plus 直到18,19年我在成都公司mybatis-plus还被人嫌弃或者说知道它的好处的人不以为然, 但是看看这两年mybatis-plus才更多的被人熟知,感觉很好用很方便,开发速度非常快, 但是我想说的是hibernate/jpa从来都是最佳的选择不管是spring data jpa还是JPA本身。 最后我想说JPA早已融进了DDD思想,DAO层开发不是只有一种模式,架构层级也不是固定不变的, quarkus的Panache是我目前所了解的最高抽象的封装, 把DDD融合的更加灵活,对DAO层做到了几乎完美的程度  netty我本来也不想说的,不是他可有可无而是太重要了,但是对于大部分公司来说netty可能也不是去话大部分精力研究学习的对象,大部分公司会用spring体系都能解决自身问题,研究netty费力不讨好,尽管netty在Java世界里面非常非常的重要,大部分公司不需要关心这么牛逼的底层技术,在netty之上的技术框架用好了就非常的不错了。   到现在我认为quarkus最核心的技术给大家介绍了一下,大家什么感觉? quarkus有哪些特点: 1.低内存消耗 2.快速启动 3.更好的利用多线程(一个 Kubernetes 节点可能运行数百个微服务实例,每个实例可能有多达数百个线程,每个线程消耗 1 兆字节的内存。Quarkus在事件循环上运行其异步、反应式和(默认情况下)传统的线程阻塞命令式 API,这显着减少了线程数量。) 使用Kubernetes ConfigMap(部署到 Kubernetes 的服务可以使用 Kubernetes 4.ConfigMap 进行配置——一个通常挂载到 pod 文件系统的文件。但是,Quarkus 可以无缝地使用 Kubernetes 客户端 API 来访问 ConfigMap,而无需在 pod 中挂载文件系统,从而简化了配置。) 5.公开健康端点(除了支持自定义健康检查外,Quarkus 还内置数据源和消息传递客户端(ActiveMQ 和 Kafka)就绪健康检查,以在这些后端服务不可用时自动暂停流量。) 6.支持 CNCF 项目(CNCF 是云原生计算基金会,负责 Kubernetes 和相关项目的演进,如Prometheus监控(使用 OpenMetrics 格式)和Jaeger(使用 OpenTracing/OpenTelemetry)。) 7.Kubernetes 部署支持(Quarkus 具有对部署到 Kubernetes 的内置支持。它使开发人员能够使用单行 Maven(或 Gradle)命令编译、打包和部署微服务到 Kubernetes。此外,Kubernetes清单是自动生成的,并且可以使用 Java 属性进行自定义。) 8.Kubernetes 客户端 API (Quarkus 包括一个 Java 友好的 API,用于与 Kubernetes 集群交互,支持对任何 Kubernetes 功能的编程访问,以根据企业需求扩展或定制它。) 大家看到这里会发现这完全是一套全新的玩法,如果你对EJB,J2EE这套java企业级规范了解甚少, 你可能会觉得这个学习成本太高了,再加上反应式异步编程更是知道的少之又少,直接可能为望而却步了。 但是你又或多或少的听说或了解反应式异步编程的性能高,内存占用少,启动速度快等诸多云原生的天然优势,又会激起你的兴趣,对于入门不知甚解,我想我这近两年来的感受我能理解大部分人想法和国内目前的现状,就我说掌握的信息和实践出来的效果来说: 1.入门成本非常低,这个怎么说因为只要你有springboot的基础,入门quarkus不是问题。 2.即便是你从来没有用过hibernate/jpa,你的学习成本入门难度也非常低,我就能让你彻底入门,不用什么大佬牛人买什么hibernate/jpa的学习视频 3.目前quarkus综合技术是非常的新和spring体系重合度也非常低,但是有个消息你可能知道了,spring 6和springboot3基本是要基于Jakarta EE 9(j2EE规范)了,也就是说在不久的将来,他们的底层应该是一套规范了。 4.技术应该是多元的,这对生态很重要,没有人会拒绝优秀。 5.不要盲目跟从,时时刻刻保持独立思考的能力。 6.越早学习越好,啥也不说了,你能懂得自然会懂,未来可期。