前言
現(xiàn)在研發(fā)的項目啟動今已近一年之久,期間從項目屬性舔腾、人員規(guī)模、系統(tǒng)定位等方面都發(fā)生了很大的變化搂擦,而且是越變越好稳诚。不過也因為此,項目最初的架構(gòu)設(shè)計已經(jīng)不能滿足現(xiàn)在的需求瀑踢,并隨著時間的推移扳还,詬病越來越多才避、越來越嚴(yán)重。
為了解決這一問題氨距,開發(fā)人員也在努力的嘗試各種辦法桑逝,但總的來說之前的方式更多是在打補丁,暫時或看上去是解決問題了俏让,實質(zhì)上并沒有從本質(zhì)的變化楞遏。基于這一情況舆驶,這一次我們下定決心橱健,用一定的人力、物力去重新定義系統(tǒng)的架構(gòu)——基于Spring Cloud實現(xiàn)微服務(wù)的架構(gòu)沙廉。
本文簡要介紹微服務(wù)及微服務(wù)架構(gòu)的概念,并描述了Spring Cloud的功能臼节,然后基于Spring Cloud的各個組件搭建微服務(wù)的整體架構(gòu)撬陵,并對升級后的系統(tǒng)架構(gòu)進(jìn)行了設(shè)計、約定和說明网缝。
特別說明:鑒于現(xiàn)在的開發(fā)模式采用的是前后端分離的模式巨税,系統(tǒng)問題在后端也較為嚴(yán)重,Spring Cloud也只一個后端治理的框架粉臊,所以本文主要講述的是后端微服務(wù)的架構(gòu)設(shè)計草添,前端的架構(gòu)調(diào)整等Spring Cloud雛形完成后進(jìn)行組合設(shè)計。
[TOC]
1. 微服務(wù)簡述
1.1. 什么是微服務(wù)
微服務(wù)(MicroService)沒有一個官方的標(biāo)準(zhǔn)定義扼仲,ThoughtWorks的首席科學(xué)家馬丁·福勒這樣說:“微服務(wù)架構(gòu)是一種架構(gòu)模式远寸,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)屠凶、互相配合驰后,為用戶提供最終價值。每個服務(wù)運行在其獨立的進(jìn)程中矗愧,服務(wù)與服務(wù)間采用輕量級的通信機(jī)制互相溝通(通常是基于HTTP協(xié)議的RESTful API)灶芝。每個服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨立的部署到生產(chǎn)環(huán)境唉韭、類生產(chǎn)環(huán)境等夜涕。另外,應(yīng)當(dāng)盡量避免統(tǒng)一的属愤、集中式的服務(wù)管理機(jī)制女器,對具體的一個服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文春塌,選擇合適的語言晓避、工具對其進(jìn)行構(gòu)建簇捍。”
http://img.kuqin.com/upimg/allimg/141027/225ZB561-1.png
1.2. 微服務(wù)架構(gòu)優(yōu)勢
http://www.primeton.com/img/insideout/jiagou.jpg
1 復(fù)雜度可控
在將應(yīng)用分解的同時俏拱,規(guī)避了原本復(fù)雜度無止境的積累暑塑。每一個微服務(wù)專注于單一功能,并通過定義良好的接口清晰表述服務(wù)邊界锅必。
由于體積小事格、復(fù)雜度低,每個微服務(wù)可由一個小規(guī)模開發(fā)團(tuán)隊完全掌控搞隐,易于保持高可維護(hù)性和開發(fā)效率驹愚。
2 獨立部署
由于微服務(wù)具備獨立的運行進(jìn)程,所以每個微服務(wù)也可以獨立部署劣纲。當(dāng)某個微服務(wù)發(fā)生變更時無需編譯、部署整個應(yīng)用癞季。
由微服務(wù)組成的應(yīng)用相當(dāng)于具備一系列可并行的發(fā)布流程劫瞳,使得發(fā)布更加高效,同時降低對生產(chǎn)環(huán)境所造成的風(fēng)險绷柒,最終縮短應(yīng)用交付周期志于。
3 技術(shù)選型靈活
微服務(wù)架構(gòu)下,技術(shù)選型是去中心化的废睦。每個團(tuán)隊可以根據(jù)自身服務(wù)的需求和行業(yè)發(fā)展的現(xiàn)狀伺绽,自由選擇最適合的技術(shù)棧。
由于每個微服務(wù)相對簡單嗜湃,所以需要對技術(shù)棧進(jìn)行升級時所面臨的風(fēng)險就較低奈应,甚至完全重構(gòu)一個微服務(wù)也是可行的。
4 容錯
當(dāng)某一組件發(fā)生故障時净蚤,在單一進(jìn)程的傳統(tǒng)架構(gòu)下钥组,故障很有可能在進(jìn)程內(nèi)擴(kuò)散,形成應(yīng)用全局性的不可用今瀑。
在微服務(wù)架構(gòu)下程梦,故障會被隔離在單個服務(wù)中。若設(shè)計良好橘荠,其他服務(wù)可通過重試屿附、平穩(wěn)退化等機(jī)制實現(xiàn)應(yīng)用層面的容錯。
5 擴(kuò)展
單塊架構(gòu)應(yīng)用也可以實現(xiàn)橫向擴(kuò)展哥童,就是將整個應(yīng)用完整的復(fù)制到不同的節(jié)點挺份。當(dāng)應(yīng)用的不同組件在擴(kuò)展需求上存在差異時,微服務(wù)架構(gòu)便體現(xiàn)出其靈活性贮懈,因為每個服務(wù)可以根據(jù)實際需求獨立進(jìn)行擴(kuò)展匀泊。
簡單來說优训,微服務(wù)是基于單體應(yīng)用的新型架構(gòu)模式,可以基于微服務(wù)更好的進(jìn)行自動化測試各聘、運維揣非、監(jiān)控,從而滿足持續(xù)交付躲因,最終實現(xiàn)高質(zhì)量的用戶價值早敬。
1.3. 微服務(wù) VS 當(dāng)前開發(fā)
微服務(wù)的開發(fā)模式和傳統(tǒng)開發(fā)模式有著很大的不同,大致有以下幾點:
- 分工不同 :現(xiàn)在一個組負(fù)責(zé)一個系統(tǒng)大脉,一個人負(fù)責(zé)系統(tǒng)的一部分搞监;微服務(wù)后可能是一人負(fù)責(zé)一個或多個系統(tǒng)。
- 架構(gòu)不同:現(xiàn)在更多的從模塊上拆分镰矿、前后端上拆分開發(fā)琐驴;微服務(wù)后將同時從橫向縱向上拆分。
- 部署方式不同:現(xiàn)在是手工和半自動發(fā)布秤标;微服務(wù)后得自動化運維棍矛。
- 容災(zāi)不同:現(xiàn)在的系統(tǒng)是一個整體,并且是單點運行抛杨;微服務(wù)后可以多點負(fù)載,還可以隔離故障避免系統(tǒng)整體宕機(jī)荐类。
- 團(tuán)隊結(jié)構(gòu)不同 2 pizza(6~10人)的小團(tuán)隊
分權(quán)機(jī)制
聯(lián)邦分權(quán)制 -- 對結(jié)果負(fù)責(zé)
職能分權(quán)制 -- 對行為負(fù)責(zé)
2. 技術(shù)選型
2.1. Dubbo
Dubbo是Alibaba開源的分布式服務(wù)框架怖现,它最大的特點是按照分層的方式來架構(gòu),使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)玉罐。從服務(wù)模型的角度來看屈嗤,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務(wù)吊输,要么是消費方消費服務(wù)饶号,所以基于這一點可以抽象出服務(wù)提供方(Provider)和服務(wù)消費方(Consumer)兩個角色。
Dubbo服務(wù)的官方更新非常不確定季蚂,2014年10月30日停止更新后茫船,最近幾個月低調(diào)開始維護(hù),發(fā)布了5個優(yōu)化版本扭屁。
2.2. 為什么選擇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 Cloud的開發(fā)團(tuán)隊專注于企業(yè)級開源框架的研發(fā)鲸匿,不論是在中國還是在世界上使用都非常廣泛爷怀,開發(fā)出通用、開源晒骇、穩(wěn)健的開源框架是他們的主業(yè)霉撵。
Spring Cloud是微服務(wù)架構(gòu)的生態(tài)環(huán)境,考慮到了微服務(wù)的各個方面洪囤,不像阿里的Dubbo 框架只是專注于服務(wù)之間的治理徒坡。
Spring Cloud的社區(qū)熱度非常好,問題修復(fù)也非常及時瘤缩,未來會更加完善和穩(wěn)定喇完。
Spring Cloud也可以較好的兼容python、php等其他語言開發(fā)的微服務(wù)剥啤。因為采用RESTful锦溪。
Spring Cloud與Docker可以完美組合使用。
Spring Cloud 英文官網(wǎng):http://projects.spring.io/spring-cloud/
Spring Cloud 中文文檔:https://springcloud.cc/
2.3. Spring Boot的特性
Spring Boot是一個簡化Spring使用的框架府怯,可以使用少量的配置快速創(chuàng)建一個基于Spring的項目刻诊。Spring Boot主要有如下核心功能:
獨立運行的Spring項目:Spring Boot可以以jar包的形式來運行,運行一個Spring Boot項目我們只需要通過java -jar xx.jar類運行牺丙。
內(nèi)嵌Servlet容器:Spring Boot可以內(nèi)嵌Tomcat则涯,這樣我們無需以war包的形式部署項目。
提供starter簡化Maven配置:使用Spring或者SpringMVC我們需要添加大量的依賴冲簿,而這些依賴很多都是固定的粟判,這里Spring Boot 通過starter能夠幫助我們簡化Maven配置。
自動配置Spring
提供生產(chǎn)就緒型功能峦剔,如指標(biāo)档礁,健康檢查和外部配置
無代碼生成和xml配置
3. 我們微服務(wù)架構(gòu)約定
3.1. 技術(shù)棧
編程語言:Kotlin、JAVA吝沫、Python呻澜、PHP、SQL
構(gòu)建工具:Gradle野舶、Maven
數(shù)據(jù)庫:MySQL易迹、MongoDB、SQL Server
緩存:Redis
消息隊列:RabbitMQ
IDE:IntelliJ IDEA平道、Eclipse
服務(wù)部署:Linux睹欲、Docker、Jenkins、Ansible
微服務(wù)框架:Spring Cloud
后端開發(fā)框架:Spring Boot
前端開發(fā)框架:VUE
3.2. Spring Cloud基礎(chǔ)服務(wù)選型
- 配置:Spring Cloud Config窘疮,統(tǒng)一配置管理
- 總線:Spring Cloud Bus袋哼,可與Spring Cloud Config聯(lián)合實現(xiàn)熱部署
- 發(fā)現(xiàn):Eureka,微服務(wù)的注冊與發(fā)現(xiàn)
- 容錯:Hystrix闸衫,斷路器
- 網(wǎng)關(guān):Zuul涛贯,提供動態(tài)路由,監(jiān)控,彈性,安全等邊緣服務(wù)的框架
- 負(fù)載:Ribbon,有多種負(fù)載均衡策略可供選擇
- 調(diào)用:Feign蔚出,一種聲明式弟翘、模板化的HTTP客戶端
- 跟蹤:Spring Cloud Sleuth, 日志收集工具包
- 會話:Spring-Session
3.3. 工具版本約定
名稱 | 版本 | 備注 |
---|---|---|
Spring Boot | 2.0.0.M6 | - |
Spirng Cloud | Finchley.M4 | - |
Kotlin | 1.2 | 需保持最新 |
JAVA | 1.8.0_151 | — |
Gradle | 4.4.1 | 保持更新 |
Maven | 3.5.2 | - |
MySQL | 5.7.17 | - |
MongoDB | 3.6 | - |
PHP | 7.2.0 | — |
Python | 3.6.4 | — |
Redis | 4.0.1 | - |
Docker | 17.09 | - |
Jenkins | 2.89.2 | - |
CentOS | 7.4 | - |
SQL Server | 2008 | 歷史系統(tǒng) |
Ansible | 2.3.3.0-1 | - |
Tomcat | 8.5.24 | - |
3.4 微服務(wù)設(shè)計原則
單一職責(zé):
每個服務(wù)都很小骄酗,且專注于做一件事情稀余,并且把它做好。
至于要多小趋翻,有人喜歡100行以內(nèi)睛琳,有人贊成1000行以內(nèi),數(shù)字并不是最重要的踏烙,只要團(tuán)隊覺得合適就好师骗。輕量通訊
服務(wù)和服務(wù)之間通過輕量級的機(jī)制實現(xiàn)彼此間的通信。所謂輕量級通信機(jī)制讨惩,通常指基于語言無關(guān)辟癌、平臺無關(guān)的這類協(xié)議,例如XML荐捻、JSON愿待,而不是傳統(tǒng)我們熟知的Java RMI或者.Net Remoting等。獨立部署
每個服務(wù)都運行在一個獨立的操作系統(tǒng)進(jìn)程中靴患,這意味著不同的服務(wù)能被部署到不同的主機(jī)上。康威定律
請讀:https://yq.aliyun.com/articles/8611
將1968年由梅爾.康威提出:產(chǎn)品反映了制造該產(chǎn)品的組織結(jié)構(gòu)要出。
http://img2.tbcdn.cn/L1/461/1/74ab78cb5db601e5db68adf61e6dc58f437df4e0
第一定律:Communication dictates design. 組織溝通方式會通過系統(tǒng)設(shè)計表達(dá)出來鸳君。
第二定律:There is never enough time to do something right, but there is always enough time to do it over.
時間再多一件事情也不可能做的完美,但總有時間做完一件事情患蹂。
第三定律:There is a homomorphism from the linear graph of a system to the linear graph of its design organization.
線型系統(tǒng)和線型組織架構(gòu)間有潛在的異質(zhì)同態(tài)特性或颊。
第四定律:The structures of large systems tend to disintegrate during development, qualitatively more so than with small systems.
大的系統(tǒng)組織總是比小系統(tǒng)更傾向于分解。
3.5 微服務(wù)拆分
微服務(wù)的拆分是個復(fù)雜問題传于,簡單來說需要從橫向和縱向多刀去拆囱挑。
3.5.1 橫向拆分
按照不同的業(yè)務(wù)域進(jìn)行拆分,例如訂單沼溜、營銷平挑、風(fēng)控、積分資源等,形成獨立的業(yè)務(wù)領(lǐng)域微服務(wù)集群通熄。
- 用戶:
- 訂單:
- 評論:
- 組織:
- 商品:
- 交易:
- 搜索:
- 營銷:
- 消費者信息:
- 消費者分布:
- 消費者畫像:
- 積分:
- 訂貨:
- 賬戶:
3.5.2 縱向拆分
把一個業(yè)務(wù)功能里的不同模塊或者組件進(jìn)行拆分唆涝。例如把公共組件拆分成獨立的原子服務(wù),下沉到底層唇辨,形成相對獨立的原子服務(wù)層廊酣。這樣一縱一橫,就可以實現(xiàn)業(yè)務(wù)的服務(wù)化拆分赏枚。
- 短信:短信發(fā)送亡驰、記錄、均衡饿幅、防漏凡辱、模板配置
- 文件:文件上傳、縮略诫睬、下載煞茫、打包、數(shù)據(jù)庫記錄
- 微信:
- 日志:
- 支付:
- 快遞:快遞查詢摄凡、狀態(tài)訂閱
- 地圖:地址經(jīng)緯度互轉(zhuǎn)续徽、距離計算、線路推薦
- 計劃任務(wù):統(tǒng)一的計劃任務(wù)配置及調(diào)度
- 微信公眾號配置:
- 微信自動回復(fù):
3.6 架構(gòu)升級步驟
- 獨立構(gòu)建微服務(wù)框架亲澡,將現(xiàn)有系統(tǒng)的核心功能分離出來做成基礎(chǔ)微服務(wù)钦扭。如短信模板消息發(fā)送、微信模板消息發(fā)送床绪、文件上傳下載等客情;
- 利用這些基礎(chǔ)微服務(wù),解耦現(xiàn)有系統(tǒng)癞己,修改其調(diào)用關(guān)系和依賴方式膀斋;
- 通過不斷的微服務(wù)化,逐漸將現(xiàn)有系統(tǒng)分解成多個獨立的微服務(wù)痹雅;
- 廢棄現(xiàn)有的系統(tǒng)仰担,使用全新構(gòu)建的微服務(wù)來替代。
3.7. 微服務(wù)總體架構(gòu)圖
構(gòu)件一套完整的微服務(wù)架構(gòu)需要考慮許多問題绩社,包括API Gateway摔蓝、服務(wù)間調(diào)用、服務(wù)發(fā)現(xiàn)愉耙、服務(wù)容錯贮尉、服務(wù)部署、數(shù)據(jù)調(diào)用等朴沿〔卵瑁基于SpringCloud構(gòu)建微服務(wù)架構(gòu)可以通過自動配置和綁定Spring環(huán)境和其他Spring編程模型來實現(xiàn)微服務(wù)。采用Spring Boot應(yīng)用程序提供的集成功能,通過幾個簡單的注釋龄毡,開發(fā)人員可以快速配置和啟用應(yīng)用程序中的常見功能模塊吠卷,并使用久經(jīng)考驗的Netflix組件構(gòu)建大型分布式系統(tǒng)。 提供的微服務(wù)功能模塊包括服務(wù)發(fā)現(xiàn)(Eureka)沦零,斷路器(Hystrix)祭隔,智能路由(Zuul)和客戶端負(fù)載均衡(Ribbon)等。圖2顯示了采用Spring Cloud系列平臺構(gòu)建的微服務(wù)整體架構(gòu)路操。
基于Spring Cloud系統(tǒng)的微服務(wù)架構(gòu)平臺
服務(wù)發(fā)現(xiàn)是microservice基礎(chǔ)架構(gòu)的關(guān)鍵原則之一疾渴。服務(wù)注冊中心采用Spring CloudNetflix的項目可以自動注冊服務(wù),也可以通過HTTP接口手動注冊屯仗。默認(rèn)情況下搞坝,Eureka使用客戶端心跳來確定一個客戶端是否活著。也可以另指定DiscoveryClient來傳播當(dāng)前SpringBoot Actuator的應(yīng)用性能的健康檢查狀態(tài)魁袜。
統(tǒng)一的接入服務(wù)接口采用Spring Cloud的Zuul組件桩撮,實現(xiàn)內(nèi)外有別的微服務(wù)調(diào)用。該組件也實現(xiàn)了服務(wù)路由功能峰弹。采用Spring Cloud Netflix來實現(xiàn)服務(wù)的限流和降級店量。
為實現(xiàn)服務(wù)的高可用,保證服務(wù)的容錯和負(fù)載均衡鞠呈,本平臺可采用客戶端負(fù)載均衡(Ribbon)來實現(xiàn)融师。
Spring Cloud Netflix的Hystrix熔斷器組件,具有容錯管理工具蚁吝,旨在通過熔斷機(jī)制控制服務(wù)和第三方庫的節(jié)點旱爆,從而對延遲和故障提供更強(qiáng)大的容錯能力。為保證核心服務(wù)的穩(wěn)定性窘茁,可采用Spring Cloud Netflix的Hystrix組件來實現(xiàn)服務(wù)的服務(wù)的容錯怀伦、限流和降級等功能。
微服務(wù)的安全控制和權(quán)限驗證可采用Spring CloudSecurity來實現(xiàn)山林。對于RESTful空镜,可采用Spring Cloud的Feign 組件,這是一個聲明Web服務(wù)客戶端捌朴。這便得編寫web服務(wù)客戶端更容易,使用Feign 創(chuàng)建一個接口并對它進(jìn)行注解张抄,它具有可插拔的注解支持包括Feign注解與JAX-RS注解砂蔽,F(xiàn)eign還支持可插拔的編碼器與解碼器
4. 微服務(wù)帶來的新問題
- 一個服務(wù)拆成多大才合適?
- 多個微服務(wù)能否共享數(shù)據(jù)庫署惯?
每個微服務(wù)都有自己獨立的數(shù)據(jù)庫左驾,那么后臺管理的聯(lián)合查詢怎么處理?這是大家普遍遇到的一個問題。
有如下三種處理方案:
嚴(yán)格按照微服務(wù)的劃分來做诡右,微服務(wù)相互獨立安岂,各微服務(wù)數(shù)據(jù)庫也獨立,后臺需要展示數(shù)據(jù)時帆吻,調(diào)用各微服務(wù)的接口來獲取對應(yīng)的數(shù)據(jù)域那,再進(jìn)行數(shù)據(jù)處理后展示出來,這是標(biāo)準(zhǔn)的用法猜煮,也是最麻煩的用法次员。
將業(yè)務(wù)相關(guān)的表放到一個庫中,將業(yè)務(wù)無關(guān)的表嚴(yán)格按照微服務(wù)模式來拆分王带,這樣既可以使用微服務(wù)淑蔚,也避免了數(shù)據(jù)庫各種切換導(dǎo)致后臺統(tǒng)計難以實現(xiàn),是一個折中的方案愕撰。
數(shù)據(jù)庫嚴(yán)格按照微服務(wù)的要求來切分刹衫,以滿足業(yè)務(wù)高并發(fā),實時或者準(zhǔn)實時將各微服務(wù)數(shù)據(jù)庫數(shù)據(jù)同步到 NoSQL 數(shù)據(jù)庫中搞挣,在同步的過程中進(jìn)行數(shù)據(jù)清洗带迟,用來滿足后臺業(yè)務(wù)系統(tǒng)的使用,推薦使用 Mongodb柿究、Hbase 等邮旷。
三種方案在不同的公司我都使用過,第一種方案適合業(yè)務(wù)較為簡單的小公司蝇摸;第二種方案婶肩,適合想在原有系統(tǒng)之上掘猿,慢慢演化為微服務(wù)架構(gòu)的公司昙啄;第三種適合大型高并發(fā)的互聯(lián)網(wǎng)公司。
- 如何與現(xiàn)有系統(tǒng)結(jié)合使用弄唧、并行開發(fā)啡专、最終替代险毁?
- 如何避免開發(fā)人員瞎子摸象、管中窺豹们童?
- 服務(wù)調(diào)用流畔况,服務(wù)編排如何使用?
- 自動化運維的新挑戰(zhàn)慧库?
5. 結(jié)束語
微服務(wù)架構(gòu)不是絕對的好跷跪,它有一定的使用場景,也有一定的落地難度齐板。結(jié)合我們目前的情景和未來的發(fā)展來說吵瞻,微服務(wù)架構(gòu)是適合我們的葛菇,并且能夠解決很多現(xiàn)有系統(tǒng)的詬病,但是落地的難度也是比較大的橡羞,特別是要結(jié)合已有的各個系統(tǒng)進(jìn)行使用眯停。
Spring Cloud作為穩(wěn)定的微服務(wù)的一站式解決方案,能快速高效地搭建微服務(wù)架構(gòu)卿泽,并且能夠結(jié)合多語言開發(fā)莺债,這個正是我們所需要的。
從今天開始又厉,微服務(wù)的架構(gòu)升級正式開始九府,一部分人直接開始參與,一部分人員間接來參與覆致,但最終我們所有人都會在一個統(tǒng)一的架構(gòu)上進(jìn)行持續(xù)交付侄旬,從而更大的實現(xiàn)用戶價值。
6. 推薦閱讀
思特沃克-洞見-微服務(wù)
http://insights.thoughtworks.cn/category/microservices/微服務(wù)架構(gòu)的理論基礎(chǔ) - 康威定律
https://yq.aliyun.com/articles/8611
《Spring Boot 2精髓:從構(gòu)建小系統(tǒng)到架構(gòu)分布式大系統(tǒng)》
《Spring Cloud與Docker微服務(wù)架構(gòu)實戰(zhàn)》
《Spring Cloud微服務(wù)實戰(zhàn)》
《SpringBoot揭秘:快速構(gòu)建微服務(wù)體系》