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