目前大家都在說微服務(wù),其實(shí)微服務(wù)不是一個(gè)名字,是一個(gè)架構(gòu)的概念,大家現(xiàn)在使用的基于RPC框架(dubbo、thrift等)架構(gòu)其實(shí)也能算作一種微服務(wù)架構(gòu)。
目前越來越多的公司開始使用微服務(wù)架構(gòu),所以在目前招聘java崗位時(shí),有springcloud經(jīng)驗(yàn)還是會(huì)占一點(diǎn)優(yōu)勢,今天young就和大家一起來學(xué)習(xí)Spring Cloud微服務(wù)框架。
本章,我們先解決新人都頭疼的一個(gè)問題,spring Cloud 與spring Boot到底是什么關(guān)系????
一 、什么是spring Boot
在講解什么是spring Boot之前,我們先可以思考一下,目前使用spring時(shí),有沒有感覺以下的兩個(gè)問題經(jīng)常被頻繁的吐槽
在過去的 Spring 發(fā)中,需要引入大量的 xml 文件。Spring 2.5 引入了包掃描,消除了顯式的配置 Bean。 Spring 3.0 又引入了基于 JavaBean 的配置,這種方式可以取代 xml 文件。
盡管如此,在實(shí)際的開發(fā)中還是需要配置 xml 文件,例如配 SpringMVC 事務(wù)管理器、過濾器、切面等等。在項(xiàng)目的開發(fā)過程中,會(huì)引入大量的第三方依賴,選擇依賴是一件不容易的事,解決依賴與依賴之間的沖突也很耗費(fèi)精力。所以,在以前的Spring開發(fā)中,依賴管理也是一件棘手的事情。
結(jié)合上面Spring的兩點(diǎn)瑕疵,我們在來總結(jié)一下,什么是SpringBoot:
Spring Boot并不是一個(gè)全新的框架,它不是spring解決方案的一個(gè)替代品,而是spring的一個(gè)封裝。所以,你以前可以用spring做的事情,現(xiàn)在用spring Boot都可以做。
Spring Boot是一種全新的編程規(guī)范,是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件和起步依賴,他的產(chǎn)生簡化了框架的使用,所謂簡化是指簡化了Spring眾多框架中所需的大量且繁瑣的配置文件。
二 、什么是spring Cloud
Spring Cloud是一個(gè)微服務(wù)框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系統(tǒng)解決方案,它依賴于 Spring Boot ,有快速開發(fā)、持續(xù)交付和容易部署等特點(diǎn)。
Spring Cloud不像其他Spring子項(xiàng)目那樣相對(duì)獨(dú)立,它是一個(gè)擁有諸多子項(xiàng)目的大型綜合項(xiàng)目。
三 、Spring Cloud與Spring Boot的對(duì)比
Spring Boot 是 Spring的一套快速配置腳手架,可以基于Spring Boot 快速開發(fā)單個(gè)微服務(wù);Spring Cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的云應(yīng)用開發(fā)工具;
Spring Boot專注于快速、方便集成的單個(gè)個(gè)體;Spring Cloud是關(guān)注全局的服務(wù)治理框架;
Spring Boot使用了默認(rèn)大于配置的理念,很多集成方案已經(jīng)幫你選擇好了,能不配置就不配置;Spring Cloud很大的一部分是基于Spring Boot來實(shí)現(xiàn)。
Spring Boot可以離開Spring Cloud獨(dú)立使用開發(fā)項(xiàng)目,但是SpringCloud離不開Spring Boot,屬于依賴的關(guān)系。
四、Spring Cloud的常用組件
Spring Cloud 提供了開發(fā)分布式微服務(wù)系統(tǒng)的一些常用組件,例如服務(wù)注冊和發(fā)現(xiàn)、配置中心、熔斷器、 智能路由 、微代理、控制總線、全局鎖、分布式會(huì)話等。
spring Cloud的子項(xiàng)目很多,但是目前在實(shí)際工作中,我們一般業(yè)務(wù)項(xiàng)目使用到的組件就是常規(guī)的幾個(gè),其它的一般開發(fā)用不到,做為新手,我們先熟悉常用且重要的幾個(gè)。
接下來的這8個(gè)常用組件的描述來自(方志朋的《深入理解Spring Cloud 與微服務(wù)構(gòu)建一書》)
(1)服務(wù)注冊和發(fā)現(xiàn)組件 Eureka
利用 Eureka 組件可以很輕松地實(shí)現(xiàn)服務(wù)的注冊和發(fā)現(xiàn)功能。 Eureka 組件提供了服務(wù)的健康監(jiān)測,以及界面友好的 UI 。通過 Eureka 組件提供的 UI, Eureka 組件可以讓開發(fā)人員隨時(shí)了解服務(wù)單元的運(yùn)行情況。另外 Spring Cloud 也支持 Consul 和Zookeepe ,用于注冊和發(fā)現(xiàn)服務(wù)。
(2)熔斷組件 Hystrix
Hystrix是一個(gè) 熔斷組件,它除了有一些基本的熔斷器功能外,還能夠?qū)崿F(xiàn)服務(wù)降級(jí)、服務(wù)限流的功能。另外 Hystrix 提供了熔斷器的健康監(jiān)測,以及熔斷器健康數(shù)據(jù)的 API 口。 Hystrix Dashboard 組件提供了單個(gè)服務(wù)熔斷器的健康狀態(tài)數(shù)據(jù)的界面展示功能,Hystrix Turbine 組件提供了多個(gè)服務(wù)的熔斷器的健康狀態(tài)數(shù)據(jù)的界面展示功能。
(3)負(fù)載均衡組件 Ribbon
Ribbon 是一個(gè)負(fù)載均衡組件,它通常和 Eureka 、Zuul、 RestTemplate、Feign 配合使用。Ribbon 和Zuul 配合,很容易做到負(fù)載均衡,將請(qǐng)求根據(jù)負(fù)載均衡策略分配到不同的服務(wù)實(shí)例中。Ribbon和RestTemplate、Feign配合,在消費(fèi)服務(wù)時(shí)能夠做到負(fù)載均衡。
(4)路由網(wǎng)關(guān) Zuul
路由網(wǎng)關(guān) Zuul 有智能路由和過濾的功能。內(nèi)部服務(wù)的 API 接口通過 Zuul 網(wǎng)關(guān)統(tǒng)一對(duì)外暴露,內(nèi)部服務(wù)的 API 接口不直接暴露,防止了內(nèi)部服務(wù)敏感信息對(duì)外暴露。在默認(rèn)的情況下,Zuul和Ribbon相結(jié)合,能夠做到負(fù)載均衡、智能路由。Zuul過濾功能是通過攔截請(qǐng)求來實(shí)現(xiàn)的,可以對(duì)一些用戶的角色和權(quán)限進(jìn)行判斷,起到安全驗(yàn)證的作用,同時(shí)也可以用于輸出實(shí)時(shí)的請(qǐng)求曰志。
上述的4個(gè)組件都來自于 Netflix 的公司,稱為 Spring Cloud Netflix。
(5)Spring Cloud Config
Spring Cloud Config 組件提供了配置文件統(tǒng)一管理的功能。Spring Cloud Config包括Server端和Client端,Server 端讀取本地倉庫或者遠(yuǎn)程倉庫的配置文件,所有的Client 向Server讀取配置信息,從而達(dá)到配置文件統(tǒng)一管理的目的。 通常情況下, Spring Cloud Config 和 Spring Cloud Bus 相互配合刷新指定 Client 或所有Client的配置文件。
(6) Spring Cloud Security
Spring Cloud Security 是對(duì) Spring Security 組件的封裝,Spring Cloud Security 向服務(wù)單元提供了用戶驗(yàn)證和權(quán)限認(rèn)證。一般來說,單獨(dú)在微服務(wù)系統(tǒng)中使用 Spring Cloud Security 是很少見的,一般它會(huì)配合 Spring Security 0Auth2 組件一起使用, 通過搭建授權(quán)服務(wù),驗(yàn)證 Token或者 JWT 這種形式對(duì)整個(gè)微服務(wù)系統(tǒng)進(jìn)行安全驗(yàn)證。
(7)Spring Cloud Sleuth
Spring Cloud Sleuth 是一個(gè)分布式鏈路追蹤組件,它封裝了 Dapper Zipkin 和 Kibana 等組件,通過它可以知道服務(wù)之間的相互依賴關(guān)系,并實(shí)時(shí)觀察鏈路的調(diào)用情況。
(8)Spring Cloud Stream
Spring Cloud Stream Spring Cloud 框架的數(shù)據(jù)流操作包,可以封裝 RabbitMq 、ActiveMq 、Kafka 、Redis 等消息組件,利用 Spring Cloud Stream 可以實(shí)現(xiàn)消息的接收和發(fā)送。
五、微服務(wù)相比單體服務(wù)的優(yōu)缺點(diǎn)
關(guān)于微服務(wù)的優(yōu)缺點(diǎn),我也不想用官網(wǎng)模板或者書上說的一大堆,young我也經(jīng)歷了從單體服務(wù)到微服務(wù)項(xiàng)目的過渡,接下來,我就從個(gè)人工作體會(huì)接地氣的講解一下微服務(wù)的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
新人上手快:新人在參與新項(xiàng)目時(shí),只需要下載需求相關(guān)模塊的代碼,了解這部分代碼就行了,不需要關(guān)注整個(gè)項(xiàng)目的代碼邏輯,可以減少上手時(shí)間。
本地調(diào)試快:以前修改一個(gè)功能,整個(gè)項(xiàng)目啟動(dòng),花費(fèi)時(shí)間很長?,F(xiàn)在只啟動(dòng)修改的單個(gè)模塊,啟動(dòng)很快。(不知道有沒有和我一樣,以前本地啟動(dòng)一個(gè)復(fù)雜項(xiàng)目花費(fèi)30s-60s,調(diào)試啟動(dòng)一次就能喝杯茶了)。
開發(fā)進(jìn)度加快:以前一個(gè)項(xiàng)目,多個(gè)人開發(fā),你改的代碼,影響我,我改的代碼影響你,某個(gè)人改了錯(cuò)誤代碼提交,整個(gè)項(xiàng)目都啟動(dòng)不了。微服務(wù)不同功能模塊,互不影響,你自己的鍋?zhàn)约罕场?/p>
測試難度降低: 單體應(yīng)用修改一個(gè)功能,很容易影響到其他功能,測試難度加大。
跨語言合作: 同一個(gè)項(xiàng)目不同的功能模塊可以使用不同語言開發(fā),java,js,php,隨心所欲。不同語言只需要提供 http 客戶端,便可以實(shí)現(xiàn)跨語言調(diào)用。
簡單的分庫: 同一個(gè)項(xiàng)目,不同模塊連接不同的數(shù)據(jù)庫,主要是配置簡單。(我們項(xiàng)目就連接3個(gè)不同的mysql業(yè)務(wù)數(shù)據(jù)庫,1個(gè)redis集群,1個(gè)mongo集群)。
服務(wù)集群擴(kuò)展容易 :現(xiàn)在springcloud做服務(wù)集群,節(jié)省資源,并且搭建速度快。比如項(xiàng)目中,資源服務(wù)功能模塊壓力大,運(yùn)維只要快速copy一份配置,部署一臺(tái)資源服務(wù)模塊的服務(wù)就行了,其它功能服務(wù)模塊不用管。
缺點(diǎn):
運(yùn)維人員壓力大: 單體應(yīng)用以前運(yùn)維同事只要監(jiān)控個(gè)一個(gè)應(yīng)用正常運(yùn)行,而現(xiàn)在卻需要保證幾十甚至上百個(gè)應(yīng)用運(yùn)轉(zhuǎn)正常,這是一個(gè)艱巨的任務(wù)。
事務(wù)、異步、測試面臨挑戰(zhàn):跨進(jìn)程之間的事務(wù)、大量的異步處理、多個(gè)微服務(wù)之間的整體測試都需要有一整套的解決方案,而現(xiàn)在看起來,這些技術(shù)并沒有成熟。
服務(wù)分割難度大:對(duì)于一個(gè)項(xiàng)目,如何進(jìn)行功能劃分,哪些功能歸屬同一個(gè)服務(wù)模塊,對(duì)架構(gòu)師和設(shè)計(jì)人員的要求較高。
如果你對(duì)我的文章感興趣,可以觀看更多我的文章
請(qǐng)點(diǎn)擊,前往我的博客:https://www.cnblogs.com/haly/