JAVAONE 2016大会的所见所感

有幸获得阿里赞助,前去旧金山参加Oracle举办的JAVAONE 2016开发者大会,JAVAONE作为java界最顶级的盛会,会议内容将展现出数千万开发者最关心的问题,以及java的未来发展方向。大会有很多的会场,参会者可以根据自己的喜好选择不同的会场进行参会,大会共持续5天,每天都有数十场会议。下面将以自己的关注点,讲述本次大会的几大核心内容。


一、微服务(microservice)

本次大会,不少分会场都涉及了微服务的内容,可见,目前在企业中,微服务是目前的一个主流。

首先说一下以往的开发模式monolith的弊端,才能引出为何microservice会逐渐成为企业主流。

什么是monolith?

1.将所有的代码及功能都包含在一个WAR包中的项目组织方式称为monolith。因而,它的弊端便显而易见。那就是即使你只修改了一行代码,你也要再去重新编译整个工程的代码,然后再去部署。项目越大,在这重新编译和部署的时间也将越长,效率将会逐渐变得低下。

2.另一个弊端是扩容时只能整体进行扩容,因为monolith组织的代码最终会是一个包含了所有功能的WAR包,无法只扩展其中的某一个产生瓶颈的模块。

3.还有就是可靠性,因为所有模块都运行在一个进程中,任何一个模块中的bug,比如内存泄漏,将会有可能弄垮整个进程。所有应用实例都是唯一的,这个bug将会影响到整个应用的可靠性。


而微服务正是解决上面所说的问题的,对微服务架构我们没有一个明确的定义,简单来说微服务架构是:

采用一组服务的方式来构建一个应用,服务独立部署在不同的进程中,不同服务通过一些轻量级交互机制来通信,例如 RPC、HTTP 等,服务可独立扩展伸缩,每个服务定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现,由独立的团队来维护。

 所以对于小应用使用monolith是方便快捷的,然而对于大型应用,无疑微服务将是一个很好的解决方案。微服务架构可以看做是 SOA 架构思想的一种实现。 同时,会议还讲述了蓝绿发布,整个发布部署过程,让用户感受不到服务宕机或重启,比较简单,大家可以参考这个链接:http://www.tuicool.com/articles/2Iji2ue,不过一起的阿里工程师也给出了一些质疑,停掉一半的机器可能会对业务造成影响,是一个风险点。


二、容器化(Docker)

不少分会场都讲解了容器化的概念,其中,都对Docker进行了重点介绍。可见,目前的Docker容器化技术也是目前企业中的大趋势。Docker is hot!

为什么Docker?

1.软件的部署、分发容易

2.软件的集群化、自动扩展容易

3.软件开发变得容易


什么是Container?

1、轻量级的虚拟机

2、升级版的进程


什么是Docker?

要说明什么是Docker,先简单说一下Docker的来源,两个ceo坐在一起聊天,其中一个谈到了使用LXC技术可以打破开发工程师和应用工程师时间无法轻松协作发布产品的难题。这个container可以将开发者从以往繁杂的日常部署中解脱出来,同时也方便了系统工程师对应用的水平扩展。俩人越谈越high,最终Docker 0.1发布...

所以,Docker产生的目的主要是解决以下问题:

1.环境管理复杂

2.越来越多开发者开始将应用部署到云上。虽然解决了硬件管理的问题,但是软件配置和管理相关的问题依然存在。

3.虚拟化手段的变化,无论是KVM还是Xen,在Docker看来都是浪费资源,用户需要的只是高效的运行环境,而不关心os。所以Docker的方式将更加轻量级、更加灵活。


简单来说,Docker有点像虚拟机,它能产生镜像(image),然后进行拷贝移植,轻量灵活。但是,它比虚拟机轻量,它依赖底层宿主机的共享os。所以不同于虚拟机,容器只能在相同操作系统间进行移植。个人觉得这也是容器与虚拟机之间的最大不同。


三、JDK 8引入的新特性,lambda表达式

虽然lambda表达式已经伴随jdk8问世两年多了,但是lambda表达式作为JDK 8引进的最大特性,在很多的分会场都进行了讲解和使用技巧。然而,目前在国内,真正使用此项特性的并不多。本身lambda表达式也是一个主观性的产物,一种编程方式的改变,就像演讲者说的,即,用或不用,主要还是看自己的喜好吧。


使用lambda的好处:

1.代码更加简洁,原本几十行的代码,用lambda表达式将只有仅仅几行。

2.可读性更高。


代码演示:

普遍编程:

List<String> errors = new ArrayList<>();
int errorCount = 0;
File file = new File(fileName);
String line = file.readLine();
while (errorCount < 40 && line != null) {
    if (line.startsWith("ERROR")) {
        errors.add(line);
        errorCount++;
    }
    line = file.readLine();
}


使用lambda表达式编程后:

List<String> errors = Files.lines(Paths.get(fileName))
                           .filter(l -> l.startsWith("ERROR"))
                           .limit(40)
                           .collect(toList());

这里需要强调的一点,lambda表达式并不是匿名内部类的语法糖,这个当时在参会的时候碰到了一个华为的工程师,和他一起听了这个讲座,他给我们解答了疑惑。Lambda多数实现采用invokedynamic指令,即底层采用动态字节码生成接口实现,效率有一点损失,然而相对于代码带来的可读性是可以忽略不计的。至于为什么采用invokedynamic的实现,可以参考Brian Goetz的设计文档:http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html

个人的理解就是,避免去修改原有的vm,实际的翻译策略隐藏在jdk的库的实现里(metafactory),这样既方便修改,还不用动vm。流程就是,invokedynamic是vm执行,但是vm会向class library做一次upcall,这里就是调用到matafactory去实际做翻译。可以看为:vm我不想管了,library你想咋搞告诉我。(借用了知乎R大原话)


四、未来JDK 9的一些新特性,Jshell,G1GC

JDK 9正在开发中,其中一些新的项目,增加了一些新的特性,如Jshell。当然,JDK 9最大的特点将是:默认垃圾收集器的改变。G1GC将是JDK 9的默认垃圾收集器。

当然,目前G1收集器还存在很大问题,所以正如演讲者说的,目前还不建议使用G1收集器。


Jshell: java shell,与Python的解释器类似,第一个官方的Java REPL (Read-Eval-Print-Loop的缩写,即交互式编程环境),一种命令行工具          

 项目地址:openjdk.java.net/projects/jigsaw

直接上演讲者的两张ppt作为展示说明吧,是不是很cool:



G1 GC:

 从jdk1.5开始之后,CMS收集器就成为了jdk的默认收集器,而jdk 9中G1将成为默认收集器,那么G1收集器有什么特点和优势呢?

1、G1最大的特点就是将整个java堆划分为多个大小相等的独立区域(Region),虽然还保留新生代和老年代的概念,但新生代和老年代不再是物理隔离的,他们都是一部分Region(不需要连续)的集合。

2、因为采用了Region的“化整为零”的划分思想,所以G1可以建立可预测的停顿时间模型,可以有计划地避免在整个java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。因为G1收集器可以在有限的时间内获取尽可能高的收集效率。

如果你的应用追求低停顿,G1将是一个尝试。


五、Modular development

所谓Modular开发,其实是一种相比jar包更小的粒度。以往的开发,我们都是引入了相当多的jar包,然而jar包中的很多类其实我们并没有使用。Modular开发提供一种更加细粒度、更加自主性的方式。有开发者自己去设计Modular,将自己会调用到的类,放到一起,封装成一个modular,这样不需要再引入jar包。同时,modular也可以和其它的jar包一同使用。这样,程序会优先去到你的modular里面去寻找,寻找不到则会去调用jar里的相应类。




六、一些工具的使用,Threadio、profile等

本次大会还有很多分会场介绍了一些工具,一方面也是给他们自己的产品做广告,一方面这些工具也都是java开发者们所需要的。

ThreadIo:通过日志分析多线程的问题。

profile:通过对日志的分析,将调用进行可视化展示,可以找到程序的热点,针对热点进行优化。


七、其它花絮

本次大会还和jdk的首席架构师mark以及其他的speaker们进行了交流,畅谈java的昨天、今天和明天,当问到哪个版本的jdk是他最喜欢的,他说是jdk 9。当问其中一个speaker,一个程序员最重要的品质是什么,他说是think more。

最后,晒一张与java首席架构师mark的合影:



整个大会收获满满,技术永无止境,感谢阿里巴巴提供的这次机会~~~


相关reference:

Microservice架构模式简介

《深入理解Java 虚拟机》 周志明 著




阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页