噹噹架構部總監張亮:玩轉Java開源專案

IT大咖說發表於2019-03-02

噹噹架構部總監張亮:玩轉Java開源專案

內容來源:2017年5月21日,噹噹架構部總監張亮在“餓了麼技術沙龍-Java專場”進行《玩轉Java開源專案》演講分享。IT大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。
閱讀字數:3334 | 7分鐘閱讀

噹噹架構部總監張亮:玩轉Java開源專案

摘要

開發一個軟體,並把原始碼釋出到github,就是開源麼?如何能夠開發一個有價值的開源專案、如何能夠維持一個健康活躍的社群並讓開源專案真正從中受益、如何能夠通過它幫助他人和提高自己,這些才是開源更需要關注的方面。我們來看看噹噹架構部總監是如何從四個方面來玩轉Java開源專案。

嘉賓演講視訊地址:t.cn/RSceo7N

Java開源現狀

噹噹架構部總監張亮:玩轉Java開源專案

Java是一門歷史非常悠久的開發語言,從1995年初見至今,時間的指標已不知不覺的撥動了二十多個年頭。請跟我簡單回顧一下Java那些抓住歷史高光的瞬間,也順便回憶一下當時那些與Java一起產生共鳴的技術風暴。

Java首次出現在人們的視野中是1995年,它提出了Write once,runanywhere的口號讓開發者覺得興奮。隨著JDK 1.0的釋出,一些核心概念閃亮登場,它們是JVM,Applet和AWT。Applet和AWT目前雖已退出歷史潮流,但當初在網頁上展現的冒著熱氣的咖啡的Applet小程式,確實讓人眼前一亮。JVM則沿用至今,基於JVM的跨平臺特性對後續的技術產生了深遠的影響。

1998年釋出的JDK 1.2,首次提出了J2SE、J2EE和J2ME三個系列,分別對應於標準開發,企業級開發和手機開發。J2ME隨著手機硬體的更新換代,已逐漸退出歷史舞臺。而J2SE和J2EE則一直沿用至今。J2EE規範中著名的EJB、JSP、Servlet等既是從那時開始加入並日臻完善的。

2002年釋出的JDK 1.4是非常經典的版本,這可能是至今仍然可能在老程式中看到的最老版本。而由於EJB使用起來過於複雜,輕量級的開發框架SpringFramework開始流行。開發者越來越多的拋棄掉笨重的EJB,而轉向更為靈活的Spring Framework陣營。而後來出版的由其作者Rod Johnson撰寫的《expert one-on-one J2EE Development without EJB》更是成為了不朽的名作,Spring Framework也隨之成為Java開發者必須掌握的技術棧。

2006年JDK 1.6釋出,從JDK 1.5開始嘗試的諸如泛型,元註解等程式語言層面的增強,在JDK 1.6中得到了進一步的完善。同期,參考Google發表的3篇著名的關於GFS、MapReduce和Bigtable學術論文,由Doug Cutting用Java建立並開發的Hadoop面世,它在一定程度上顛覆了傳統關係型資料庫在資料儲存和分析領域的絕對統治,從此大資料成為了技術圈乃至全世界各個領域的熱詞。

2009年JDK 1.7釋出。同時由Google開源的Android趨於成熟,和Apple的IOS形成鼎立之勢,共同開啟了基於智慧手機的移動網際網路時代。

隨著網際網路的發展,資訊越來越多,技術的更新迭代也越來越快。最近的一次Java大版本的釋出,是2014年的JDK 1.8,它也是目前為止Java的最新版本。而在同一時期出現最多的焦點技術是以Docker為主的容器和如何有效治理容器的微服務。容器方面Java雖然難於建樹,但基於Java的Spring Boot、SpringCloud、Zookeeper等優秀的框架以及元件為微服務奠定了堅實的基礎。

談了很久Java歷史,那麼經歷了這麼多年的發展,Java必然沉澱了大量極具價值的專案,可供免費使用的開源專案層出不窮。Java門檻越來越高,不僅僅是程式語言層面的問題,也不僅是難於理解的物件導向、設計模式等,而是在於它的技術廣度。由於技術棧眾多,它幾乎很難快速上手,但從另一方面講,Java生態相對於其他語言更加穩定和成熟,技術元件幾乎應有盡有。

Java開源專案型別盤點

基礎類:為程式設計提供便利的基礎類庫。如:Guava、ApacheCommons等。

框架類:曾被認為Java最重要的部分,早期是業務開發工程師的飯碗。如:SpringFramework、Hibernate、MyBatis、Struts等。

測試類:與其他語言比,Java有較完善的測試體系,它很容易提升測試覆蓋率,這得益於廣泛的測試類庫。如:Junit、TestNG、DbUnit、Mocktio等。

構建類:由於使用Java開發的專案大多規模大,依賴複雜,因此Java構建類工具很完善。如:Ant、Maven等。

中介軟體:中介軟體種類很多。比如:Tomcat、Jetty等Web中介軟體,ActiveMQ、RocketMQ等訊息中介軟體、Dubbo等服務治理中介軟體等。基礎中介軟體已非常成熟,而分散式中介軟體仍極少有統一標準。

NoSQL:NoSQL是關係型資料庫的有益補充。NoSQL型別主要分為文件資料庫、列簇資料庫、KV資料庫和圖資料庫。相關產品眾多,使用Java開發的也不少,如:Cassandra、Neo4j等。

搜尋:全文檢索領域中,Lucene是基礎類庫的佼佼者。而基於Lucene封裝的Solr、Elasticsearch等高可用搜尋引擎也是很常見的技術。

大資料:Hadoop系列幾乎全是用Java開發的。

手機端:剛才提到過的Android系統。

桌面端:雖然使用Java開發桌面系統並非現在的主流,但深入人心的產品依然很多,如:Eclipse。

Java開源不擅長的領域

在容器、快取和關係型資料庫這三個領域,Java的開源專案並不多見,而且當前Java也沒有太多機會進駐這些領域。

當今需要的Java開源解決方案

雖然Java已有為數眾多的成熟開源專案,但是目前仍稀缺的優秀開源領域主要是分散式、服務化和彈性化這三個方面。

在網際網路行業分散式、服務化和彈性化是很重要的非功能需求。每個網際網路企業中都有一套足夠成熟的系統,但很多系統難於解耦且定製化嚴重,因此在這方面,成熟的開源產品鳳毛麟角。因此,有價值的開源專案應該從這三方面考慮,而且Java比較適合做這些領域的開發。

開發一個開源專案的那些事兒

開源專案的來源

來源主要從四個方面,大公司、創業公司、社群以及個人。

大公司所做的開源產品基本上不與經濟收益直接相關。如:Google開源的Kubernetes,Linkedin開源的Kafka等。

創業公司開源的產品一般會與他們的經濟利益繫結,大都開源其核心技術,然後針對定製化、諮詢以及企業版進行收費服務。如:Docker、Mesosphere的Mesos、Elastic的Elasticsearch等。

完全由社群驅動的開源的產品擁有強大的開源基因,是開源世界的典範。如:Linux、Apache等。

而個人開源的產品,一般是處於孵化階段。

如何做一個有價值的開源專案

1、以熟悉各種輪子為前提

重複造輪子是巨大的精力浪費,有價值的開源專案應該是現有輪子不能完全覆蓋的範圍。

2、以解決實際問題為目的

任何技術專案都是以解決實際存在的業務問題為前提的,完全脫離業務的技術其存在價值是存疑的。

3、以系統眼光去規劃設計

相比於閉源專案,開源專案的受眾更廣,影響範圍更大,每次升級都帶來顛覆性的變更是災難性的。因此儘量的合理設計系統架構和roadmap是成功的關鍵。好的系統是設計出來,而非改造出來的。前瞻性的眼光非常重要。

4、以工匠精神去雕琢細節

開放出去的原始碼會在一定的範圍內引起共鳴。一個值得研讀開源專案,其程式碼必須經過雕琢,讓其規範、一致、優雅、易懂,儘量將細節做到極致。通過程式碼質量給予使用者信心。

打造合理社群

1、灌輸開源精神

freeis not free是開源的一句名言。開源的價值不僅僅在於免費,更在於自由。既然已經把原始碼開放出去了,那麼使用者想怎麼改都可以,而不應一味地向開源人索取。因此需要合理對使用者進行引導,並讓其認同開源精神,最終做到積極反饋社群。

2、關注核心使用者

應儘早識別出核心使用者,與核心使用者共同發展。最好能夠抱團形成組織,或作為周邊生態加入更大的組織,並利用核心使用者的影響力吸引更多的使用者。

3、堅持與耐心

成功從來不是一件容易的事,開源也不例外。開源之後要堅持去推廣、運營和完善它,並保持足夠耐心。相信是金子總會發亮,堅持才能帶來最終的收穫。

4、文件

文件的重要性甚至優於程式本身。應儘量將使用場景、使用限制、使用建議、配置手冊、實現原理、常見問題等描述清晰。優質文件可以遮蔽大量重複問題,減少開源維護者的精力消耗。

聊聊噹噹開源

噹噹目前的主要開源產品有三個,分別對應於用於非同步化的作業中介軟體、用於服務化的服務治理中介軟體以及用於資料水平擴充套件的資料庫分庫分表中介軟體。其關注的核心都是分散式和彈性化。這三個開源專案都有屬於自己的關鍵詞。

Elastic-job:Elastic-job的關鍵詞是融入。它是一個分散式彈性化排程框架,由Lite和Cloud兩個分支組成,Elastic-Job-Lite提供輕量級、無中心化的作業治理服務。Elastic-Job-Cloud採用中心化方式,它與Mesos完美結合,很容易提供一站式的作業雲平臺服務。

下圖是以Elastic-Job-Cloud為核心的當當作業雲架構圖:

噹噹架構部總監張亮:玩轉Java開源專案

Sharding-jdbc:Sharding-jdbc的關鍵詞是相容。它作為一個分散式的資料庫中間層,主要職責是透明化資料庫水平擴充套件以及柔性事務的處理。它擴充套件並完全相容JDBC協議,因此任何基於JDBC的Java ORM框架均可無縫相容使用。應用開發工程師無需對現有程式碼進行任何調整,只需要配置完成分片規則即可直接享用Sharding-JDBC帶來的便利。

Sharding-JDBC不僅僅是簡單的SQL識別,它擁有一套複雜且完善的知識理論。下圖是Sharding-JDBC的架構圖:

噹噹架構部總監張亮:玩轉Java開源專案

Dubbox:Dubbox的關鍵詞是擴充套件。它在阿里開源的Dubbo基礎上直接擴充套件,增加了REST協議等新功能,用於實現異構語言間呼叫。

三個專案的Github地址是:

github.com/dangdangdot…

github.com/dangdangdot…

github.com/dangdangdot…

這3個專案已較為成熟,已在噹噹大規模使用,比較符合網際網路的業務場景。歡迎感興趣的同學使用、star和fork,歡迎聯絡我們並提出寶貴建議。

我的分享到此結束,謝謝大家!

噹噹架構部總監張亮:玩轉Java開源專案


相關文章