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 虛擬機》 周志明 著





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com