目前,Spring Boot+Spring Cloud架構(gòu)已經(jīng)成為Java程序員的必備技能之一,剛開始學(xué)習(xí)時(shí)看到琳瑯滿目的Spring全家桶,可能會(huì)感到無從下手。如果只了解微服務(wù)中的各知識(shí)點(diǎn),而忽略了以微服務(wù)分布式架構(gòu)的方式學(xué)習(xí)系統(tǒng)的架構(gòu)順序,初學(xué)者可能就不知道如何使用微服務(wù)構(gòu)建分布式系統(tǒng)。為了使讀者更快掌握Spring Boot+SpringCloud的基礎(chǔ)知識(shí)與架構(gòu)方法,本文的章節(jié)順序即應(yīng)用系統(tǒng)的架構(gòu)順序。
分布式可以理解為人體器官,人體可看成分布式系統(tǒng),大腦是注冊(cè)中心的集群,四肢與器官是提供服務(wù)的微服務(wù),前進(jìn)的距離是微服務(wù)運(yùn)行之后的返回值,消耗的體力是微服務(wù)中處理的邏輯,影響的記憶是某些微服務(wù)對(duì)數(shù)據(jù)庫(kù)的增刪改查。分布式可看成一種思想,而Spring Cloud 與 Spring Boot是實(shí)現(xiàn)了這種思想的工具。
無論多復(fù)雜的分布式應(yīng)用程序,整合多少個(gè)服務(wù)器,調(diào)用多少種服務(wù)接口,使用多少種協(xié)議,使用集群還是高可用的何種架構(gòu)方式,使用客戶端還是服務(wù)端的何種負(fù)載均衡,使用哪個(gè)消息中間件、哪個(gè)數(shù)據(jù)庫(kù)集群,使用搜索引擎/非關(guān)系型數(shù)據(jù)庫(kù)/時(shí)序性數(shù)據(jù)庫(kù)/關(guān)系型數(shù)據(jù)庫(kù)/文件管理等多少種存儲(chǔ)介質(zhì),其分布式本質(zhì)都是分布式自身的思想。建議讀者動(dòng)手將本文實(shí)例都敲在IDE中,在Linux服務(wù)器上搭建各集群,那么上面那些看起來頗具難度的問題,都將不會(huì)是難題。
目錄

篇幅限制就展示了部分內(nèi)容,需要完整版的小伙伴可以添加此微信 maxiaoye5397 獲取
主要內(nèi)容
介紹微服務(wù)分布式的相關(guān)概念,搭建第一個(gè)微服務(wù)項(xiàng)目,了解微服務(wù)項(xiàng)目的運(yùn)行過程。通過微服務(wù)整合Consul注冊(cè)中心,搭建第一個(gè)微服務(wù)+注冊(cè)中心的分布式系統(tǒng)。多個(gè)微服務(wù)與Consul注冊(cè)中心相連,彼此通信,微服務(wù)獲得彼此的接口及地址,調(diào)用彼此的接口與服務(wù)。
然后無可避免地需要處理彼此通信時(shí)報(bào)錯(cuò)的情況,以免單一微服務(wù)無法正常提供服務(wù),導(dǎo)致整個(gè)分布式系統(tǒng)的癱瘓。此時(shí)采用Ribbon客戶端負(fù)載均衡方案,依靠多臺(tái)服務(wù)器部署多個(gè)相同微服務(wù)項(xiàng)目,以提高系統(tǒng)的性能。在分布式通信不足以解決全部報(bào)錯(cuò)問題時(shí),可選擇Hystrix 進(jìn)行更精細(xì)劃分,保證在任何一臺(tái)微服務(wù)出現(xiàn)問題時(shí),系統(tǒng)整體仍然能正常運(yùn)行。
至此初步搭建了分布式系統(tǒng),然后開始增加微服務(wù)的增刪改查等業(yè)務(wù)功能。在系統(tǒng)處理增刪改查過程的同時(shí),還需要事務(wù)功能的支撐與管理。在初步增刪改查后,依靠微服務(wù)的緩存增加微服務(wù)的性能,同時(shí)需要確保Redis與MySQL之間的增刪改查一致性。另外,如果有特殊業(yè)務(wù)需求,可由分布式消息通信彼此協(xié)作、溝通、處理。
在處理基本業(yè)務(wù)后,還會(huì)有定時(shí)任務(wù)等業(yè)務(wù)需求,此時(shí)需要微服務(wù)的任務(wù)調(diào)度進(jìn)行處理。而單節(jié)點(diǎn)任務(wù)調(diào)度的微服務(wù)可能會(huì)有宕機(jī)或重復(fù)執(zhí)行等相關(guān)問題,只有使多臺(tái)微服務(wù)同時(shí)進(jìn)行任務(wù)調(diào)度,且彼此協(xié)同的情況下,才能解決此類問題。這時(shí)需要 Quartz分布式任務(wù)調(diào)度解決多個(gè)任務(wù)調(diào)度間彼此協(xié)同、相互管理等問題。若有文件上傳、下載等相關(guān)需求,需要使用微服務(wù)的文件上傳管理。單節(jié)點(diǎn)文件上傳可能存在磁盤空間不足或不易管理等問題,需要 FastDFS 分布式文件管理以解決多臺(tái)文件管理服務(wù)器彼此協(xié)同、磁盤擴(kuò)容等問題。
第1章微服務(wù)分布式架構(gòu)設(shè)計(jì)原理;
本章1.3節(jié)利用Spring Boot創(chuàng)建了第一個(gè)微服務(wù)應(yīng)用程序。1.5節(jié)將該應(yīng)用程序的端口號(hào)修改為9090。1.7節(jié)將該應(yīng)用程序的properties配置文件修改成了YAML配置文件。1.8節(jié)通過單配置文件讓工程適應(yīng)多應(yīng)用場(chǎng)景。1.9節(jié)通過多配置文件使工程適應(yīng)多環(huán)境進(jìn)行開發(fā)。
在實(shí)際工程中,分布式的環(huán)境集成經(jīng)常會(huì)使用多環(huán)境配置,多環(huán)境配置是微服務(wù)十分重要的部分。另外,在實(shí)際工程中建議多運(yùn)用bootstrap.yml 和 bootstrap.properties 文件,以方便日后維護(hù)。

第2章分布式的注冊(cè)中心;
2.3 節(jié)初步認(rèn)識(shí)了 Consul 注冊(cè)中心,并且搭建了 Consul 注冊(cè)中心的集群,使 Consul注冊(cè)中心可以更加良好地運(yùn)行。
2.4節(jié)使用Spring Cloud整合了Consul進(jìn)行注冊(cè)并獲得其他服務(wù)的注冊(cè)地址。
2.5節(jié)使用Spring Cloud整合了Consul的Config功能,可以通過Java代碼獲取Consul上的配置參數(shù),方便多個(gè)微服務(wù)工程管理相同的配置信息。
在得到了其他微服務(wù)信息后,第3章將介紹使用Feign框架通過Consul注冊(cè)中心調(diào)用其他微服務(wù)接口。

第3章分布式的通信;
基于微服務(wù)的分布式架構(gòu),本章使用 Feign 達(dá)到多個(gè)微服務(wù)互相通信的目的。當(dāng)調(diào)用Server端出現(xiàn)異常時(shí),通過Feign降級(jí)回退函數(shù)返回。
微服務(wù)集成Swagger減少了多個(gè)程序員之間的溝通成本,在某程序員提供Swagger UI后,其他程序員可以直接了解接口地址、名稱、入?yún)?、返回值等信息。在得到其他接口的信息后,通過Feign Client端可以調(diào)用Server端微服務(wù)提供的接口。Feign的攔截器在Feign Client端調(diào)用其他Server接口時(shí),對(duì)本次請(qǐng)求統(tǒng)一處理。
如果Feign Client端調(diào)用的Server端發(fā)生了報(bào)錯(cuò)現(xiàn)象,F(xiàn)eign的Fallback類和Feign的Fallback 工廠分別用降級(jí)回退類與降級(jí)回退工廠,直接將本次請(qǐng)求通過降級(jí)函數(shù)回退給前臺(tái),不會(huì)造成線程的阻塞。
如果Feign Client端調(diào)用的Server端發(fā)生超時(shí)現(xiàn)象,可通過配置Feign內(nèi)置的Ribbon負(fù)載均衡器進(jìn)行解決。一旦 Server 端發(fā)生超時(shí)現(xiàn)象,F(xiàn)eign 都會(huì)直接將本次請(qǐng)求通過降級(jí)函數(shù)回退給前臺(tái),不會(huì)造成線程的阻塞。

第4章分布式的客戶端負(fù)載均衡;
通過將多個(gè)微服務(wù)使用相同的微服務(wù)名稱注冊(cè)在同一個(gè)注冊(cè)中心上,F(xiàn)eign Client可以使用Ribbon根據(jù)算法調(diào)用其中任何一個(gè)微服務(wù),通過多臺(tái)服務(wù)器提高應(yīng)用程序的并發(fā)承受能力。在分布式架構(gòu)中,分布式通信是最重要的環(huán)節(jié)之一,注冊(cè)中心保證分布式能夠得到相關(guān)的通信地址,客戶端負(fù)載均衡減小了分布式通信的并發(fā)壓力。

第5章分布式的斷路器;
5.2節(jié)實(shí)現(xiàn)了更高級(jí)的降級(jí)回退方式,在一個(gè)函數(shù)中使用多個(gè)Feign Client的Service,若有任何異常,整個(gè)函數(shù)都會(huì)回退到降級(jí)函數(shù)中。
5.4節(jié)實(shí)現(xiàn)了在調(diào)用某個(gè)函數(shù)后,將該函數(shù)的返回結(jié)果作為緩存,以防多次調(diào)用產(chǎn)生高并發(fā),用“函數(shù)名+入?yún)ⅰ钡男问阶鳛?Key 值,將返回結(jié)果作為 Value 值緩存。在一個(gè)函數(shù)中使用多個(gè)Feign Client的Service,以減小多個(gè)微服務(wù)之間溝通的并發(fā)壓力。
5.5節(jié)實(shí)現(xiàn)了在多次調(diào)用某個(gè)函數(shù)后,將多個(gè)線程合并成一個(gè)線程進(jìn)行調(diào)用,減小了系統(tǒng)內(nèi)存和線程并發(fā)數(shù)量的壓力。在一個(gè)函數(shù)中使用某個(gè)Feign Client的Service,將多次得到的ID合并成一個(gè)List對(duì)其他微服務(wù)進(jìn)行請(qǐng)求,減小多個(gè)微服務(wù)之間溝通的并發(fā)壓力。
5.6節(jié)利用Hystrix自帶的Dashboard性能監(jiān)控儀表盤頁面和性能監(jiān)控控件,監(jiān)控其他微服務(wù)的Hystrix線程池,包括Hystrix線程池目前的剩余線程數(shù)目、線程池容量、并發(fā)情況、運(yùn)行情況、執(zhí)行次數(shù)等。
其實(shí)Hystrix自帶的Dashboard儀表盤使用方法十分簡(jiǎn)單,在需要被監(jiān)控的微服務(wù)中通過application資源配置文件打開被調(diào)用地址,通過@Bean注解將性能控件相關(guān)內(nèi)容配置在 Spring 容器上,監(jiān)控端Dashboard 儀表盤使用@EnableHystrix-Dashboard注解開啟頁面,并在頁面上調(diào)用Hystrix性能控件的相關(guān)地址即可。
分布式的三大劍客:注冊(cè)中心Consul(包括通信Feign)、微服務(wù)Spring Application、斷路器Hystrix已經(jīng)全部介紹完成。一般在分布式系統(tǒng)搭建初期,先要搭建三個(gè)基本要素,再在每個(gè)微服務(wù)中增加增刪改查等業(yè)務(wù)邏輯。

第6章微服務(wù)的異步線程池;
異步線程池是一個(gè)底層實(shí)現(xiàn)復(fù)雜但使用方法非常簡(jiǎn)單的技術(shù),優(yōu)雅停止異步線程池的測(cè)試執(zhí)行過程則比較復(fù)雜。此處要注意每個(gè)細(xì)節(jié),尤其是在優(yōu)雅停止異步線程池且執(zhí)行完成所有應(yīng)該執(zhí)行的線程后,線程池中的線程數(shù)目是否正確歸零。
如果想了解更多關(guān)于優(yōu)化異步線程池的內(nèi)容,可參考Java自帶的線程池、Java第三方線程池、Java并發(fā)編程等相關(guān)內(nèi)容。不論用Java自帶的線程池,還是第三方開源的線程池,對(duì)于異步線程池來說都只是不同的實(shí)現(xiàn)而已,并無區(qū)別。因?yàn)槊糠N線程池的優(yōu)雅停止實(shí)現(xiàn)都不相同,所以每種不同實(shí)現(xiàn)出來的異步線程池的優(yōu)雅停止也不同。

第7章微服務(wù)整合持久化數(shù)據(jù)源;
本章通過Spring Boot微服務(wù)整合MyBatis注解和JPA注解,達(dá)到操作數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作的效果。
由于JPA注解、MyBatis注解的分頁和多表十分類似,本章不再重復(fù)介紹。通過運(yùn)用7.2節(jié)和7.4節(jié)中的@Select、@Query等注解,可了解利用注解進(jìn)行數(shù)據(jù)庫(kù)開發(fā)的思想。

第8章微服務(wù)事務(wù);
通過8.2節(jié)的實(shí)例更加完整地了解@Transational注解,包括該注解在@Service層對(duì)多個(gè)dao層的應(yīng)用方式,擴(kuò)展了第7章的內(nèi)容,希望通過本章可以使讀者更加清晰地理解事務(wù)的使用方式、傳播行為、隔離級(jí)別等內(nèi)容。

第9章微服務(wù)的緩存與分布式的消息通信;
Redis是最簡(jiǎn)潔的非關(guān)系型緩存數(shù)據(jù)庫(kù),在實(shí)際工作中使用較多。9.2節(jié)與9.6節(jié)分別使用Spring Data Redis與Spring Cache整合Redis以實(shí)現(xiàn)緩存的增刪改查操作。
9.5節(jié)使用Redis作為消息通信中間件進(jìn)行多個(gè)微服務(wù)之間的通信。

第10章微服務(wù)的任務(wù)調(diào)度與分布式的任務(wù)調(diào)度;
10.1節(jié)整合了單點(diǎn)任務(wù)調(diào)度,10.4節(jié)整合了分布式任務(wù)調(diào)度,以此介紹了任務(wù)調(diào)度的分布式方法。
Quartz使用方法十分簡(jiǎn)捷,在實(shí)際項(xiàng)目中也可以使用其他分布式解決方案的框架。其實(shí)更重要的是理解任務(wù)調(diào)度的分布式原理,而非死記硬背API。

第11章微服務(wù)的文件上傳與分布式文件管理;
11.2節(jié)實(shí)現(xiàn)了微服務(wù)文件上傳,11.7節(jié)實(shí)現(xiàn)了微服務(wù)的分布式上傳。
11.5.4 節(jié)介紹了分布式上傳的原理,以及微服務(wù)的即將上傳服務(wù)器、文件服務(wù)器分割成兩個(gè)服務(wù)器進(jìn)行操作。FastDFS安裝較為復(fù)雜,可參考相關(guān)書籍。

第12章擴(kuò)展與部署;
本章拓展了分布式架構(gòu)的相關(guān)方案,總結(jié)了本文前幾章未涉及的Spring Boot與Spring Cloud框架擴(kuò)展內(nèi)容。

這份筆記共有413頁,需要完整版的小伙伴,可以添加此微信 maxiaoye5397 獲取??!