使用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 進程便可動態地插入一些代碼邏輯,從而攔截代碼執行邏輯打印日誌並排查問題。
系統架構演化
一個應用從零開始通常會經歷單體應用、垂直應用到分佈式服務架構的演化。
單體應用:當應用規模、團隊規模比較小的時候,只須要一個包括了全部功能的應用。這樣可減小部署節點,也減小部署成本。此時,對數據庫的ORM 操做是架構實現的關鍵點。
垂直應用:當應用的用戶規模愈來愈大,請求量愈來愈高的時候,單體應用增長節點帶來的資源浪費會凸現出來,由於絕大多數接口請求量並非特別大,根本不必擴充到多個節點,徹底能夠將單體應用拆分紅互不相關的幾個應用,分別對外提供服務。此時,加速每一個應用開發的MVC 框架是架構實現的關鍵點。
分佈式服務:當垂直應用愈來愈多時,應用之間的交互不可避免。要考慮抽離核心業務單獨部署,逐漸造成穩定的服務中心。而隨着團隊規模的相應擴大,服務會隨着團隊的增多變得愈來愈多,粒度會變得愈來愈小,也就逐步造成了分佈式服務的架構,而當粒度細到某種程度、服務數量多到必定程度,則能夠稱之爲微服務。即在設計好業務邊界以後將原來的單體應用分解成一個個細粒度的服務,彼此之間經過某種方式進行通訊。微服務架構的關鍵在於如何作好服務的治理、調度、維護工做。目前,Dubbo 算是微服務架構中用得比較多的框架,但Dubbo 僅僅解決了微服務架構中的一部分問題。另外,Spring Cloud 則基本上涵蓋了微服務架構的各個方面。
本文選自《Java工程師修煉之道》