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

​​​點擊關注異步圖書,置頂公衆號html

天天與你分享IT好書 技術乾貨 職場知識java

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

——異步小編web

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

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

並稱「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微服務實戰》

​閱讀原文

相關文章
相關標籤/搜索