真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

基于SpringCloud的微服務(wù)架構(gòu)演變史-創(chuàng)新互聯(lián)

導(dǎo)讀

基于Spring Cloud的微服務(wù)架構(gòu)演變史

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括奎屯網(wǎng)站建設(shè)、奎屯網(wǎng)站制作、奎屯網(wǎng)頁(yè)制作以及奎屯網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,奎屯網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到奎屯省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

一段時(shí)期以來(lái) “微服務(wù)架構(gòu) ”一直是一個(gè)熱門詞匯,各種技術(shù)類公眾號(hào)或架構(gòu)分享會(huì)議上,關(guān)于微服務(wù)架構(gòu)的討論和主題也都非常多。對(duì)于大部分初創(chuàng)互聯(lián)網(wǎng)公司來(lái)說(shuō),早期的單體應(yīng)用結(jié)構(gòu)才是最合適的選擇,只有當(dāng)業(yè)務(wù)進(jìn)入快速發(fā)展期,在系統(tǒng)壓力、業(yè)務(wù)復(fù)雜度以及人員擴(kuò)展速度都快速上升的情況下,如何快速、穩(wěn)妥有序的將整個(gè)互聯(lián)網(wǎng)軟件系統(tǒng)升級(jí)成微服務(wù)架構(gòu),以滿足業(yè)務(wù)發(fā)展需要及技術(shù)組織的重新塑造,才是進(jìn)行微服務(wù)架構(gòu)的最主要的動(dòng)力,否則空談微服務(wù)架構(gòu)是沒(méi)有意義的。
而一旦決定將整個(gè)應(yīng)用體系按照微服務(wù)架構(gòu)體系進(jìn)行升級(jí),就需要有組織有計(jì)劃的進(jìn)行業(yè)務(wù)系統(tǒng)、基礎(chǔ)架構(gòu)、運(yùn)維體系等多個(gè)方面的升級(jí)配套。而另一個(gè)比較尷尬的現(xiàn)實(shí)是,一般業(yè)務(wù)發(fā)展進(jìn)入到需要進(jìn)行微服務(wù)架構(gòu)層面的時(shí)候,業(yè)務(wù)發(fā)展往往又都是非常迅猛的,這種業(yè)務(wù)快速發(fā)展和增長(zhǎng)的壓力往往又會(huì)給整個(gè)技術(shù)團(tuán)隊(duì)帶來(lái)非常大的挑戰(zhàn),因?yàn)榇藭r(shí)你需要取舍,是簡(jiǎn)單方案快速支撐呢?還是選擇適當(dāng)長(zhǎng)遠(yuǎn)一點(diǎn)的方案?當(dāng)然這種情況大部分是技術(shù)細(xì)節(jié)方面的問(wèn)題,掌控的“度”大部分情況是掌握在具體的工程師手中。
而如何整體上確保應(yīng)用體系及組織結(jié)構(gòu)向微服務(wù)時(shí)代快速、有序的跨越,是一件十分考驗(yàn)團(tuán)隊(duì)能力以及架構(gòu)管理水平的事。能做到80分已然算優(yōu)秀了,因?yàn)檫@是有其客觀規(guī)律的!
作者自身親歷了一個(gè)快速發(fā)展的互聯(lián)網(wǎng)公司從單體應(yīng)用~以Spring Cloud為技術(shù)棧的微服務(wù)架構(gòu)體系的全過(guò)程。本文將主要從技術(shù)角度與大家探討如何利用Spring Cloud進(jìn)行微服務(wù)架構(gòu)拆分,以及在這個(gè)過(guò)程中一點(diǎn)自己的思考。水平有限,不足之處還請(qǐng)包涵!

系統(tǒng)架構(gòu)演變概述

基于Spring Cloud的微服務(wù)架構(gòu)演變史

在公司業(yè)務(wù)初創(chuàng)時(shí)期,面對(duì)的主要問(wèn)題是如何將一個(gè)想法變成實(shí)際的軟件實(shí)現(xiàn),在這個(gè)時(shí)候整個(gè)軟件系統(tǒng)的架構(gòu)并沒(méi)有搞得那么復(fù)雜,為了快速迭代,整個(gè)軟件系統(tǒng)就是由“App+后臺(tái)服務(wù)”組成,而后臺(tái)服務(wù)也只是從工程角度將應(yīng)用進(jìn)行Jar包的拆分。此時(shí)軟件系統(tǒng)架構(gòu)如下:
基于Spring Cloud的微服務(wù)架構(gòu)演變史
而此時(shí)整個(gè)軟件系統(tǒng)的功能也比較簡(jiǎn)單,只有基本的用戶、訂單、支付等功能,并且由于業(yè)務(wù)流程沒(méi)有那么復(fù)雜,這些功能基本耦合在一起。而隨著App的受歡迎程度(作者所在的公司正好處于互聯(lián)網(wǎng)熱點(diǎn)),所以App下載量在2017年迅猛增長(zhǎng),在線注冊(cè)人數(shù)此時(shí)也是蹭蹭往上漲。
隨著流量的迅猛增長(zhǎng),此時(shí)整個(gè)后臺(tái)服務(wù)的壓力變得非常大,為了抗住壓力只能不斷的加機(jī)器,平行擴(kuò)展后臺(tái)服務(wù)節(jié)點(diǎn)。此時(shí)的部署架構(gòu)如下:
基于Spring Cloud的微服務(wù)架構(gòu)演變史
通過(guò)這種方式,整個(gè)軟件系統(tǒng)抗住了一波壓力,然而系統(tǒng)往往還是會(huì)偶爾出點(diǎn)事故,特別是因?yàn)锳PI中的某個(gè)接口性能問(wèn)題導(dǎo)致整個(gè)服務(wù)不可用,因?yàn)檫@些接口都在一個(gè)JVM進(jìn)程中,雖然此時(shí)部署了多個(gè)節(jié)點(diǎn),但因?yàn)榈讓訑?shù)據(jù)庫(kù)、緩存系統(tǒng)都是一套,所以還是會(huì)出現(xiàn)一掛全掛的情況。
另一方面,隨著業(yè)務(wù)的快速發(fā)展,以往相對(duì)簡(jiǎn)單的功能變得復(fù)雜起來(lái),這些功能除了有用戶看得見(jiàn)的、也會(huì)包括很多用戶看不見(jiàn)的,就好像百度搜索,用戶能看見(jiàn)的可能只是一個(gè)搜索框,但是實(shí)際上后臺(tái)對(duì)應(yīng)的服務(wù)可能是成百上千,如有些增長(zhǎng)策略相關(guān)的功能:紅包、分享拉新等。還有些如廣告推薦相關(guān)的變現(xiàn)功能等。
此外,流量/業(yè)務(wù)的增長(zhǎng)也意味著團(tuán)隊(duì)人數(shù)的迅速增長(zhǎng),如果此時(shí)大家開(kāi)發(fā)各自的業(yè)務(wù)功能還是用一套服務(wù)代碼,很難想象百十來(lái)號(hào)人,在同一個(gè)工程在疊加功能會(huì)是一個(gè)什么樣的場(chǎng)景。所以如何劃分業(yè)務(wù)邊界、合理的進(jìn)行團(tuán)隊(duì)配置也是一件十分迫切的事情了!
為了解決上述問(wèn)題,適應(yīng)業(yè)務(wù)、團(tuán)隊(duì)發(fā)展,架構(gòu)團(tuán)隊(duì)決定進(jìn)行微服務(wù)拆分。而要實(shí)施微服務(wù)架構(gòu),除了需要合理的劃分業(yè)務(wù)模塊邊界外,也需要一整套完整的技術(shù)解決方案。
在技術(shù)方案的選擇上,服務(wù)拆分治理的框架也是有很多,早期的有如WebService,近期的則有各種Rpc框架(如Dubbo、Thirft、Grpc)。而Spring Cloud則是基于Spring Boot提供的一整套微服務(wù)解決方案,因?yàn)榧夹g(shù)棧比較新,并且各類組件的支撐也非常全面,所以Spring Cloud就成為了選。
經(jīng)過(guò)一系列的重構(gòu)+擴(kuò)展,整個(gè)系統(tǒng)架構(gòu)最終形成了以APP為中心的一套微服務(wù)軟件系統(tǒng),結(jié)構(gòu)如下:
基于Spring Cloud的微服務(wù)架構(gòu)演變史
到這里,整個(gè)軟件系統(tǒng)就基于Spring Cloud初步完成了微服務(wù)體系的拆分。支付、訂單、用戶、廣告等核心功能抽離成獨(dú)立的微服務(wù),與此同時(shí)各自微服務(wù)對(duì)應(yīng)的數(shù)據(jù)庫(kù)也按照服務(wù)邊界進(jìn)行了拆分。
在完成服務(wù)的拆分以后,原來(lái)功能邏輯之間的代碼調(diào)用關(guān)系,轉(zhuǎn)換成了服務(wù)間網(wǎng)絡(luò)的調(diào)用關(guān)系,而各個(gè)微服務(wù)需要根據(jù)各自所承載的功能提供相應(yīng)的服務(wù),此時(shí)服務(wù)如何被其他服務(wù)發(fā)現(xiàn)并調(diào)用,就成了整個(gè)微服務(wù)體系中比較關(guān)鍵的部分,使用過(guò)Dubbo框架的同學(xué)知道,在Dubbo中服務(wù)的注冊(cè)&發(fā)現(xiàn)是依賴于ZooKeeper實(shí)現(xiàn)的,而在Spring Cloud中我們是通過(guò)Consul來(lái)實(shí)現(xiàn)。另外在基于Spring Cloud的架構(gòu)體系中,提供了配置中心(ConfigServer)來(lái)幫助各個(gè)微服務(wù)管理配置文件,而原本的API服務(wù),隨著各個(gè)功能的抽離,逐步演變成前置網(wǎng)關(guān)服務(wù)了。
聊到這里,基于Spring Cloud我們進(jìn)行了微服務(wù)拆分,而在這個(gè)體系結(jié)構(gòu)中,分別提到了Consul、ConfigServer、網(wǎng)關(guān)服務(wù)這幾個(gè)關(guān)鍵組件,那么這幾個(gè)關(guān)鍵組件具體是如何支撐這個(gè)龐大的服務(wù)體系的呢?

Spring Cloud關(guān)鍵組件

基于Spring Cloud的微服務(wù)架構(gòu)演變史

Consul
Consul是一個(gè)開(kāi)源的,使用Go語(yǔ)言開(kāi)發(fā)的注冊(cè)中心服務(wù)。它里面內(nèi)置了服務(wù)發(fā)現(xiàn)與注冊(cè)框架、分布一致性協(xié)議實(shí)現(xiàn)、健康檢查、Key/Value存儲(chǔ)、多數(shù)據(jù)中心等多個(gè)方案。在Spring Cloud框架中還可以選擇Eurke作為注冊(cè)中心,這里之所以選擇Consul主要原因在于Consul對(duì)異構(gòu)的服務(wù)的支持,如:gRPC服務(wù)。
事實(shí)上,在后續(xù)的系統(tǒng)架構(gòu)演進(jìn)中,在某些服務(wù)模塊進(jìn)一步向子系統(tǒng)化拆分的過(guò)程中,就采用了gRPC作為子系統(tǒng)服務(wù)間的調(diào)用方式。例如,支付模塊的繼續(xù)擴(kuò)張,對(duì)支付服務(wù)本身又進(jìn)行了微服務(wù)架構(gòu)的拆分,此時(shí)支付微服務(wù)內(nèi)部就采用了gRPC的方式進(jìn)行調(diào)用,而服務(wù)注冊(cè)與發(fā)現(xiàn)本身則還是依賴于同一套Consul集群。
此時(shí)的系統(tǒng)架構(gòu)演進(jìn)如下:

基于Spring Cloud的微服務(wù)架構(gòu)演變史
原有微服務(wù)架構(gòu)中的模塊服務(wù)在規(guī)模達(dá)到一定程度或復(fù)雜性達(dá)到一定程度后,都會(huì)朝著獨(dú)立的體系發(fā)展,從而將整個(gè)微服務(wù)的調(diào)用鏈路變的非常長(zhǎng),而從Consul的角度看,所有的服務(wù)又都是扁平的。
隨著微服務(wù)規(guī)模的越來(lái)越大,Consul作為整個(gè)體系的核心服務(wù)組件,在整個(gè)體系中處于關(guān)鍵的位置,一旦Consul掛掉,所有的服務(wù)都將停止服務(wù)。那么Consul到底是什么樣服務(wù)?其容災(zāi)機(jī)制又該如何設(shè)計(jì)呢?
要保證Consul服務(wù)的高可用,在生產(chǎn)環(huán)境Consul應(yīng)該是一個(gè)集群(關(guān)于Consul集群的安裝與配置可以參考網(wǎng)絡(luò)資料),這是毫無(wú)疑問(wèn)的。而在Consul集群中,存在兩種角色:Server、Client,這兩種角色與Consul集群上運(yùn)行的應(yīng)用服務(wù)并沒(méi)有什么關(guān)系,只是基于Consul層面的一種角色劃分。實(shí)際上,維持整個(gè)Consul集群狀態(tài)信息的還是Server節(jié)點(diǎn),與Dubbo中使用ZooKeeper實(shí)現(xiàn)注冊(cè)中心一樣,Consul集群中的各個(gè)Server節(jié)點(diǎn)也需要通過(guò)選舉的方式(使用GOSSIP協(xié)議、Raft一致性算法,這里不做詳細(xì)展開(kāi),在后面的文章中可以和大家單獨(dú)討論)來(lái)選舉整個(gè)集群中的Leader節(jié)點(diǎn)來(lái)負(fù)責(zé)處理所有查詢和事務(wù),并向其他節(jié)點(diǎn)同步狀態(tài)信息。
而Client角色則是相對(duì)無(wú)狀態(tài)的,只是簡(jiǎn)單的代理轉(zhuǎn)發(fā)RPC請(qǐng)求到Server節(jié)點(diǎn),之所以存在Client節(jié)點(diǎn)主要是分擔(dān)Server節(jié)點(diǎn)的壓力,作一層緩沖而已,這主要是因?yàn)镾erver節(jié)點(diǎn)的數(shù)量不宜過(guò)多,因?yàn)镾erver節(jié)點(diǎn)越多也就意味著達(dá)成共識(shí)的過(guò)程越慢,節(jié)點(diǎn)間同步的代價(jià)也就越高。對(duì)于Server節(jié)點(diǎn),一般建議3-5臺(tái),而Client節(jié)點(diǎn)則沒(méi)有數(shù)量的限制,可以根據(jù)實(shí)際情況部署數(shù)千或數(shù)萬(wàn)臺(tái)。事實(shí)上,這也只是一種策略,在現(xiàn)實(shí)的生產(chǎn)環(huán)境中,大部分應(yīng)用只需要設(shè)置3~5臺(tái)Server節(jié)點(diǎn)就夠了,作者所在的公司一套生產(chǎn)集群中的Consul集群的節(jié)點(diǎn)配置就是5個(gè)Server節(jié)點(diǎn),并沒(méi)有額外再設(shè)置Client節(jié)點(diǎn)。
另外,在Consul集群中還有一個(gè)概念是Agent,事實(shí)上每個(gè)Server或Client都是一個(gè)consul agent,它是運(yùn)行在Consul集群中每個(gè)成員上的一個(gè)守護(hù)進(jìn)程,主要的作用是運(yùn)行DNS或HTTP接口,并負(fù)責(zé)運(yùn)行時(shí)檢查和保持服務(wù)信息同步。我們?cè)趩?dòng)Consul集群的節(jié)點(diǎn)(Server或Client)時(shí),都是通過(guò)Consul Agent的方式啟動(dòng)的。例如:

consul agent -server -bootstrap -syslog \    -ui \    -data-dir=/opt/consul/data \    -dns-port=53    -recursor=10.211.55.3    -config-dir=/opt/consul/conf \    -pid-file=/opt/consul/run/consul.pid \    -client=10.211.55.4 \    -bind=10.211.55.4 \    -node=consul-server01 \    -disable-host-node-id &


以實(shí)際的生產(chǎn)環(huán)境為例,Consul集群的部署結(jié)構(gòu)示意圖如下:

基于Spring Cloud的微服務(wù)架構(gòu)演變史


實(shí)際生產(chǎn)案例中并沒(méi)有設(shè)置Client節(jié)點(diǎn),而是通過(guò)5個(gè)Consul Server節(jié)點(diǎn)組成的集群,來(lái)服務(wù)整套生產(chǎn)集群的應(yīng)用注冊(cè)&發(fā)現(xiàn)。這里有細(xì)節(jié)需要了解下,實(shí)際上5個(gè)Consul Server節(jié)點(diǎn)的IP地址是不一樣的,具體的服務(wù)在連接Consul集群進(jìn)行服務(wù)注冊(cè)與查詢時(shí)應(yīng)該連接Leader節(jié)點(diǎn)的IP,而問(wèn)題是,如果Leader節(jié)點(diǎn)掛掉了,相應(yīng)的應(yīng)用服務(wù)節(jié)點(diǎn),此時(shí)如何連接通過(guò)Raft選舉產(chǎn)生的新Leader節(jié)點(diǎn)呢?難道手工切換IP不成?
顯然手工切換IP的方式并不靠譜,而在生產(chǎn)實(shí)踐中,Consul集群的各個(gè)節(jié)點(diǎn)實(shí)際上是在Consul Agent上運(yùn)行DNS(如啟動(dòng)參數(shù)中紅色字體部分),應(yīng)用服務(wù)在連接Consul集群時(shí)的IP地址為DNS的IP,DNS會(huì)將地址解析映射到Leader節(jié)點(diǎn)對(duì)應(yīng)的IP上,如果Leader節(jié)點(diǎn)掛掉,選舉產(chǎn)生的新Leader節(jié)點(diǎn)會(huì)將自己的IP通知DNS服務(wù),DNS更新映射關(guān)系,這一過(guò)程對(duì)各應(yīng)用服務(wù)則是透明的。
通過(guò)以上分析,Consul是通過(guò)集群設(shè)計(jì)、Raft選舉算法,Gossip協(xié)議等機(jī)制來(lái)確保Consul服務(wù)的穩(wěn)定與高可用的。如果需要更高的容災(zāi)級(jí)別,也可以通過(guò)設(shè)計(jì)雙數(shù)據(jù)中心的方式,來(lái)異地搭建兩個(gè)Consul數(shù)據(jù)中心,組成一個(gè)異地災(zāi)備Consul服務(wù)集群,只是這樣成本會(huì)更高,這就看具體是否真的需要了。
ConfigServer(配置中心)
配置中心是對(duì)微服務(wù)應(yīng)用配置進(jìn)行管理的服務(wù),例如數(shù)據(jù)庫(kù)的配置、某些外部接口地址的配置等等。在Spring Cloud中ConfigServer是獨(dú)立的服務(wù)組件,它與Consul一樣也是整個(gè)微服務(wù)體系中比較關(guān)鍵的一個(gè)組件,所有的微服務(wù)應(yīng)用都需要通過(guò)調(diào)用其服務(wù),從而獲取應(yīng)用所需的配置信息。
隨著微服務(wù)應(yīng)用規(guī)模的擴(kuò)大,整個(gè)ConfigServer節(jié)點(diǎn)的訪問(wèn)壓力也會(huì)逐步增加,與此同時(shí),各個(gè)微服務(wù)的各類配置也會(huì)越來(lái)越多,如何管理好這些配置文件以及它們的更新策略(確保不因生產(chǎn)配置隨意改動(dòng)而造成線上故障風(fēng)險(xiǎn)),以及搭建高可用的ConfigServer集群,也是確保微服務(wù)體系穩(wěn)定很重要的一個(gè)方面。
在生產(chǎn)實(shí)踐中,因?yàn)橄馛onsul、ConfigServer這樣的關(guān)鍵組件,需要搭建獨(dú)立的集群,并且部署在物理機(jī)而不是容器里。在上一節(jié)介紹Consul的時(shí)候,我們是獨(dú)立搭建了5個(gè)Consul Server節(jié)點(diǎn)。而ConfigServer因?yàn)橹饕莌ttp配置文件訪問(wèn)服務(wù),不涉及節(jié)點(diǎn)選舉、一致性同步這樣的操作,所以還是按照傳統(tǒng)的方式搭建高可用配置中心。具體結(jié)構(gòu)示意圖如下:

基于Spring Cloud的微服務(wù)架構(gòu)演變史


我們可以單獨(dú)通過(guò)Git來(lái)管理應(yīng)用配置文件,正常來(lái)說(shuō)由ConfigSeever直接通過(guò)網(wǎng)絡(luò)拉取Git倉(cāng)庫(kù)的配置供服務(wù)獲取就可以了,這樣只要Git倉(cāng)庫(kù)配置更新,配置中心就能立刻感知到。但是這樣做的不穩(wěn)定之處,就在于Git本身是內(nèi)網(wǎng)開(kāi)發(fā)用的代碼管理工具,如果讓線上實(shí)時(shí)服務(wù)直接讀取,很容易將Git倉(cāng)庫(kù)拉掛了,所以,我們?cè)趯?shí)際的運(yùn)維過(guò)程中,是通過(guò)Git進(jìn)行配置文件的版本控制,區(qū)分線上分支/master與功能開(kāi)發(fā)分支/feature,并且在完成mr后還需要手工(通過(guò)發(fā)布平臺(tái)觸發(fā))同步一遍配置,過(guò)程是將新的master分支的配置同步一份到各個(gè)ConfigServer節(jié)點(diǎn)所在主機(jī)的本地路徑,這樣ConfigServer服務(wù)節(jié)點(diǎn)就可以通過(guò)其本地目錄獲取配置文件,而不用多次調(diào)用網(wǎng)絡(luò)獲取配置文件了。
而另一方面,隨著微服務(wù)越來(lái)越多,Git倉(cāng)庫(kù)中的配置文件數(shù)量也會(huì)越來(lái)越多。為了便于配置的管理,我們需要按照一定的組織方式來(lái)組織不同應(yīng)用類型的配置。在早期所有的應(yīng)用因?yàn)闆](méi)有分類,所以導(dǎo)致上百個(gè)微服務(wù)的配置文件放在一個(gè)倉(cāng)庫(kù)目錄,這樣一來(lái)導(dǎo)致配置文件管理成本增加,另外一方面也會(huì)影響ConfigServer的性能,因?yàn)槟硞€(gè)微服務(wù)用不到的配置也會(huì)被ConfigServer加載。
所以后期的實(shí)踐是,按照配置的層次關(guān)系進(jìn)行組織,將公司全局的項(xiàng)目配置抽象到頂層,由ConfigServer默認(rèn)加載,而其他所有的微服務(wù)則按照應(yīng)用類型進(jìn)行分組(通過(guò)Git項(xiàng)目空間的方式分組),相同的應(yīng)用放在一個(gè)組,然后這個(gè)組下單獨(dú)設(shè)立一個(gè)名為Config的Git倉(cāng)庫(kù)來(lái)存放這個(gè)組下相關(guān)微服務(wù)的配置文件。層次結(jié)構(gòu)如下:

基于Spring Cloud的微服務(wù)架構(gòu)演變史


這樣應(yīng)用加載配置的優(yōu)先級(jí)就是“本地配置->common配置->組公共配置->項(xiàng)目配置”這樣的順序。例如某服務(wù)A,在項(xiàng)目工程的默認(rèn)配置文件(“bootstrap.yml/application.yml”)中配置了參數(shù)A,同時(shí)也在本地項(xiàng)目配置“application-production.yml”配置了參數(shù)B,而與此同時(shí),ConfigServer中的common倉(cāng)庫(kù)下的配置文件“application.yml/application-production.yml”又分別存在參數(shù)C、參數(shù)D,同時(shí)有個(gè)組叫“pay”,其下的默認(rèn)配置文件“application.yml/application-production.yml”存在參數(shù)E、參數(shù)F,具體項(xiàng)目pay-api又存在配置文件“pay-api-production.yml”其覆蓋了common倉(cāng)庫(kù)中參數(shù)C、參數(shù)D的值。那么此時(shí)如果該應(yīng)用以“spring.profiles.active=production”的方式啟動(dòng),那么其能獲取到的配置參數(shù)(通過(guò)鏈接訪問(wèn):http://{spring.cloud.config.uri}/pay-api-production.yml)就是A、B、C、D、E、F,其中C、D的參數(shù)值為pay-api-production.yml中最后覆蓋的值。
而對(duì)于ConfigServer服務(wù)本身來(lái)說(shuō),需要按照這樣的組織方式進(jìn)行配置類型匹配,例如上述的例子中,假設(shè)還存在finance的配置倉(cāng)庫(kù),而pay組下的服務(wù)訪問(wèn)配置中心的時(shí)候,是不需要finance空間下的配置文件的,所以ConfigServer可以不用加載。這里就需要在ConfigServer服務(wù)配置中進(jìn)行一些配置。具體如下:

spring:  application:    name: @project.artifactId@    version: @project.version@    build: @buildNumber@    branch: @scmBranch@  cloud:    inetutils:      ignoredInterfaces:        - docker0    config:      server:        health.enabled: false        git:          uri: /opt/repos/config          searchPaths: 'common,{application}'          cloneOnStart: true          repos:            pay:                pattern: pay-*                cloneOnStart: true                uri: /opt/repos/example/config                searchPaths: 'common,{application}'            finance:                pattern: finance-*                cloneOnStart: true                uri: /opt/repos/finance/config                searchPaths: 'common,{application}'


通過(guò)在ConfigServer服務(wù)本身的application.yml本地配置中,設(shè)置其配置搜索方式,來(lái)實(shí)現(xiàn)這樣的目的。
網(wǎng)關(guān)服務(wù)&服務(wù)熔斷&監(jiān)控
通過(guò)上面兩小節(jié)的內(nèi)容,我們相對(duì)詳細(xì)地介紹了基于Spring Cloud體系中比較關(guān)鍵的兩個(gè)服務(wù)組件。然而在微服務(wù)架構(gòu)體系中,還有很多關(guān)鍵的問(wèn)題需要解決,例如,應(yīng)用服務(wù)在Consul中部署了多個(gè)節(jié)點(diǎn),那么調(diào)用方如何實(shí)現(xiàn)負(fù)載均衡?
關(guān)于這個(gè)問(wèn)題,在傳統(tǒng)的架構(gòu)方案中是通過(guò)Nginx實(shí)現(xiàn)的,但是在前面介紹Consul的時(shí)候只提到了Consul的服務(wù)注冊(cè)&發(fā)現(xiàn)、選舉等機(jī)制,并沒(méi)有提到Consul如何在實(shí)現(xiàn)服務(wù)調(diào)用的負(fù)載均衡。難道基于Spring Cloud的微服務(wù)體系中的應(yīng)用服務(wù)都是單節(jié)點(diǎn)在提供服務(wù),哪怕即使部署了多個(gè)服務(wù)節(jié)點(diǎn)?事實(shí)上,我們?cè)诜?wù)消費(fèi)方通過(guò)@EnableFeignClients注解開(kāi)啟調(diào)用,通過(guò)@FeignClient("user")注解進(jìn)行服務(wù)調(diào)用時(shí),就已經(jīng)實(shí)現(xiàn)了負(fù)載均衡,為什么呢?因?yàn)?,這個(gè)注解默認(rèn)是會(huì)默認(rèn)開(kāi)啟Robbin代理的,而Robbin是實(shí)現(xiàn)客戶端負(fù)載均衡的一個(gè)組件,通過(guò)從Consul拉取服務(wù)節(jié)點(diǎn)信息,從而以輪詢的方式轉(zhuǎn)發(fā)客戶端調(diào)用請(qǐng)求至不同的服務(wù)端節(jié)點(diǎn)來(lái)實(shí)現(xiàn)負(fù)載均衡。而這一切都是在消費(fèi)端的進(jìn)程內(nèi)部通過(guò)代碼的方式實(shí)現(xiàn)的。這種負(fù)載方式寄宿于消費(fèi)端應(yīng)用服務(wù)上,對(duì)消費(fèi)端存在一定的代碼侵入性,這是為什么后面會(huì)出現(xiàn)Service Mesh(服務(wù)網(wǎng)格)概念的原因之一,這里就不展開(kāi)了,后面有機(jī)會(huì)再和大家交流。
另一需要解決的關(guān)鍵問(wèn)題是服務(wù)熔斷、限流等機(jī)制的實(shí)現(xiàn),Spring Cloud通過(guò)集成Netflix的Hystrix框架來(lái)提供這種機(jī)制的支持,與負(fù)載均衡機(jī)制一樣也是在消費(fèi)端實(shí)現(xiàn)。由于篇幅的關(guān)系,這里也不展開(kāi)了,在后面的文章中有機(jī)會(huì)再和大家交流。
此外還有Zuul組件來(lái)實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù),提供路由分發(fā)與過(guò)濾相關(guān)的功能。而其他輔助組件還有諸如Sleuth來(lái)實(shí)現(xiàn)分布式鏈路追蹤、Bus實(shí)現(xiàn)消息總線、Dashboard實(shí)現(xiàn)監(jiān)控儀表盤等。由于Spring Cloud的開(kāi)源社區(qū)比較活躍,還有很多新的組件在不斷的被集成進(jìn)來(lái),感興趣的朋友可以持續(xù)關(guān)注下!
微服務(wù)之運(yùn)維形態(tài)

基于Spring Cloud的微服務(wù)架構(gòu)演變史

在微服務(wù)體系結(jié)構(gòu)下,隨著服務(wù)數(shù)量大量的增長(zhǎng),線上的部署&維護(hù)的工作量會(huì)變得非常大,而如果還采用原有的運(yùn)維模式的話,就能難滿足需要了。此時(shí)運(yùn)維團(tuán)隊(duì)需要實(shí)施DevOps策略,開(kāi)發(fā)自動(dòng)化運(yùn)維發(fā)布平臺(tái),打通產(chǎn)品、開(kāi)發(fā)、測(cè)試、運(yùn)維流程,關(guān)注研發(fā)效能。
另外一方面也需要推進(jìn)容器化(Docker/Docker Swarm/Kubernetes)策略,這樣才能快速對(duì)服務(wù)節(jié)點(diǎn)進(jìn)行伸縮,這也是微服務(wù)體系下的必然要求。

微服務(wù)泛濫問(wèn)題

基于Spring Cloud的微服務(wù)架構(gòu)演變史

這里還需要注意一個(gè)問(wèn)題,就是實(shí)施微服務(wù)架構(gòu)后,如何在工程上管控微服務(wù)的問(wèn)題。盲目的進(jìn)行微服務(wù)的拆分也不是一件很合理的事情,因?yàn)檫@會(huì)導(dǎo)致整個(gè)服務(wù)調(diào)用鏈路變得深不可測(cè),對(duì)問(wèn)題排查造成難度,也浪費(fèi)線上資源。
重構(gòu)問(wèn)題

基于Spring Cloud的微服務(wù)架構(gòu)演變史

在早期單體架構(gòu)方式向微服務(wù)架構(gòu)的轉(zhuǎn)變過(guò)程中,重構(gòu)是一個(gè)非常好的方式,也是確保服務(wù)規(guī)范化,業(yè)務(wù)系統(tǒng)應(yīng)用架構(gòu)合理化的很重要的手段。但是,一般來(lái)說(shuō),在快速發(fā)展階段也就意味著團(tuán)隊(duì)規(guī)模的迅速增長(zhǎng),短時(shí)間內(nèi)如何讓新的團(tuán)隊(duì)有事可做也是一件非??简?yàn)管理水平的事情,因?yàn)槿绻辛撕芏嗳?,并且他們之間呈現(xiàn)一種過(guò)渡的競(jìng)爭(zhēng)狀態(tài)的話,就會(huì)出現(xiàn)讓重構(gòu)這件事變得有些功利的情況,從而導(dǎo)致重構(gòu)不徹底、避重就輕,導(dǎo)致表象上看是很高大上的微服務(wù)架構(gòu),而業(yè)務(wù)系統(tǒng)實(shí)際上比較爛的情況。
另外,重構(gòu)是在一定階段后作出的重要決策,不僅僅是重新拆分,也是對(duì)業(yè)務(wù)系統(tǒng)的重新塑造,所以一定要考慮好應(yīng)用軟件的系統(tǒng)結(jié)構(gòu)以及實(shí)施它們所需要付出的成本,切不可盲目!

后記

基于Spring Cloud的微服務(wù)架構(gòu)演變史

基于Spring Cloud的微服務(wù)架構(gòu)體系,通過(guò)集成各種開(kāi)源組件來(lái)為整個(gè)體系服務(wù)支持,但是在負(fù)載均衡、熔斷、流量控制的方面需要對(duì)服務(wù)消費(fèi)端的業(yè)務(wù)進(jìn)程進(jìn)行侵入。所以很多人會(huì)認(rèn)為這不是一件很好的事情,于是出現(xiàn)了Service Mesh(服務(wù)網(wǎng)格)的概念,Service Mesh的基本思路就是通過(guò)主機(jī)獨(dú)立Proxy進(jìn)行的部署來(lái)解耦業(yè)務(wù)系統(tǒng)進(jìn)程,這個(gè)Proxy除了負(fù)責(zé)服務(wù)發(fā)現(xiàn)和負(fù)載均衡(不再需要單獨(dú)的注冊(cè)組件,如Consul)外,還負(fù)責(zé)動(dòng)態(tài)路由、容錯(cuò)限流、監(jiān)控度量和安全日志等功能。
而在具體的服務(wù)組件上目前主要是Google/IBM等大廠支持和推進(jìn)的一個(gè)叫做Istio的Service Mesh標(biāo)準(zhǔn)化工作組。具體關(guān)于Service Mesh的知識(shí),在后面的內(nèi)容中再和大家交流。以上就是本文的全部?jī)?nèi)容,來(lái)波關(guān)注,后面分享更多干貨內(nèi)容!??!


網(wǎng)頁(yè)名稱:基于SpringCloud的微服務(wù)架構(gòu)演變史-創(chuàng)新互聯(lián)
瀏覽路徑:http://weahome.cn/article/dcsdic.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部