好問題必須配認(rèn)真的回答,仔細(xì)的看了題主的問題,發(fā)現(xiàn)這個(gè)問題非常具有代表性,可能是廣大網(wǎng)友想使用 Spring Cloud 卻又對 Spring Cloud 不太了解的共同想法,題主對 Spring Cloud 使用的方方面面都進(jìn)行過了思考,包括市場,學(xué)習(xí)、前后端、測試、配置、部署、開發(fā)以及運(yùn)維,下面就是題主原本的問題:
想在公司推廣 Spring Cloud,但我對這項(xiàng)技術(shù)還缺乏了解,畫了一張腦圖,總結(jié)了種種問題。
微服務(wù)是這樣一個(gè)結(jié)構(gòu)嗎?
前端或二方 - > ng 集群 -> zuul 集群 -> eureka-server 集群 -> service provider 集群
(二方指其他業(yè)務(wù)部門)
想要明白這個(gè)問題,首先需要知道什么是 Spring Boot,什么是 Spring Cloud,以及兩者之間有什么關(guān)系?
什么是 Spring Boot
Spring Boot 簡化了基于 Spring 的應(yīng)用開發(fā),通過少量的代碼就能創(chuàng)建一個(gè)獨(dú)立的、產(chǎn)品級別的 Spring 應(yīng)用。Spring Boot 為 Spring 平臺及第三方庫提供開箱即用的設(shè)置,這樣你就可以有條不紊地開始。多數(shù) Spring Boot 應(yīng)用只需要很少的 Spring 配置。Spring Boot 是由 Pivotal 團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化新 Spring 應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。
用我的話來理解,就是 Spring Boot 其實(shí)不是什么新的框架,它默認(rèn)配置了很多框架的使用方式,就像 maven 整合了所有的jar包,Spring Boot 整合了所有的框架(不知道這樣比喻是否合適)。
Spring Boo t的核心思想就是約定大于配置,一切自動完成。采用 Spring Boot 可以大大的簡化你的開發(fā)模式,所有你想集成的常用框架,它都有對應(yīng)的組件支持。
什么是 Spring Cloud
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 Spring Boot 的開發(fā)風(fēng)格做到一鍵啟動和部署。
Spring 并沒有重復(fù)制造輪子,它只是將目前各家公司開發(fā)的比較成熟、經(jīng)得起實(shí)際考驗(yàn)的服務(wù)框架組合起來,通過 Spring Boot 風(fēng)格進(jìn)行再封裝屏蔽掉了復(fù)雜的配置和實(shí)現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂、易部署和易維護(hù)的分布式系統(tǒng)開發(fā)工具包。
微服務(wù)是可以獨(dú)立部署、水平擴(kuò)展、獨(dú)立訪問(或者有獨(dú)立的數(shù)據(jù)庫)的服務(wù)單元,Spring Cloud 就是這些微服務(wù)的大管家,采用了微服務(wù)這種架構(gòu)之后,項(xiàng)目的數(shù)量會非常多,Spring Cloud 做為大管家就需要提供各種方案來維護(hù)整個(gè)生態(tài)。
Spring Cloud 就是一套分布式服務(wù)治理的框架,既然它是一套服務(wù)治理的框架,那么它本身不會提供具體功能性的操作,更專注于服務(wù)之間的通訊、熔斷、監(jiān)控等。因此就需要很多的組件來支持一套功能。
Spring Boot 和 Spring Cloud 的關(guān)系
Spring Boot 是 Spring 的一套快速配置腳手架,可以基于 Spring Boot 快速開發(fā)單個(gè)微服務(wù),Spring Cloud 是一個(gè)基于 Spring Boot 實(shí)現(xiàn)的云應(yīng)用開發(fā)工具;Spring Boot 專注于快速、方便集成的單個(gè)微服務(wù)個(gè)體,Spring Cloud 關(guān)注全局的服務(wù)治理框架;Spring Boot 使用了默認(rèn)大于配置的理念,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基于 Spring Boot 來實(shí)現(xiàn),可以不基于 Spring Boot 嗎?不可以。
Spring Boot 可以離開 Spring Cloud 獨(dú)立使用開發(fā)項(xiàng)目,但是 Spring Cloud 離不開 Spring Boot,屬于依賴的關(guān)系。
● Spring -> Spring Boot > Spring Cloud 這樣的關(guān)系。
回答
首先樓主問的這些問題都挺好的,算是經(jīng)過了自己的一番思考,我恰好經(jīng)歷了你所說的中小公司,且都使用 Spring Cloud 并且已經(jīng)投產(chǎn)上線。第一家公司技術(shù)開發(fā)人員 15 人左右,項(xiàng)目實(shí)例 30 多,第二家公司開發(fā)人員 100 人左右,項(xiàng)目實(shí)例達(dá) 160 多。
實(shí)話說 Spring Boot、Spring Cloud 仍在高速發(fā)展,技術(shù)生態(tài)不斷的完善和擴(kuò)張,不免也會有一些小的 bug,但對于中小公司的使用來將,完全可以忽略,基本都可以找到解決方案,接下來回到你的問題。
1、市場
據(jù)我所知有很多知名互聯(lián)網(wǎng)公司都已經(jīng)使用了 Spring Cloud,比如阿里、美團(tuán)但都是小規(guī)模,沒有像我經(jīng)歷的這倆家公司,業(yè)務(wù)線全部擁抱 Spring Cloud;另外 Spring Cloud 并不是一套高深的技術(shù),普通的 Java 程序員經(jīng)過一到倆個(gè)月完全就可以上手,但前期需要一個(gè)比較精通人的來帶隊(duì)。
2、學(xué)習(xí)
有很多種方式,現(xiàn)在 Spring Cloud 越來越火的情況下,各種資源也越來越豐富,查看官方文檔和示例,現(xiàn)在很多優(yōu)秀的博客在寫 Spirng cloud 的相關(guān)教程,我這里收集了一些 Spring Boot 和 Spring Cloud 的相關(guān)資源可以參考,找到博客也就找到人和組織了。
針對上面的技術(shù)我特意整理了一下,有很多技術(shù)不是靠幾句話能講清楚,所以干脆找朋友錄制了一些視頻,很多問題其實(shí)答案很簡單,但是背后的思考和邏輯不簡單,要做到知其然還要知其所以然。如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java進(jìn)階群:582505643,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。
3、前后職責(zé)劃分
其實(shí)這個(gè)問題是每個(gè)系統(tǒng)架構(gòu)都應(yīng)該考慮的問題,Spring Cloud 只是后端服務(wù)治理的一套框架,唯一和前端有關(guān)系的是 thymeleaf,Spring 推薦使用它做模板引擎。一般情況下,前端 app 或者網(wǎng)頁通過 zuul 來調(diào)用后端的服務(wù),如果包含靜態(tài)資源也可以使用 nginx 做一下代理轉(zhuǎn)發(fā)。
4、測試
Spring-boot-starter-test 支持項(xiàng)目中各層方法的測試,也支持 controller 層的各種屬性。所以一般測試的步奏是這樣,首先開發(fā)人員覆蓋自己的所有方法,然后測試微服務(wù)內(nèi)所有對外接口保證微服務(wù)內(nèi)的正確性,再進(jìn)行微服務(wù)之間集成測試,最后交付測試。
5、配置
session 共享有很多種方式,比如使用 tomcat sesion 共享機(jī)制,但我比較推薦使用 redis 緩存來做 session 共享。完全可以分批引入,我在上一家公司就是分批過渡上線,新舊項(xiàng)目通過 zuul 進(jìn)行交互,分批引入的時(shí)候,最好是新業(yè)務(wù)線先使用 Spring Cloud,老業(yè)務(wù)做過渡,當(dāng)完全掌握之后在全部替換。如果只是請求轉(zhuǎn)發(fā),zuul 的性能不一定比 nginx 低,但是如果涉及到靜態(tài)資源,還是建議在前端使用 nginx 做一下代理。另外 Spring Cloud 有配置中心,可以非常靈活的做所有配置的事情。
6、部署
多環(huán)境不同配置,Spring Boot 最擅長做這個(gè)事情了,使用不同的配置文件來配置不同環(huán)境的參數(shù),在服務(wù)啟動的時(shí)候指明某個(gè)配置文件即可,例如:java -jar app.jar --spring.profiles.active=dev 就是啟動測試環(huán)境的配置文件;Spring Cloud 沒有提供發(fā)布平臺,因?yàn)?jenkins 已經(jīng)足夠完善了,推薦使用 jenkins 來部署 Spring Boot 項(xiàng)目,會省非常多的事情;灰度暫時(shí)不支持,可能需要自己來做,如果有多個(gè)實(shí)例,可以一個(gè)一個(gè)來更新;支持混合部署,一臺機(jī)子部署多個(gè)是常見的事情。
7、開發(fā)
你說的包含 html 接口就是前端頁面吧,Spring Boot 可以支持,但其實(shí)也是 Spring Mvc 在做這個(gè)事情,Spring Cloud 只做服務(wù)治理,其它具體的功能都是集成了各種框架來解決而已;excel 報(bào)表可以,其實(shí)除過 swing 項(xiàng)目外,其它 Java 項(xiàng)目都可以想象;Spring Cloud 和老項(xiàng)目可以混合使用,通過 zuul 來支持。是否支持 callback,可以通過 MQ 來實(shí)現(xiàn),還是強(qiáng)調(diào) Spring Cloud 只是服務(wù)治理。
8、運(yùn)維
Turbine、zipkin 可以用來做熔斷和性能監(jiān)控;動態(tài)上下線某個(gè)節(jié)點(diǎn)可以通過 jenkins 來實(shí)現(xiàn);provider 下線后,會有其它相同的實(shí)例來提供服務(wù),Eureka 會間隔一段時(shí)間來檢測服務(wù)的可用性;不同節(jié)點(diǎn)配置不同的流量權(quán)值目前還不支持。注冊中心必須做高可用集群,注冊中心掛掉之后,服務(wù)實(shí)例會全部停止。
總結(jié),中小企業(yè)是否能用的起來 Spring Cloud,完全取決于自己公司的環(huán)境,如果是一個(gè)技術(shù)活躍型的團(tuán)隊(duì)就大膽的去嘗試吧,目前 Spring Cloud 是所有微服務(wù)治理中最優(yōu)秀的方案,也是一個(gè)趨勢,未來一兩年可能就會像 Spring 一樣流行,早接觸早學(xué)習(xí)豈不更好。
希望能解答了你的疑問。
Spring Cloud 架構(gòu)
我們從整體來看一下 Spring Cloud 主要的組件,以及它的訪問流程
1、外部或者內(nèi)部的非 Spring Cloud 項(xiàng)目都統(tǒng)一通過 API 網(wǎng)關(guān)(Zuul)來訪問內(nèi)部服務(wù)
2、網(wǎng)關(guān)接收到請求后,從注冊中心(Eureka)獲取可用服務(wù)
3、由 Ribbon 進(jìn)行均衡負(fù)載后,分發(fā)到后端的具體實(shí)例
4、微服務(wù)之間通過 Feign 進(jìn)行通信處理業(yè)務(wù)
5、Hystrix 負(fù)責(zé)處理服務(wù)超時(shí)熔斷
6、Turbine 監(jiān)控服務(wù)間的調(diào)用和熔斷相關(guān)指標(biāo)
圖中沒有畫出配置中心,配置中心管理各微服務(wù)不同環(huán)境下的配置文件。
以上就是一個(gè)完整的 Spring Cloud 生態(tài)圖。