1. 程式人生 > >“Spring三劍客”,助你快速從月入過萬的程序員到年薪百萬的架構師

“Spring三劍客”,助你快速從月入過萬的程序員到年薪百萬的架構師

SpringCloud 微服務構架

點擊關註異步圖書,置頂公眾號

每天與你分享IT好書 技術幹貨 職場知識



技術分享圖片

參與文末話題討論,每日贈送異步圖書。

——異步小編

Spring作為Java開發的事實開發框架,一直以來都被開發者譽為殺手級應用,而Spring Cloud作為Spring下擁有諸多子項目的大型綜合項目,提供了一整套企業級分布式雲應用的完美解決方案,能夠結合Spring Boot、Docker實現快速開發的目的,自出現以來就一直備受Java開發者矚目。

基於Spring的強大背景以及Spring Cloud開發社區極高的活躍度,Spring Cloud對想要實施微服務架構的團隊具有非常大的吸引力,是未來企業架構師必須了解和接觸的重要框架。

《Spring微服務實戰》《Spring實戰》《Spring Boot實戰》並稱“Spring三劍客” ,學好他們助你快速從月入過萬的程序員到年薪百萬的架構師。而今天發布的《Spring微服務實戰》是一本基於Spring Cloud實現微服務的好書,被譽為“用Spring構建微服務項目的聖經”對國內的IT工作者,尤其是Java開發者而言,是學習微服務以及Spring Cloud的珍貴資料。


技術分享圖片

(點擊此處購買)

1.1為什麽會寫這本書?

我寫本書的原因就是——我熱愛編碼。這是對我的一種召喚,也是一種創造性的活動,它類似於繪畫或演奏樂器。軟件開發領域之外的人很難理解這一點。我尤其喜歡構建分布式應用程序。對我來說,看到一個應用程序跨幾十個(甚至數百個)服務器工作是一件令人驚奇的事情。這就像看著一個管弦樂隊演奏一段音樂。雖然管弦樂隊的最終作品很出色,但完成它往往需要大量的努力與練習。編寫大規模分布式應用程序亦是如此。

自從25年前我進入軟件開發領域以來,我就目睹了軟件業與構建分布式應用程序的“正確”方式作鬥爭。我目睹過分布式服務標準(如CORBA)興起與隕落。巨型公司試圖推行大型的而且通常是專有的協議。有人記得微軟公司的分布式組件對象模型(Distributed Component Object Model,DCOM)或甲骨文公司的J2EE企業Java Bean 2(EJB)嗎?我目睹過技術公司和它們的追隨者湧向沈重的基於XML的模式來構建面向服務的架構(SOA)。

在各種情況下,這些用於構建分布式系統的方法常常在它們自身的負擔下崩潰。我並不是說這些技術無法用來構建一些非常強大的應用程序。它們隕落的真相是它們無法滿足用戶的需求。10 年前,智能手機剛剛被引入市場,雲計算還處於起步階段。另外,分布式應用程序開發的標準和技術對於普通開發人員來說太復雜了,以致於無法在實踐中理解和使用。在軟件開發行業,沒有什麽能像書面代碼那樣說真話。當標準妨礙到這一點時,標準很快就會被拋棄。

當我第一次聽說構建應用程序的微服務方法時,我是有點兒懷疑的。“很好,另一種用於構建分布式應用的銀彈方法。”我是這樣想的。然而,隨著我開始深入了解這些概念,我意識到微服務的簡單性可以成為遊戲規則的改變者。微服務架構的重點是構建使用簡單協議(HTTP和JSON)進行通信的小型服務。僅此而已。開發人員可以使用幾乎任何編程語言來編寫一個微服務。在這種簡單中蘊含著美。

然而,盡管構建單個微服務很容易,實施和擴展它卻很困難。要讓數百個小型的分布式組件協同工作,然後從它們構建一個彈性的應用程序是非常困難的。在分布式計算中,故障是無從逃避的現實,應用程序要處理好故障是非常困難的。套用我同事Chris Miller和Shawn Hagwood的話:“如果它沒有偶爾崩潰,你就不是在構建。”

正是這些故障激勵著我寫這本書。我討厭在不必要的時候從頭開始構建東西。事實上,Java是大多數應用程序開發工作的通用語言,尤其是在企業中。對許多組織來說,Spring框架已成為大多數應用程序事實上的開發框架。我已經用Java做了近 20 年的應用程序開發(我還記得Dancing Duke applet),並且使用Spring近10年了。當我開始我的微服務之旅時,我很高興看到Spring Cloud的出現。

Spring Cloud框架為許多微服務開發人員將會遇到的常見開發和運維問題提供開箱即用的解決方案。Spring Cloud可以讓開發人員僅使用所需的部分,並最大限度地減少構建和部署生產就緒的Java微服務所需的工作量。通過使用其他來自Netflix、HashiCorp以及Apache基金會等公司和組織的久經考驗的技術,Spring Cloud實現了這一點。


經過十多年的發展,Spring家族現在已枝繁葉茂,涵蓋J2EE開發、依賴維護、安全、批處理、統一數據庫訪問、大數據、消息處理、移動開發以及微服務等眾多領域。在Spring家族的諸多項目裏面,最耀眼的項目莫過於Spring Framework、Spring Boot和Spring Cloud。Spring Framework就像是Spring家族的樹根,是Spring得以在Java開發領域屹立不倒的根本原因,它的目標就是幫助開發人員開發出好的系統;Spring Boot就像是樹幹,它的目標是簡化新Spring應用的初始搭建以及開發過程,致力於在蓬勃發展的快速應用開發領域成為領導者;Spring Cloud就如同是Spring這棵參天大樹在微服務開發領域所結出的碩果。

在近幾年,微服務這一概念十分火熱,因為它確實能解決傳統的單體架構應用所帶來的頑疾(如代碼維護難、部署不靈活、穩定性不高、無法快速擴展),以至於湧現出了一批幫助實現微服務的工具。在它們之中,Spring Cloud無疑是最令人矚目的,不僅是因為Spring在Java開發中的重要地位,更是因為它提供一整套微服務實施方案,包括服務發現、分布式配置、客戶端負載均衡、服務容錯保護、API網關、安全、事件驅動、分布式服務跟蹤等工具。

本書對微服務的概念進行了詳細的介紹,並介紹了微服務開發過程中遇到的典型問題,以及解決這些問題的核心模式,並介紹了在實戰中如何選擇特定Spring Cloud子項目解決這些問題。本書非常好地把握了理論和實踐的平衡,正如本書作者所言,本書是“架構和工程學科之間良好的橋梁與中間地帶”。相信讀者閱讀完本書之後,會掌握微服務的概念,明白如何在生產環境中實施微服務架構,學會在生產中運用Spring Cloud等工具,並將項目自動部署到雲環境中。

1.2什麽是微服務

在微服務的概念逐步形成之前,絕大部分基於Web的應用都是使用單體架構的風格來進行構建的。在單體架構中,應用程序作為單個可部署的軟件制品交付,所有的UI(用戶接口)、業務、數據庫訪問邏輯都被打包在一個應用程序制品中並且部署在一個應用程序服務器上。

雖然應用程序可能是作為單個工作單元部署的,但大多數情況下,會有多個開發團隊開發這個應用程序。每個開發團隊負責應用程序的不同部分,並且他們經常用自己的功能部件來服務特定的客戶。例如,我在一家大型的金融服務公司工作時,我們公司有一個內部定制的客戶關系管理(CRM)應用,它涉及多個團隊之間的合作,包括UI團隊、客戶主團隊、數據倉庫團隊以及共同基金團隊。圖1-1闡示了這個應用程序的基本架構。

技術分享圖片

圖1-1 單體應用程序強迫開發團隊人工同步他們的交付,因為他們的代碼需要被作為一個整體單元進行構建、測試和部署

這裏的問題在於,隨著單體的CRM應用的規模和復雜度的增長,在該應用程序上進行開發的各個團隊的溝通與合作成本沒有減少。每當各個團隊需要修改代碼時,整個應用程序都需要重新構建、重新測試和重新部署。

微服務的概念最初是在2014年前後悄悄蔓延到軟件開發社區的意識中,它是對在技術上和組織上擴大大型單體應用程序所面臨的諸多挑戰的直接回應。記住,微服務是一個小的、松耦合的分布式服務。微服務允許將一個大型的應用分解為具有嚴格職責定義的便於管理的組件。微服務通過將大型代碼分解為小型的精確定義的部分,幫助解決大型代碼庫中傳統的復雜問題。在思考微服務時,一個需要信奉的重要概念就是:分解和分離應用程序的功能,使它們完全彼此獨立。如果以圖1-1所示的CRM應用程序為例,將其分解為微服務,那麽它看起來可能像圖1-2所示的樣子。

技術分享圖片

圖1-2 使用微服務架構,CRM應用將會被分解成一系列完全彼此獨立的微服務,讓每個開發團隊都能夠按各自的步伐前進

由圖1-2可以發現,每個功能團隊完全擁有自己的服務代碼和服務基礎設施。他們可以彼此獨立地去構建、部署和測試,因為他們的代碼、源碼控制倉庫和基礎設施(應用服務器和數據庫)現在是完全獨立於應用的其他部分的。

微服務架構具有以下特征:

●應用程序邏輯分解為具有明確定義了職責範圍的細粒度組件,這些組件互相協調提供解決方案。

●每個組件都有一個小的職責領域,並且完全獨立部署。微服務應該對業務領域的單個部分負責。此外,一個微服務應該可以跨多個應用程序復用。

●微服務通信基於一些基本的原則(註意,我說的是原則而不是標準),並采用HTTP和JSON(JavaScript Object Notation)這樣的輕量級通信協議,在服務消費者和服務提供者之間進行數據交換。

●服務的底層采用什麽技術實現並沒有什麽影響,因為應用程序始終使用技術中立的協議(JSON是最常見的)進行通信。這意味著構建在微服務之上的應用程序能夠使用多種編程語言和技術進行構建。

●微服務利用其小、獨立和分布式的性質,使組織擁有明確責任領域的小型開發團隊。這些團隊可能為同一個目標工作,如交付一個應用程序,但是每個團隊只負責他們在做的服務。

我經常和同事開玩笑,說微服務是構建雲應用程序的“誘人上癮的毒藥”。你開始構建微服務是因為它們能夠為你的開發團隊提供高度的靈活性和自治權,但你和你的團隊很快就會發現,微服務的小而獨立的特性使它們可以輕松地部署到雲上。一旦服務運行在雲中,它們小型化的特點使啟動大量相同服務的實例變得很容易,應用程序瞬間變得更具可伸縮性,並且顯而易見也會更有彈性。

1.3 什麽是Spring,為什麽它與微服務有關

在基於Java的應用程序構建中,Spring已經成為了事實上的標準開發框架。Spring的核心是建立在依賴註入的概念上的。在普通的Java應用程序中,應用程序被分解成為類,其中每個類與應用程序中的其他類經常有明顯的聯系,這些聯系是在代碼中直接調用類的構造器,一旦代碼被編譯,這些聯系點將無法修改。

這在大型項目中是有問題的,因為這些外部聯系是脆弱的,並且進行修改可能會對其他下遊代碼造成多重影響。依賴註入框架(如Spring),允許用戶通過約定(以及註解)將應用程序對象之間的關系外部化,而不是在對象內部彼此硬編碼實例化代碼,以便更輕松地管理大型Java項目。Spring在應用程序的不同的Java類之間充當一個中間人,管理著它們的依賴關系。Spring本質上就是讓用戶像玩樂高積木一樣將自己的代碼組裝在一起。

Spring能夠快速引入特性的特點推動了它的實際應用,使用J2EE技術棧開發應用的企業級Java開發人員迅速采用它作為一個輕量級的替代方案。J2EE棧雖然功能強大,但許多人認為它過於龐大,甚至許多特性從未被應用程序開發團隊使用過。此外,J2EE應用程序強制用戶使用成熟的(和沈重的)Java應用程序服務器來部署自己的應用程序。

Spring框架的迷人之處在於它能夠與時俱進並進行自我改造——它已經向開發社區證明了這一點。Spring團隊發現,許多開發團隊正在從將應用程序的展現、業務和數據訪問邏輯打包在一起並部署為單個制品的單體應用程序模型中遷移,正轉向高度分布式的模型,服務能夠被構建成可以輕松部署到雲端的小型分布式服務。為了響應這種轉變,Spring開發團隊啟動了兩個項目,即Spring Boot和Spring Cloud。

Spring Boot是對Spring框架理念重新思考的結果。雖然Spring Boot包含了Spring的核心特性,但它剝離了Spring中的許多“企業”特性,而提供了一個基於Java的、面向REST[1]的微服務框架。只需一些簡單的註解,Java開發者就能夠快速構建一個可打包和部署的REST 微服務,這個微服務並不需要外部的應用容器。

註意雖然本文會在以後章節中更詳細地介紹REST,但REST背後最為核心的概念是,服務應該使用HTTP動詞(GET、POST、PUT和DELETE)來代表服務中的核心操作,並且使用輕量級的面向Web的數據序列化協議(如JSON)來從服務請求數據和從服務接收數據。

在構建基於雲的應用時,微服務已經成為更常見的架構模式之一,因此Spring社區為開發者提供了Spring Cloud。Spring Cloud框架使實施和部署微服務到私有雲或公有雲變得更加簡單。Spring Cloud在一個公共框架之下封裝了多個流行的雲管理微服務框架,並且讓這些技術的使用和部署像為代碼添加註解一樣簡便。本文隨後將介紹Spring Cloud中的不同組件。

1.4 在本書中讀者會學到什麽

本書是關於使用Spring Boot和Spring Cloud構建基於微服務架構的應用程序的,這些應用程序可被部署到公司內運行的私有雲或Amazon、Google或Pivotal等運行的公有雲上。在本文中,我們將介紹一些實際的例子。

●微服務是什麽以及構建基於微服務的應用程序的設計考慮因素。

●什麽時候不應該構建基於微服務的應用程序。

●如何使用Spring Boot框架來構建微服務。

●支持微服務應用程序的核心運維模式,特別是基於雲的應用程序。

●如何使用Spring Cloud來實現這些運維模式。

●如何利用所學到的知識,構建一個部署管道,將服務部署到內部管理的私有雲或公有雲廠商所提供的環境中。

閱讀完這本文,讀者將具備構建和部署基於Spring Boot的微服務所需的知識,明白實施微服務的關鍵設計決策,了解服務配置管理、服務發現、消息傳遞、日誌記錄和跟蹤以及安全性等如何結合在一起,以交付一個健壯的微服務環境,最後讀者還會看到如何在私有雲或公有雲中部署微服務。

1.5 為什麽本書與你有關

如果你已經仔細閱讀了本書前面的內容,那麽我假設你:

●是一名Java開發者;

●擁有Spring的背景;

●對學習如何構建基於微服務的應用程序感興趣;

●對如何使用微服務來構建基於雲的應用程序感興趣;

●想知道Java和Spring是否是用於構建基於微服務的應用程序的相關技術;

●有興趣了解如何將基於微服務的應用部署到雲上。

我寫本書出於兩個原因。第一,我已經看過許多關於微服務概念方面的好書,但我並沒有發現一本如何基於Java實現微服務的好書。雖然我總是認為自己是一個精通多門編程語言的人,但Java是我的核心開發語言,Spring是我構建一個新應用程序時要使用的開發框架。第一次發現Spring Boot和Spring Cloud,我便被其迷住了。當我構建運行在雲上的基於微服務的應用程序時,Spring Boot和Spring Cloud極大地簡化了我的開發生活。

第二,由於我在職業生涯中一直是架構師和工程師,很多次我都發現,我購買的技術書往往是兩個極端,它們要麽是概念性的,缺乏具體代碼示例,要麽是特定框架或者編程語言的機械概覽。我想要的是這樣一本書:它是架構和工程學科之間良好的橋梁與媒介。在這本書中,我想向讀者介紹微服務的開發模式以及如何在實際應用程序開發中使用它們,然後使用Spring Boot和Spring Cloud來編寫實際的、易於理解的代碼示例,以此來支持這些模式。

讓我們轉移一下註意力,使用Spring Boot構建一個簡單的微服務。

1.6 使用Spring Boot來構建微服務

我一直以來都持有這樣一個觀點:如果一個軟件開發框架通過了被我親切地稱為“卡內爾猴子測試”[2]的試驗,我就認為它是經過深思熟慮和易於使用的。如果一只像我(作者)這樣的“猴子”能夠在10 min或者更少時間內弄明白一個框架,那麽這個框架就通過了這個試驗。這就是我第一次寫Spring Boot服務示例的感覺。我希望讀者也有同樣的體驗和快樂,所以,讓我們花一點兒時間,看看如何使用Spring編寫一個簡單的“Hello World”REST服務。

在本節中,我們不會詳細介紹大部分代碼。這個例子的目標是讓讀者體會一下編寫Spring Boot服務的感受。第2章中會深入更多的細節。

圖1-3展示了這個服務將會做什麽,以及Spring Boot微服務將會如何處理用戶請求的一般流程。

技術分享圖片

圖1-3 Spring Boot抽象出了常見的REST微服務任務(路由到業務邏輯、從URL中解析HTTP參數、JSON與對象相互映射),並讓開發人員專註於服務的業務邏輯

這個例子並不詳盡,甚至沒有說明應該如何構建一個生產級別的微服務,但它同樣值得我們註意,因為它只需要寫很少的代碼。在第2章之前,我不打算介紹如何設置項目構建文件或代碼的細節。如果讀者想要查看Maven pom.xml文件以及實際代碼,可以在第1章對應的代碼中找到它。文中的所有源代碼都能在GitHub存儲庫找到。

註意:

在嘗試運行本書各章的代碼示例之前,一定要先閱讀附錄A。附錄A涵蓋本書中所有項目的一般項目布局、運行構建腳本的方法以及啟動Docker環境的方法。本文中的代碼示例很簡單,旨在從桌面直接運行,而不需要其他章的信息。但在後面的幾章中,將很快開始使用Docker來運行本文中使用的所有服務和基礎設施。如果讀者還沒有閱讀附錄A中與設置桌面環境相關的內容,請不要過多自行嘗試,避免浪費時間和精力。

在這個例子中,創建一個名為Application的Java類(在simpleservice/src/com/thoughtmechanix/application/simpleservice/Application.java的Java類,它公開了一個名為/hello的REST端點。Application類的代碼,如代碼清單1-1所示。

代碼清單1-1 使用Spring Boot的Hello World:一個簡單的Spring微服務

package com.thoughtmechanix.simpleservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PathVariable;
@SpringBootApplication  ?--- 告訴Spring Boot框架,該類是Spring Boot服務的入口點
@RestController  ?--- 告訴Spring Boot,要將該類中的代碼公開為Spring RestController類
@RequestMapping(value="hello")  ?--- 此應用程序中公開的所有URL將以/ hello前綴開頭
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping(value="/{firstName}/{lastName}",  ?---  Spring Boo公開為一個基於GET方法的REST端點,它將使用兩個參數,即firstName和lastName
? method = RequestMethod.GET)
public String hello( @PathVariable("firstName") String firstName,   ?--- 將URL中傳入的firstName和lastName參數映射為傳遞給hello方法的兩個變量
? @PathVariable("lastName") String lastName) {
return String.format("{\"message\":\"Hello %s %s\"}",  ?--- 返回一個手動構建的簡單JSON字符串。在第2章中,我們不需要創建任何JSON
? firstName, lastName);
}
}

代碼清單1-1中主要公開了一個GET HTTP端點,該端點將在URL上取兩個參數(firstName和lastName),然後返回一個包含消息“Hello firstName lastName”的凈荷的簡單JSON字符串。如果在服務上調用了端點/hello/john/carnell,返回的結果(馬上展示)將會是:

{"message":"Hello john carnell"}

讓我們啟動服務。為此,請轉到命令提示符並輸入以下命令:

mvn spring-boot:run

這條mvn命令將使用Spring Boot插件,然後使用嵌入式Tomcat服務器啟動應用程序。

Java與Groovy以及Maven與Gradle

Spring Boot框架對Java和Groovy編程語言提供了強力的支持。可以使用Groovy構建微服務,而無需任何項目設置。Spring Boot還支持Maven和Gradle構建工具。我將本文中的例子限制在Java和Maven中。作為一個長期的Groovy和Gradle的愛好者,我對語言和構建工具有良好的尊重,但為了保持本文的可管理性,並使內容更聚焦,我選擇使用Java和Maven,以便於照顧到盡可能多的讀者。

如果一切正常開始,在命令行窗口中應該看到圖1-4所示的內容。

技術分享圖片

圖1-4 Spring Boot服務將通過控制臺與公開的端點和服務端口進行通信

檢查圖1-4中的內容,註意兩件事。首先,端口8080上啟動了一個Tomcat服務器;其次,在服務器上公開了/hello/{firstName}/{lastName}的GET端點。

這裏將使用名為POSTMAN的基於瀏覽器的REST工具來調用服務。許多工具(包括圖形和命令行)都可用於調用基於REST的服務,但是本文中的所有示例都使用POSTMAN。圖1-5展示了POSTMAN調用http://localhost:8080/ hello/john/carnell端點並從服務中返回結果。

顯然,這個簡單的例子並不能演示Spring Boot的全部功能。但是,我們應該註意到,在這裏只使用了25行代碼就編寫了一個完整的HTTP JSON REST服務,其中帶有基於URL和參數的路由映射。正如所有經驗豐富的Java開發人員都會告訴你的那樣,在25行Java代碼中編寫任何有意義的東西都是非常困難的。雖然Java是一門強大的編程語言,但與其他編程語言相比,它卻獲得了啰嗦冗長的名聲。

技術分享圖片

圖1-5 /hello端點的響應,以JSON凈荷的形式展示了請求的數據

完成了Spring Boot的簡短介紹,現在必須提出這個問題:我們可以使用微服務的方式編寫應用程序,這是否意味著我們就應該這麽做呢?在下一節中,將介紹為什麽以及何時適合使用微服務方法來構建應用程序。


本文摘自《Spring微服務實戰》

技術分享圖片

《Spring微服務實戰》

[美]約翰?卡內爾(John Carnell)著

京東購書 當當購書 異步社區購書

本書詳細介紹了微服務架構下Spring體系(Spring ->Spring Boot->Spring Cloud),幫助 Java 開發人員快速拆分單體應用,並對微服務的全生命流程進行了封裝,大大簡化了開發流程。

本書在構建和部署Spring雲應用程序的同時,讓讀者掌握如何進行微服務設計。整本書是一個完整的例子,傳授作者多年的寶貴經驗。

更多微服務構架新書書單

技術分享圖片

點擊查看或者掃碼識別

今日話題

5月異步新書你最期待哪一本?為什麽?截止時間5月14日17時,留言+轉發本活動到朋友圈,小編將抽獎選出3名讀者贈送紙書1本和2張e讀版100元異步社區代金券,(留言點贊最多的自動獲得一張)。異步圖書後臺回復“5月新書”進入新書交流群,獲得第一手新書信息,點擊此處直接參加活動。


技術分享圖片

推薦閱讀

2018年5月新書書單(文末福利)

2018年4月新書書單

異步圖書最全Python書單

一份程序員必備的算法書單

第一本Python神經網絡編程圖書


技術分享圖片

長按二維碼,可以關註我們喲

每天與你分享IT好文。


在“異步圖書”後臺回復“關註”,即可免費獲得2000門在線視頻課程;推薦朋友關註根據提示獲取贈書鏈接,免費得異步e讀版圖書一本。趕緊來參加哦!

點擊閱讀原文,購買《Spring微服務實戰》

閱讀原文


“Spring三劍客”,助你快速從月入過萬的程序員到年薪百萬的架構師