开源中间件通迅(创刊卷,第1期)

Posted 开源中间件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源中间件通迅(创刊卷,第1期)相关的知识,希望对你有一定的参考价值。

开源中间件通迅小报试刊。

汇集整理业界重要的开源中间件技术新闻,不定期分享好书精要,优秀技术文章和大会主题内容。

帮助开发者掌握一手的知识和技术动向。



技 术 新 闻


Dubbo项目孵化毕业成为Apache顶级项目


Dubbo开源项目

(https://github.com/apache/dubbo)

是阿里巴巴研发的 Java RPC 框架,在国内得到了广泛的应用。


Dubbo 2.X基于Netty网络框架,利用Spring容器进行远程服务调用。可以通过Zookeeper等进行服务注册和发现,有一套较完备的服务治理实现,通过自身实现的dubbo协议,可以做到高效的网间方法调用和数据传输。作为一款高效的 Java RPC 框架,很好的弥补了业内纯Java实现的高效互联网级别RPC框架的不足。


在经过约两年的开发几乎停滞后,阿里终于又重新开发维护Dubbo项目,并提交给Apache组织进行孵化。

5月份,Dubbo成功毕业,成为Apache顶级项目。

Dubbo正在积极研发3.X版本(https://github.com/apache/dubbo/tree/3.x-dev),同时也发布了其他语言的Dubbo框架,比如Go语言

(https://github.com/dubbo/go-for-apache-dubbo)。


GraalVM发布第一个正式版19.0.0


GraalVM(https://www.graalvm.org)是Oracle公司开发的跨语言的通用虚拟机,经过16个RC版本后,终于发布了第一个正式版,命名为19.0.0。


Graal项目目前基于OpenJDK8开发,下载的SDK是一个完整的JDK版本,可以使用GraalVM作为 JIT 编译器,是由Java语言开发的。


GraalVM提供了一个虚拟层,所支持的若干种语言,如javascript, Ruby, R, Python等,都可以和基于JVM的宿主语言运行在JRE中,对解释性语言的执行效率有很大的提升,由Truffle语言实现框架实现。


可以执行LLVM编译出的二进制代码,sulong就是高性能的LLVM二进制字节解释器。一个场景是C/C++写成的程序,通过Clang工具产生LLVM字节码,即可以运行在GraalVM中和Java语言交互。


Substrate VM是黑科技,可以对Java字节码进行AOT(ahead-of-time)编译,即编译成本地可执行代码。所使用的工具为native-image,但19版本发布时,开发组不知为何将这个工具从发布包中移除,需要手工通过gu工具进行下载。目前业内广受关注的Quarkus, Micronaut等项目都是利用了Substate的强大能力。


Github推出包管理仓库


Github是最大的代码管理网站,开发好的代码需要进行编译和打包,组成软件应用。每种语言,操作系统都有自己的包管理工具。

如Java语言使用Maven来进行包管理,缺省的中央仓库是Apache maven repo,而Nodejs使用npm,红帽的RHEL操作系统使用RPM包管理,Docker有docker image和docker hub作为包映像和存储站点。


目前Github支持Npm, Docker, Maven, Nuget(.NET)和RubyGems等包管理格式,预计更多的格式会未来进一步支持。


在较大的软件项目中,必然会用到包管理,开发时需要自行搭建或者使用三方的包管理仓库网络服务。如今Github提供了包管理功能,开发者可以使用一站服务,方便快捷的完成代码开发,编译打包,项目发布等工作。



Eclipse和Oracle未能就 Javax 命名空间使用达成一致


去年Oracle将 Java EE 的代码,文档,TCK移交给Eclipse开源组织,但不允许继续使用 Java EE 名称。经过Java社区广泛投票,采用了 Jakarta EE 作为 Java EE后续技术的名称。


经过了历经一年的迁移过程,绝大多数 Java EE相关项目,比如 Glassfish, Jersey等都已经转移到了Eclipse组织中。

目前面临的一个问题,就是 Jakarta EE是否还可以继续使用 Javax这个命名空间(namespace)。


在Java诞生之时,Sun公司保留了Java, Javax作为Java语言的特有命名空间域,开发者看到类或者接口,都会默认认为是JDK自身或者有官方背景,连很多安全管理工具,IDE,类加载验证都会做特别的处理。现在Oracle公司不再继续维护JavaEE,又不允许继任者Jakarta EE使用javax,必然会给开发者带来很多不便。


目前Jakarta EE业内多数开发者倾向的方案是:Jakarta EE 8和 Java EE 8保持功能相同,只有命名空间分别为jakarta和javax;Jakarta EE 9时,彻底不再使用原javax命名。因为无法修改和添加接口和方法,会给开发者带去极大的困惑。针对EE 9之后,原有系统兼容部署的问题,由容器产商技术处理,目前有各种二进制重载和重写技术,也不会很难,相信可以很好解决。


Storm 2.0.0发布


Storm是第一个得到广泛应用的流式处理框架,其作者Nathan Marz是Lamdba架构的主要设计者,其著作

Big Data: Principles and best practices of scalable realtime data systems是大数据计算方面的权威书籍。


之前Storm用Clojure语言写成,尽管Clojure是纯函数式语言,但毕竟太小众了。Storm项目后来进入Apache社区,成为顶级项目。


Storm 2.0.0

(https://storm.apache.org/2019/05/30/storm200-released.html)

完全用Java 8写成,并重新设计了新的体系架构。提供了一套流式API,可以进行高效流式处理。


目前函数式编程已经在Java社区深入应用,流式处理框架,配合消息中间件,成为互联网级别大数据处理,海量运算的基础架构。Storm2的出现,也是希望能抢回一些市场份额。


J2CL: 一个Java到JavaScript的编译器


J2CL项目(https://github.com/google/j2cl),把Java语言,编译成Javascript。这方面最经典的项目是GWT,来自谷歌的开源项目。


J2CL也是这样的一个开源项目,同样也是谷歌开源的。在项目说明页,阐述了和GWT的关系。可以看作GWT3剥离出的Java到Javascript的语言编译器。

GWT其实是作为图形库存在的,可以帮助Java开发者完成页面的开发。GWT总体来说还是算成功的,很多的谷歌服务在用GWT技术,Vaadin, Wildfly Console等也在使用。


但因为Javascript框架演进的实在太快,而Java转译Javascript过程往往对开发着不太友好,GWT逐渐失去了广泛关注。


J2CL的出现,还是说明语言之间的转译是有很大需求的,特别是用来做各种测试和快速验证开发。



书 海 心 得


Effective Java(第三版)

Joshua Bloch


每个人选取的原版Java编程入门书可能都不一样,比如Head First Java, Thinking in Java, 甚至Core Java,但对于进阶书籍,只选一本的话就是Effective Java。可以看成是Java编程的内功宝典。

Joshua在时隔近10年后,2017年出版了Effective Java第三版。其中完整添加的一章,就是Lamdba和Stream,即 Java8 后加入的技术。

其他章节则是少量的添加和修订。三版共有90个条目,比起第二版的78个,增加12个条目。


Lamdba和Stream章节,内容分别是:


42. Lambda优先于匿名类。Java8之前使用匿名类的场合,尽量用lamdba函数代替。IDE通常可以帮助做到这一点。

43. 方法引用优先于Lambda。尽量使用 "::" 这样的方法表示,更加清晰直观。

44. 坚持使用标准的函数接口。java.util.function 包提供了大量标准函数式接口供使用。 如果其中一个标准函数式接口能完成工作,则应该优先使用,而不构建新的的函数式接口。 这样 API 更容易学习,并提供重要的互操作性好处,因为多数标准函数式接口提供了默认方法。

45.谨慎使用Stream。流使用时伴随着函数化,而函数写法天然具有类型推导特征。在使用流式管道时,缺乏显式的类型信息和用来辅助理解代码的临时变量名称。所以从代码可读性和可维护性的角度出发,仔细衡量原先迭代式代码和流式代码之间的不同,选取更合适的一种编写方法。

46.优先选择Stream中无副作用的函数。需要了解收集器的种类和主要方法。流式处理的本质是对集合进行无副作用的函数计算,通过函数得到最终想要获得的数据集合。

47.优先使用Collection作为返回类型。这样使用返回值的开发者可以自由的选择是采用迭代式处理,或者继续转成流。

48.谨慎使用Stream并行。如果使用了Stream.iterate或者中间操作limit,流式库不知道如何并行执行,并且启发式算法失效,导致流并行计算失败。


此外,增加条目还有:


创建和销毁对象

5. 依赖注入优于显式连接资源。依赖注入已经在 Java 应用中得到广泛运用,Spring, Guice, 应用服务器实现(如Wildfly的MSC)都实现了Ioc/DI框架。采用依赖注入,极大的提高了灵活性和可测试性。主要有可能,就尽量采用依赖注入提供的声明性,而不是显式的连接资源和接口实现。


9. 使用 try-with-resources 语句替代 try-finally 语句。在Java开发中,经常面对IO资源关闭的情况,典型的做法是用close手工关闭资源,但有时开发者忘记关闭,即时是放在final块中,也容易产生一些问题,尤其是同时操作多个资源时。Java 7引入的try-with-resoures是解决问题的方法。需要处理的资源实现AutoCloseable接口,然后将此资源放在try代码块中。当处理资源完毕,即代码块离开try块作用域后,会自动调用close方法进行资源关闭工作。


类和接口

25. 将源文件限制为单个顶级类。如果存在多个顶级类,而java文件名称只能描述其中一个,那么另一个容易产生混淆,特别的,当另外一名开发者又创建了相同名称的java文件时。


泛型

32. 合理地结合泛型和可变参数。如果使用泛型可变参数编写方法,确保方法的参数都是类型安全的,并使用@SafeVarargs进行注解。


方法

55. 谨慎地返回 Optional。可能无法返回值,以及在没有返回值而还必须处理的情况下,则应该声明返回Optional。不要返回声明为Optional类型,却返回null值。


并发

移除了版本二中,避免使用线程组


序列化

85. 优先选择 Java 序列化的替代方案。领先的跨平台结构化数据是基于文本的JSON格式和二进制的protobuf格式。前者易于阅读,后者效率更高。对于不确信的数据,不要尝试进行反序列化,通常是安全问题的根源。


综合以上我们可以看出,Effective Java第三版是针对 Java 7,8的新特性进行的内容增加和改进,还有少量 Java 9的内容,更多的经典知识还是不变的。


以上是关于开源中间件通迅(创刊卷,第1期)的主要内容,如果未能解决你的问题,请参考以下文章

开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系

第1824期Serverless 函数应用架构升级

支付宝的开源分布式消息中间件

小米开源数据库中间件Gaea实战(有彩蛋)

「开源人说」第一期重磅上线 一起来看《十万亿条消息背后的故事》

php开源一个MVC框架的诞生之中间件Middleware