Java 程式設計知識列表與系統架構演化

weixin_34146805發表於2018-06-01

使用Java 後端技術的目的就是構建業務應用,為使用者提供線上或者離線服務。因此,一個業務應用需要哪些技術、依賴哪些基礎設施就決定了需要掌握的後端技術有哪些。

根據後端基礎設施,又可以從中引出其需要的技能列表。進一步細化可以得到更為具體的技能樹,本文選自《Java工程師修煉之道》為大家帶來技能樹上的“Java 程式設計知識”與“系統架構演化”兩部分,完整“Java 後端工程師技能樹”可參見本書,點選閱讀原文了解本書詳情

Java 程式設計知識

對於Java 方面的技能來說,主要分兩大部分,包括Java 程式設計和JVM。 先來看一下Java程式設計部分,這也是Java 工程師最基礎的技能。

IDE:目前用得最多的Java IDE 當屬 Eclipse 和 Intellij IDEA。前者是老牌 IDE,逐步淘汰了Jbuilder 以及Netbeans,佔領了大部分Java IDE 市場。後者則是後起之秀,由於其增量編譯、智慧分析程式碼等帶來的效能提升,現在已經得到了大規模使用,大有取代Eclipse 之勢。

核心語法:目前用得最多的當屬 JDK 6 的 Java 語法。而 Java 7 則又引入了 try-with-resource、switch string、diamonds 等語法;Java 8 則又引入了Lambda、Stream等語法。

集合類:集合類是Java語言中非常精華的部分,包括HashMap、ArrayList、LinkedList、HashSet、TreeSet 以及執行緒安全的ConcurrentHashMap、ConcurrentLinkedQueue 等執行緒安全集合。瞭解它們的實現原理、查詢、修改的效能和使用場景是非常必要的。

工具類:Google Guava、Apache Commons、FastJson 提供了很多 JDK 本身沒有的工具類、集合等。此外,ASM 位元組碼操作以及CGLIB 程式碼生成能夠提供更底層的Java 程式設計功能。

高階特性:拋開 Java 核心的基本程式設計,併發程式設計、泛型、網路程式設計、序列化 RPC都屬於Java 的高階程式設計特性。其中併發程式設計需要掌握Executors 提供的各種併發工具、Java 7 帶來的Fork/Join 框架以及CountDownLatch、Semaphore、CyclicBarrier等同步工具;網路程式設計要區分好BIO、NIO 以及AIO;序列化中除了JDK 自帶的序列化實現外,Protobuf 和Kryo 是比較高效的第三方實現;RPC 的實現中,Thrift、Hessian、Dubbo 以及RMI 則是比較常用的幾個協議,其中的Hessian 是基於HTTP協議的,Dubbo 是基於TCP 協議的,而Thrift 則同時支援兩種協議。

Java EE:Java EE 現在是 Java 應用最普遍的一個領域。Servlet 是 Java EE 中最根本的元件之一。而Servlet 3.0 帶來的非同步Servlet 提高了其處理請求的效能。

專案構建:目前用得最多的Java專案構建工具包括Maven和Gradle,它們提供了原始碼包依賴管理、編譯、打包、部署等一系列功能。

程式設計框架:Spring 是 Java 程式設計中避不開的一個框架,發展到現在除了 Spring 核心的IoC、AOP 之外,Spring MVC、Spring Data、Spring Cloud 等都給Java 開發者們帶來了開發上的便利,大大提高了開發效率。除此之外,ORM 框架MyBatis 也是Java領域比較火的框架之一,實現了資料庫記錄到Java 物件的對映操作。此外,Jersey提供了從客戶端到伺服器端的一整套符合RESTful 規範的開發框架。

測試:測試是任何程式設計都需要的一步。黑盒測試主要指的是通常進行的功能測試,白盒測試則主要指的是對程式碼功能、質量進行的測試。此外,關鍵的單元測試則是開發工程師需要著重注意的地方,“測試驅動開發”的理念也是值得推崇的開發方式。JUnit 是目前Java 中實現單元測試的主流方案。

一般來說掌握了上面所述的Java 程式設計技能就能夠應付大多數程式設計工作,但是如果在程式碼層面已經做到最大努力卻還是達不到效能要求的時候,就需要在JVM 虛擬機器層面做一些努力。可以說掌握JVM 相關技術是Java 開發進階的一個關鍵步驟。

虛擬機器實現:Java 的虛擬機器實現除了我們常用的 HotSpot 外,還有 JRockit、J9 以及移動平臺的DalvKit。我們通常所描述的JVM 優化絕大多數是針對HotSpot 虛擬機器來說的。

類載入機制:JVM 的類載入機制遵循雙親委派原則,即當前類載入器需要先去請求父載入器載入當前類,無法完成才自己去嘗試進行載入。OSGI 框架則打破了此機制,採用了平等的、網狀的類載入機制,以實現模組化的載入方案。

執行時記憶體組成:程式計數器、堆疊、方法區、堆、堆外記憶體,共同組成了 JVM的執行時記憶體。

Java 記憶體模型:Java 的主記憶體 + 執行緒私有記憶體的模型是執行緒安全問題產生的根本。

GC 原理和調優:與 C、C++ 這些語言相比,GC 是 Java 的優勢,但因為 GC 的細節被JVM 遮蔽了,故在對記憶體、效能要求非常苛刻的情況下難以進行自由控制,從某種程度上說這也是劣勢。如果想在某些場景下發揮GC 的最大效能,能做的就是對GC 的各種引數做優化配置,如新生代和老年代的垃圾回收器選擇、各種垃圾回收引數的配置等。此外,很多時候由於程式碼質量或者外部客觀因素,造成了JVM頻繁GC,需要使用相關工具快速進行問題定位和解決。

效能調優和監控工具:JDK 自帶了很多強大的調優和監控工具,包括 jmap、jstack、jcmd、JConsole、jinfo 等。此外,BTrace 是一款非常強大的線上問題動態排查工具,能夠無須重啟Java 程式即可動態地插入一些程式碼邏輯,從而攔截程式碼執行邏輯列印日誌並排查問題。

系統架構演化

一個應用從零開始一般會經歷單體應用、垂直應用到分散式服務架構的演化。

7255511-f14e058e05fb1962

單體應用:當應用規模、團隊規模比較小的時候,只需要一個包括了所有功能的應用。這樣可減少部署節點,也減少部署成本。此時,對資料庫的ORM 操作是架構實現的關鍵點。

垂直應用:當應用的使用者規模越來越大,請求量越來越高的時候,單體應用增加節點帶來的資源浪費會凸現出來,因為絕大多數介面請求量並不是特別大,根本沒必要擴充到多個節點,完全可以將單體應用拆分成互不相關的幾個應用,分別對外提供服務。此時,加速每個應用開發的MVC 框架是架構實現的關鍵點。

分散式服務:當垂直應用越來越多時,應用之間的互動不可避免。要考慮抽離核心業務單獨部署,逐漸形成穩定的服務中心。而隨著團隊規模的相應擴大,服務會隨著團隊的增多變得越來越多,粒度會變得越來越小,也就逐步形成了分散式服務的架構,而當粒度細到某種程度、服務數量多到一定程度,則可以稱之為微服務。即在設計好業務邊界之後將原來的單體應用分解成一個個細粒度的服務,彼此之間通過某種方式進行通訊。微服務架構的關鍵在於如何做好服務的治理、排程、維護工作。目前,Dubbo 算是微服務架構中用得比較多的框架,但Dubbo 僅僅解決了微服務架構中的一部分問題。另外,Spring Cloud 則基本上涵蓋了微服務架構的各個方面。

本文選自《Java工程師修煉之道》

相關文章