蘇寧Spring Cloud微服務(wù)架構(gòu)工具vole實(shí)踐分享

為應(yīng)對(duì)傳統(tǒng)單體架構(gòu)的缺陷掠械,微服務(wù)架構(gòu)被企業(yè)廣泛應(yīng)用。Spring Cloud 為開發(fā)人員提供了快速構(gòu)建微服務(wù)的系列工具注祖,但是并沒有進(jìn)行相關(guān)整合猾蒂, vole 是在其基礎(chǔ)上搭建的一套可以快速實(shí)現(xiàn)微服務(wù)的基礎(chǔ)腳手架工具。

一是晨、傳統(tǒng)單體架構(gòu)的缺陷

傳統(tǒng)單體應(yīng)用將所有功能的表示層肚菠、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層罩缴、包括靜態(tài)資源等全部糅合在一個(gè)工程內(nèi)蚊逢,編譯 打包 部署在單臺(tái)服務(wù)器上線,比如打成 war 包放在 Tomcat 的 webapp 目錄中部署箫章。這樣的開發(fā)部署流程適合小型項(xiàng)目烙荷,系統(tǒng)功能不復(fù)雜,訪問量不大的情況下有絕對(duì)的優(yōu)勢(shì)檬寂,開發(fā)速度快且運(yùn)維方便终抽。但是,當(dāng)業(yè)務(wù)越來越復(fù)雜桶至,功能越來越多昼伴,參與的開發(fā)人員越來越多,該流程就暴露出如下問題:

  • 業(yè)務(wù)復(fù)雜镣屹,代碼量增大圃郊,代碼可讀性、可維護(hù)性女蜈、可擴(kuò)展性下降持舆。一旦要新同事接手代碼,需要花很多時(shí)間理解 ;
  • 測(cè)試難度增大 ;
  • 單體應(yīng)用并發(fā)能力有限伪窖,訪問量高吏廉,用戶體驗(yàn)差 ;
  • 單體應(yīng)用容錯(cuò)率低,一旦出錯(cuò)惰许,可能導(dǎo)致整個(gè)項(xiàng)目崩虧 ;
  • 將單體應(yīng)用做集群部署,添加負(fù)載均衡服務(wù)器(例如 Nginx 反向代理轉(zhuǎn)發(fā)請(qǐng)求)可略微緩解以上兩條條缺點(diǎn)史辙,但不能完美解決問題汹买。

二佩伤、微服務(wù)是什么?

微服務(wù)架構(gòu):就是將原來的單體應(yīng)用按義務(wù)范圍來晦毙,劃分為多個(gè)小 model生巡,每個(gè)微服務(wù)運(yùn)行在自己的進(jìn)程中,相互不產(chǎn)生影響见妒,完全自動(dòng)化獨(dú)立部署孤荣,并使用輕量級(jí)機(jī)制通信,通常是 HTTP RESTUFUL API须揣,可對(duì)各微服務(wù)進(jìn)行集中管理盐股。這些小 model 可以使用不同的編程語言及存儲(chǔ)技術(shù),微服務(wù)架構(gòu)是分布式架構(gòu)耻卡。

微服務(wù)架構(gòu)的優(yōu)點(diǎn)

  • 按業(yè)務(wù)劃分的微服務(wù)單元獨(dú)立部署疯汁,運(yùn)行在獨(dú)立的進(jìn)程中,服務(wù)之間沒有任何耦合幌蚊,具備良好的擴(kuò)展性和復(fù)用性;
  • 服務(wù)之間通常采用 HTTP 通信溃卡,該通信機(jī)制與平臺(tái)和語言無關(guān)溢豆,可以使用不同的編程語言和存儲(chǔ)方法。也可以采用輕量級(jí)消息總線通信瘸羡,如 RabbitMQ漩仙、Kafaka 消息隊(duì)列等,數(shù)據(jù)格式一般采用 JSON最铁;
  • 每個(gè)微服務(wù)都有自己的數(shù)據(jù)庫讯赏,服務(wù)間數(shù)據(jù)庫相互是獨(dú)立;
  • 微服務(wù)一般采用自動(dòng)化工具部署冷尉。Docker 容器技術(shù)是微服務(wù)最佳部署容器漱挎;
  • 服務(wù)集中化管理(服務(wù)注冊(cè)與發(fā)現(xiàn):Eureka、Zookeeper雀哨、Consul)磕谅,監(jiān)控(服務(wù)運(yùn)行狀況監(jiān)控:Spring-Boot-Admin-Server);
  • 微服務(wù)架構(gòu)是分布式架構(gòu)雾棺。

三膊夹、微服務(wù)腳手架工具:vole

Spring Cloud 為開發(fā)人員提供了快速構(gòu)建微服務(wù)系統(tǒng)的系列工具,包括配置管理捌浩、服務(wù)發(fā)現(xiàn)放刨、斷路器、路由尸饺、微代理进统、事件總線助币、分布式會(huì)話等相關(guān)功能,但是并沒有進(jìn)行相關(guān)整合螟碎, vole 是在 Spring Cloud 基礎(chǔ)上搭建的一套可以快速實(shí)現(xiàn)微服務(wù)架構(gòu)的基礎(chǔ)腳手架工具眉菱,vole 基于 Spring Cloud Finchley 版本 的框架搭建,可以快速幫助項(xiàng)目組完成老系統(tǒng)微服務(wù)改造掉分。蘇寧新廣告平臺(tái)原來大單體應(yīng)用的基礎(chǔ)上使用 vole 對(duì)原來單體應(yīng)用進(jìn)行了快速改造俭缓,幫助業(yè)務(wù)系統(tǒng)快速搭建微服務(wù)化。

架構(gòu)模型圖如下所示:

主要包括以下功能模塊

  • 基礎(chǔ)核心工具包 common
  • 微服務(wù)服務(wù)中心 eureka
  • 微服務(wù)配置中心 config
  • 微服務(wù)鑒權(quán)中心 auth
  • 微服務(wù)登陸統(tǒng)一中心 passport
  • 微服務(wù)后臺(tái)統(tǒng)一管理中心 portal
  • 微服務(wù)邊緣網(wǎng)關(guān)管理中心 gateway
  • 微服務(wù)其他相關(guān)模塊(監(jiān)控酥郭,消息华坦,job)

vole-common

vole-common 基礎(chǔ)核心工具包,主要負(fù)責(zé)如 請(qǐng)求切面褥民、服務(wù)配置季春、異常處理、參數(shù)格式化消返、請(qǐng)求防護(hù)载弄、redis、Db撵颊、基礎(chǔ)配置組件宇攻、以及其他相關(guān)如文件服務(wù)、基礎(chǔ)工具類等組件倡勇。這里逞刷,重點(diǎn)要介紹 bean 包下組件 。

bean 包下主要是 aop Controller 增強(qiáng)切面妻熊,保證各微服務(wù)的接口返回值都基于基礎(chǔ)格式類 (R) 夸浅。

config 包主要負(fù)責(zé) 請(qǐng)求忽略配置插件, api 文檔插件配置以及 - MVC 參數(shù)管理配置類扔役。

handler 和 resolver 包 分別處理全局異常和用戶請(qǐng)求參數(shù)解析帆喇。

Xss 包處理請(qǐng)求攻擊過濾的 比如 xss 攻擊,sql 注入等亿胸。

基礎(chǔ)工具類為整個(gè)腳手架提供了基本配置管理功能坯钦,為其他相關(guān)組件提供了基礎(chǔ)功能。

vole- eureka

vole- eureka 微服務(wù)注冊(cè)中心 eureka 高可用配置方案侈玄,Eureka 通過運(yùn)行多個(gè)實(shí)例婉刀,使其更具高可用性。事實(shí)上序仙,這是它的默認(rèn)屬性突颊,用戶需要做的就是給對(duì)等實(shí)例一個(gè)合法的關(guān)聯(lián) serviceUrl, 如下圖所示:

eureka 互備兩個(gè)節(jié)點(diǎn) Eureka-eserver peer1 8761,Eureka-eserver peer2 8769 相互感應(yīng)。當(dāng)有服務(wù)注冊(cè)時(shí),兩個(gè) Eureka-eserver 是對(duì)等的洋丐,它們都存有相同的信息呈昔,這就是通過服務(wù)器的冗余來增加可靠性,當(dāng)有一臺(tái)服務(wù)器宕機(jī)了友绝,服務(wù)并不會(huì)終止,因?yàn)榱硪慌_(tái)服務(wù)存有相同的數(shù)據(jù)肝劲。

vole-config 微服務(wù)配置中心

在分布式系統(tǒng)中迁客,由于服務(wù)數(shù)量巨多,為了方便服務(wù)配置文件統(tǒng)一管理辞槐,實(shí)時(shí)更新掷漱,所以需要分布式配置中心組件。在 Spring Cloud 中榄檬,有分布式配置中心組件 spring cloud config 卜范,支持配置服務(wù)放在配置服務(wù)內(nèi)存中(即本地),也支持放在遠(yuǎn)程 Git 倉庫中鹿榜。在 spring cloud config 組件中海雪,分兩個(gè)角色,一是 config server舱殿,二是 config client奥裸。

如上圖 vole-config 默認(rèn)使用本地方式,也可以配置到 git 服務(wù)器上去沪袭。

當(dāng)服務(wù)實(shí)例很多時(shí)湾宙,都從配置中心讀取文件,這時(shí)可以考慮將配置中心做成一個(gè)微服務(wù)冈绊,將其集群化侠鳄,從而達(dá)到高可用,架構(gòu)圖如下:

配置中心高可用架構(gòu)圖

vole-auth

vole-auth 是微服務(wù)鑒權(quán)中心死宣。在微服務(wù)架構(gòu)下伟恶,一個(gè)應(yīng)用會(huì)被拆分成若干個(gè)微應(yīng)用,每個(gè)微應(yīng)用都需要對(duì)訪問進(jìn)行鑒權(quán)十电,每個(gè)微應(yīng)用都需要明確當(dāng)前訪問用戶以及權(quán)限知押。尤其當(dāng)訪問來源不只是瀏覽器,還包括其他服務(wù)調(diào)用時(shí)鹃骂,單體應(yīng)用架構(gòu)下的鑒權(quán)方式就不是特別合適台盯。在微服務(wù)架構(gòu)下,要考慮外部應(yīng)用接入的場(chǎng)景畏线、用戶 - 服務(wù)鑒權(quán)静盅、服務(wù) - 服務(wù)鑒權(quán)等多種鑒權(quán)場(chǎng)景。vole-auth 是基于 spring cloud auth2 基礎(chǔ)上配置的鑒權(quán)中心,實(shí)現(xiàn)了服務(wù)與數(shù)據(jù)分離的方式蒿叠,即用戶相關(guān)數(shù)據(jù) 都是通過服務(wù)獲取明垢,vole-auth 負(fù)責(zé)相關(guān)鑒權(quán)功能。

如下圖所示:

  • auth 的 memberService 去掉用 mps 服務(wù)的相關(guān)會(huì)員基本信息來確認(rèn) 用戶權(quán)限是否正常市咽;
  • Auth 服務(wù)內(nèi)部有兩個(gè)重點(diǎn)服務(wù)包 :config 包 和 component 包痊银;
  • Config 包:主要負(fù)責(zé) auth 服務(wù)的基本配置 ,- 包括安全配置方案,token 增強(qiáng)和存儲(chǔ)方案以及 JWT 配置施绎;
  • Component 包 :主要負(fù)責(zé)自定義 token 使用方案,這里主要是自定義手機(jī)號(hào) token 方案谷醉。

vole-passport

vole-passport 是微服務(wù)登陸統(tǒng)一中心主要負(fù)責(zé)各系統(tǒng)后臺(tái)相關(guān)登陸服務(wù)管理,基于 springSecurity 改造使用 cookie 管理登陸信息的服務(wù)抖单,vole-passport 支持各個(gè)服務(wù)注解式一鍵配置方式。

如下圖所示:

統(tǒng)一登錄配置中心圖

業(yè)務(wù)人員需要通過登陸相關(guān)業(yè)務(wù)系統(tǒng)進(jìn)行查看或者添加相關(guān)數(shù)據(jù)先要經(jīng)過 passport 進(jìn)行認(rèn)證和鑒權(quán)遇八。Vole-passport 采用集中式服務(wù)管理模式,各個(gè)子業(yè)務(wù)系統(tǒng)的介入只需系統(tǒng)上配置相關(guān)客戶端信息押蚤。Passport 重點(diǎn)工模塊是 passport-common 負(fù)責(zé) passport 所有功能服務(wù)組件。

如上圖所示包括:

  • auth 用戶認(rèn)證基本信息管理揽碘;
  • config 服務(wù)配置管理包括服務(wù)端配置和客戶端配置次屠;
  • cookie 是負(fù)責(zé)寫入和讀取 cookie 基本信息雳刺;
  • detail 是用戶基本配置信息寶庫用戶的密碼,登陸狀態(tài)掖桦,id 等等枪汪;
  • Filter 是基于 springSecurity 改造的相關(guān)的客戶端和服務(wù)端的配置管理服務(wù);
  • Handler 是用戶正常登陸等處的成功或失敗處理雀久;
  • Permission 是負(fù)責(zé)用戶登錄后相關(guān)資源的鑒權(quán)服務(wù)赖捌;
  • Token 用戶基本 token 操作管理。

相關(guān)系統(tǒng)配置 passport-config 如下所示:使用配置繼承 WebSecurityConfigurerAdapter 的配置類罩锐,并 @EnablePassportSso 開啟 sso 配置

在 springboot 啟動(dòng)配置文件 (application.yml) 上配置相關(guān)統(tǒng)一登錄服務(wù)鏈接:

vole-portal

vole-portals 是分布式統(tǒng)一管理后臺(tái)門戶涩惑,實(shí)現(xiàn)對(duì)各系統(tǒng)后臺(tái)的權(quán)限統(tǒng)一管理,包括 - 用戶管理蟀拷、角色管理萍聊、菜單和權(quán)限管理以及系統(tǒng)管理悦析,是相關(guān)系統(tǒng)后臺(tái)管理的基本功能集合體。

如下圖:

統(tǒng)一門戶管理分三個(gè)組件:門戶服務(wù)端 vole-portal亭螟、門戶數(shù)據(jù)端 vole-portal-data预烙、和門戶基本組件 vole-portal-common道媚,用微服務(wù)方式實(shí)現(xiàn)服務(wù)和數(shù)據(jù)分離。

  • vole-portal: 主要負(fù)責(zé)門戶的基本配置功能 如菜單谴分,權(quán)限镀脂,系統(tǒng)薄翅,用戶配置等;
  • vole-portal-data: 負(fù)責(zé)對(duì)用戶鼎天,權(quán)限熟丸,菜單的基本數(shù)據(jù)讀取的管理。
    服務(wù)和數(shù)據(jù)分離的好處是 - 對(duì)于任何前端程序都能接入相關(guān) portal 服務(wù)绩鸣,便于定制化管理界面。

如下圖:

image.png

前端業(yè)務(wù)系統(tǒng)可以使用任何服務(wù)進(jìn)行集成化借,便于前后端分離蓖康。

vole-gateway

微服務(wù)邊緣網(wǎng)關(guān) vole-gateway 是基于 zuul 改造的邊緣網(wǎng)關(guān)服務(wù)垒手,在 zuul 基礎(chǔ)上添加了動(dòng)態(tài)路由配置科贬,服務(wù)鑒權(quán),異常优妙,安全等相關(guān)功能憎账。

zuul 的服務(wù)方式如下圖:

微服務(wù)網(wǎng)關(guān) zuul 架構(gòu)

為什么要使用邊緣服務(wù)網(wǎng)關(guān)胞皱?

  • 客戶端直接和微服務(wù)交互,增加了復(fù)雜度抄罕;
  • 某些場(chǎng)景下可能存在跨域于颖;
  • 如果一個(gè)功能點(diǎn)需要調(diào)用多個(gè)微服務(wù),每個(gè)服務(wù)都需要身份認(rèn)證做入,使得身份驗(yàn)證復(fù)雜冗余同衣;
  • 客戶端直接和微服務(wù)交互耐齐,后期代碼重構(gòu)難度大蒋情。

基于以上問題耸携,使用邊緣網(wǎng)關(guān)使得整個(gè)微服務(wù)系統(tǒng)對(duì)外部服務(wù)的管理夺衍,尤其是移動(dòng)端服務(wù)更加規(guī)范,簡(jiǎn)單河劝,清晰矛紫。

vole-modules

vole-modules 包括了微服務(wù)的其他功能,比如任務(wù)煎娇、消息贪染、監(jiān)控等相關(guān)組件杭隙,可以幫助快速搭建微服務(wù)相關(guān)基礎(chǔ)功能因妙,提供基本骨架工程結(jié)合包攀涵。

如下圖所示:

vole-job 使用的是 Elastic-Job-Lite;定時(shí)任務(wù)一般都是使用 quartz 或者 spring-task(ScheduledExecutorService)蜗细,無論是使用 quartz 還是 spring-task怒详,我們都會(huì)至少遇到兩個(gè)痛點(diǎn):

  1. 不敢輕易跟著應(yīng)用服務(wù)多節(jié)點(diǎn)部署厂榛,可能會(huì)重復(fù)多次執(zhí)行而引發(fā)系統(tǒng)邏輯錯(cuò)誤沟涨;
  2. quartz 的集群僅僅只是用來 HA担败,節(jié)點(diǎn)數(shù)量的增加并不能給我們的每次執(zhí)行效率帶來提升雪情,即不能實(shí)現(xiàn)水平擴(kuò)展鸭巴。

Elastic job 的主要功能有支持彈性擴(kuò)容奕扣,通過 Zookepper 集中管理和監(jiān)控 job,支持失效轉(zhuǎn)移等池磁。

vole-message 對(duì)釘釘楷兽,阿里云大魚短信平臺(tái)的基礎(chǔ)服務(wù)能夠快速的支持消息接入。

vole-mq 集成了對(duì) kafka,rabbit,rocket 等主流 mq 客戶端的集合包端考。

vole-monitor 和 vole-turbine 分別是對(duì)容器基礎(chǔ)數(shù)據(jù)監(jiān)控以及服務(wù)聚合熔斷監(jiān)控的組合却特。

最后

通過精簡(jiǎn)或者重組 vole 微服務(wù)腳手架可以快速提煉出適應(yīng)相關(guān)項(xiàng)目組的微服務(wù)腳手架工具筛圆,解決項(xiàng)目組大量的前期框架整合時(shí)間,提升開發(fā)效率和項(xiàng)目進(jìn)度闽晦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仙蛉,一起剝皮案震驚了整個(gè)濱河市荠瘪,隨后出現(xiàn)的幾起案子赛惩,更是在濱河造成了極大的恐慌,老刑警劉巖麸祷,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶牍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惧辈,警方通過查閱死者的電腦和手機(jī)磕瓷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門困食,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕盹,“玉大人,你說我怎么就攤上這事啊胶《庀停” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長部凑。 經(jīng)常有香客問我涂邀,道長箱锐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮臊恋,結(jié)果婚禮上抖仅,老公的妹妹穿的比我還像新娘砖第。我一直安慰自己环凿,他們只是感情好智听,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布到推。 她就那樣靜靜地躺著,像睡著了一般欲虚。 火紅的嫁衣襯著肌膚如雪悔雹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音益涧,去河邊找鬼。 笑死久免,一個(gè)胖子當(dāng)著我的面吹牛扭弧,可吹牛的內(nèi)容都是我干的鸽捻。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼厚满!你這毒婦竟也來了碘箍?” 一聲冷哼從身側(cè)響起续崖,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤严望,失蹤者是張志新(化名)和其女友劉穎逻恐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拨匆,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惭每,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年台腥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绒北。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷游。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脐往,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘤礁,到底是詐尸還是另有隱情辖源,我是刑警寧澤希太,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布誊辉,位于F島的核電站,受9級(jí)特大地震影響邀跃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜途戒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一喷斋、第九天 我趴在偏房一處隱蔽的房頂上張望蒜茴。 院中可真熱鬧粉私,春花似錦、人聲如沸抄肖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锅风,卻和暖如春鞍泉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背边器。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工忘巧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睦刃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓耸采,卻偏偏與公主長得像工育,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子文留,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容