序言
2017年国庆节,蚂蚁金服的几位小伙伴们前去参加了Oracle在旧金山举行的JavaOne 2017会议。来自全球多家公司的技术专家和听众们齐聚一堂,分享、见证了世界最前沿的应用开发技术。
本次会议除了必备的Java语言平台最新特性介绍之外,还有几个有特色的话题,包括:云计算、FAAS、微服务、大数据、人工智能、区块链等热点或前沿技术。本文试着从中挑出java语言平台、FAAS给大家做一个介绍。
Java语言平台
1. JDK9的新特性
今年9月Oracle发布了JDK9版本,有许多新特性,本次大会也花了大量篇幅做了重点介绍。其中, Azul Systems公司的CTO对其做了一个精彩的总结,末尾展示了该公司自行研发的商业版JDK ---- Zulu Java的一些增强特性,值得大家借鉴。
- JDK9最大的变化是模块化
正如其项目代号“拼图”(Jigsaw)所暗示的,新版的JDK对标准类库、API、源代码都进行了重组和模块化,封装了绝大多数内部API,sun.misc.Unsafe类也有了替代的使用方式(Variable Handles)。
模块化导致JDK/JRE的目录结构也发生了变化,JDK9删掉了jre/、tools.jar、rt.jar,其功能被conf/、jmods/取代。
- 集合工厂方法
例如,List、Set、Map接口可以通过静态工厂方法of()直接填充出一个对象,省去了繁琐的代码。
Setset = Set.of("a", "b", "c");
等价于老代码:
Setset = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set = Collections.unmodifiableSet(set);
- 改进的Stream API
体现在很多细节方面,举几个例子:
- 从Scala等语言中借鉴了不少特性。如takeWhile()/dropWhile()函数,我们平时用的skip()使用数字、而dropWhile()使用自定义谓词来跳过若干个元素。例如:
Stream.of(2, 4, 6, 8, 9, 10, 12)
.dropWhile(n -> n % 2 == 0)
.forEach(System.out::println);
将输出:
9
10
12
- 增强了迭代器,用起来更像for循环。例如:
IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
会输出从1到99。
- 用内存映射(mmap)实现了高性能的Files.lines()方法,解决了JDK8中BufferedReader.lines()的性能问题。
详情参见:https://bugs.openjdk.java.net/browse/JDK-8072773(请将网址复制至浏览器中打开)
- 终于有了交互式java控制台 ----Jshell。
- JVM增强
G1成为JDK9的默认垃圾回收器。众所周知G1的停顿时间短,但某些情况下G1仍然会触发Full GC导致长时间停顿。Azul Systems公司研发的付费版Zing JVM就可以解决这个问题,它使用C4(Continuously Concurrent Compacting Collector)垃圾回收算法,有很高的回收效率。
从上表可以看出,C4算法消除了“stop-the-world”这种负面影响。其本质是通过在JVM中创建一个虚拟地址映射表,GC线程和工作线程共享该映射表、相互协作、lazy的方式规避了长时间的线程间互相等待。当GC线程先占据某对象内存并将其移到压缩区后,工作线程访问该对象时需要根据映射表重新定位;当工作线程先占据该对象后,发现GC线程已经将其标记为要移动,则协助GC线程完成部分移动工作,确保虚拟地址正确,然后紧接着处理自己的业务指令,GC线程会接管完成后续的扫尾工作。
JDK9还有许多其他方面的小改进,如jar包中可以发布多个版本、字符串性能提升等,就不再赘述了。
2. Java EE相关
Oracle的VP做了关于Java EE8的更新报告。更新点包括:
- JSON Binding API
- JAS-RS reactive client API,及对服务端推送事件的支持
- Servlet对HTTP/2的支持
- JAVA EE新的安全相关API
- Bean Validation 和 CDI的新特性
多位其他Speaker分别对这些点进行了阐述和演示。关于Java EE的应用,有一个跟蚂蚁的业务相关度较高----使用EE搭建一个内容推荐引擎,重点介绍一下。
实现推荐的过程是准备数据、建立关联、再通过图形搜索相关联的节点得到推荐结果,本案例实际上是使用EE4J,通过JNoSQL+图计算框架+图形数据库创建。
JNoSQL包括通信API:Diana,以及在其上面使用了CDI的映射API:Artemis。重点是Graph引擎,使用了Apache开源项目TinkerPop. TinkerPop是一个图形计算框架,重在计算,下层需要有存储系统,它可以支持图形数据库,也能支持图形分析系统,如ArangoDB,Keyline,MongoDB,Hadoop,Titan,Neo4j等。有了这样的架构,开发者就可以很轻松的通过DAO来操纵图形数据,从而方便的写出推荐业务逻辑。本案例还给出了使用TinkerPop与传统SQL之间复杂度的对比,说明为什么要使用图形引擎。
在Keynotes专场会议里,阿里的AJDK大放异彩,研究员英通讲解了AJDK在双11的应用场景,庞大的业务数据震撼了全场。
Serverless FAAS和云计算
Serverless FAAS是本次大会的一个亮点, Luminis公司的Bert Ertman做了演讲,介绍了FAAS的发展历史,技术实现,业内实例,技术支撑体系,以及serverless的优点。结论就是:
FAAS其本质是一种比云计算更彻底的托管,用户只需关注编写自己的业务逻辑函数,其余的全由托管服务完成。预测无服务器架构有可能成为未来架构的一个趋势。
Bert Ertman列举了Serverless的几个优点:
- 很容易被云计算用户接受(“托管”的概念很是类似)
- 把java函数提升为一等公民(应该是从语言发展&应用角度说的)
- 基于事件、无状态(意味着写业务代码简洁方便)
- 理论上可无限扩展(无状态,当然容易水平扩容)
- 与传统部署模型不同(部署起来简单)
- 其他经济方面的利益
但小编认为,凡事都有两面性,Serverless FAAS这种模式严重受限于托管服务提供商,各提供商的接口规范可不一定能很快标准化,可以想象一下受限于某一个服务提供商的害处……
此外,关于云计算方面,介绍了Java开发者使用Docker, Kubernetes, OpenShift来构建应用,演示了各种实例demo,在这里就不一一说明了。
会议总结
这次JavaOne会议的涉及的技术内容相当广泛,报告者均来自全球非常有实力的公司,技术思路新颖清晰,对与会者有很大的启示。最后,附上本文相关的演讲资料,大部分讲义可以在这里下载到:
https://events.rainfocus.com/catalog/oracle/oow17/catalogjavaone17(请将网址复制至浏览器中打开即可查看)
放一张外景图作为结束。