你所不了解的微服务架构
一直以來,系統的架構設計是IT領域經久不衰的話題,也是構建每一個系統最核心且重要的部分之一。它決定了系統能否滿足業務、技術、組織、靈活、可擴展性等多種要求,同時肩負起了解放程序員生產力的作用。
2016年底,由于業務的不斷發展,我所在公司維護的項目也越來越“臃腫”。隨著無數個版本的迭代,以及開發人員的不斷增加,開發效率越來越低,每次投產的人力成本和時間成本都逐漸增加,我們一直在思索如何能破局。評估了各種方案后,最終微服務進入了我們的視野。
談到微服務,大家眾說紛紜,但卻很難有一個清晰的概念來描述。微服務不是“銀彈”,我理解的微服務是一種文化,而我們要做的就是將微服務的理念運用到實際開發中。那么下面我們就來聊聊微服務架構。
1.1 什么是微服務架構
1.2 垂直應用與微服務
1.3 實現一個最簡單的微服務框架
1.4 主流微服務框架介紹
隨著用戶需求個性化、產品生命周期變短,微服務架構是未來軟件架構朝著靈活性、擴展性、伸縮性以及高可用性發展的必然方向。這里主要將對比傳統的垂直應用與分布式微服務應用之間的區別。
1.1 什么是微服務架構
微服務是一種軟件架構風格,目標是將一個復雜的應用拆分成多個服務模塊,每個模塊專注單一業務功能對外提供服務,并可以獨立編譯及部署,同時各模塊間互相通信彼此協作,組合為整體對外提供完整服務。
微服務架構就像是活字印刷術,每個文字模都可以看成是一個微服務,它可以獨立地提供印刷服務,又可以將模塊之間組合,最終形成一篇完整文章提供更為復雜的印刷服務。
由于每個模塊都獨立部署,各自擁有互不干擾的內存空間,模塊之間無法直接調用,所以需要借助RPC(遠程過程調用協議)或HTTP協議讓各個模塊之間傳遞通信報文及交換數據,實現遠程調用,整個通信管理的過程也是微服務架構重要的組成部分。
1.2 垂直應用與微服務
MVC模式構建的垂直應用非常適合項目初期,使用其能夠方便地進行開發、部署、測試,但隨著業務的發展與訪問量的增加,垂直應用的問題也隨之暴露出來,而微服務架構可以很好地解決這些問題。
代碼維護
垂直應用里,大部分邏輯都部署在一個集中化、單一的環境或服務器中運行。垂直應用程序通常很大,由一個大型團隊或多個團隊維護。龐大的代碼庫可能給希望熟悉代碼的開發人員增加學習成本,還會讓應用程序開發過程中使用的開發環境工具和運行容器不堪重負,最終導致開發效率降低,可能會阻止對執行更改的嘗試。
微服務架構將這個龐大并且復雜的應用拆分成多個邏輯簡單且獨立的小應用,每個小應用交由不同的團隊或開發人員維護,彼此之間互不干擾,通過標準接口互相通信。對于希望熟悉代碼的開發人員來說只需掌握他所負責的應用即可,這樣做的好處是簡單、快速、邏輯清晰。
部署
垂直應用需要處理一個龐大的應用程序,編譯、部署需要花費很長時間,一個小的修改就可能導致重新構建整個項目。
微服務架構中對其中某一個服務進行修改,只需重新編譯、部署被改動的服務模塊。
資源控制
垂直應用里,當請求量過大導致單臺服務器無法支撐時,一般會將垂直應用部署在多臺服務器形成服務集群,并通過反向代理實現負載均衡。集群中的每個服務必須部署完整的應用,但在實際業務需求中僅有部分功能使用頻繁,但這種架構必須為不常用的功能分配計算資源。
微服務將提供功能的各服務拆分為多個服務模塊,它具有天生的集群屬性,能夠輕松地根據用量部署。
例如系統中的消息功能使用頻率占了整個系統的90%,而密碼找回功能則只占到2%。為了分解消息功能的壓力,以傳統負載均衡的方式進行集群化時,每個服務必須為使用量只有2%的密碼找回功能分配資源,這無疑造成了浪費。
在微服務架構中,消息功能使用率占據90%,則將消息模塊多部署幾個實例形成集群,而密碼找回功能所在的用戶模塊只部署一個就可以了。
穩定
垂直應用中如果有一個小的問題,就可能使整個系統崩潰。
微服務所拆分出的各個模塊中,由于模塊之間的耦合度很低,當發生問題時影響范圍被固定在該模塊本身,整個系統依然健全。
1.3 實現一個最簡單的微服務框架
基本工作流程如下。
① 客戶端發起調用請求。
② 將調用的內容序列化后通過網絡發給服務端。
③ 服務端接收到調用請求,執行具體服務并獲得結果。
④ 將結果序列化后通過網絡返回給客戶端。
1.3.1 公共接口
在發起遠程調用時,需要基于接口(Interface)來約定客戶端與服務端所調用服務的具體內容。為了方便管理依賴關系,這里使用Maven構建應用并編寫一些接口,以提供給客戶端與服務端使用。
當然也可以使用普通的Java應用來實現此簡單微服務框架,只需將該應用編譯后的jar包提供給后續的服務端與客戶端即可。
Maven 參數
編寫接口。
1.3.2 服務端
新建用于提供服務的Maven應用,并引入剛編寫的接口應用依賴。
Maven 參數
① 在pom.xml文件中引入依賴。
② 實現服務接口。
③ 編寫監聽服務類。
register()
提供一個數組保存所注冊的服務接口及實現類。
start()
啟動一個阻塞式的Socket服務用于等待客戶端發起的調用請求,當收到請求后將碼流反序列化成對象,并根據接口從注冊列表中尋找具體實現類,最終通過反射的方式調用該實現類返回結果。
④ 注冊服務并啟動服務端。
1.3.3 客戶端
新建用于調用服務的Maven應用,并引入剛編寫的接口應用依賴。
Maven 參數
① 在pom.xml文件中引入依賴。
② 編寫遠程調用類。
使用JDK動態代理方式,根據提供的服務接口類將接口序列化成碼流,向目標服務端發起Socket遠程調用請求,獲得服務端反饋的結果并反序列化成對象后返回。
③ 調用測試。
運行結果如下所示:
本章示例代碼詳見異步社區網站本書頁面。
1.3.4 完善框架
服務之間的調用已基本實現,但想將它投入正式開發使用還有很多細節需要完善。
通信
當請求過大后會發現,BIO(同步阻塞式)的通信方式會消耗過多的資源導致服務器變慢甚至崩潰。
序列化與反序列化
在發起網絡請求前,將對象轉換成二進制串便于網絡傳輸;收到消息請求后,將二進制串反轉換成對象便于后續處理。序列化及反序列化直接影響到整個RPC框架的效率及穩定性。
服務注冊中心
發起服務調用時,都需要指定服務提供方的訪問地址(ip + 端口),如果當前服務提供方有多個或一個服務部署在多個機器上,調用時每次手動指定訪問地址非常麻煩,這時就需要一個公共的注冊中心去管理這些服務。
負載均衡
實施微服務的目的是為了讓系統在進行橫向擴展時能夠擁有更多的計算資源,如果發現某一提供服務的機器負載較大,這就需要將新的需求轉發到其他空閑的機器上。
服務監控
服務提供方有可能崩潰無法繼續提供服務,在客戶端進行調用時就需要將這些無法使用的服務排除掉。
異常處理
當服務端有異常發生導致無法返回正確的結果時,客戶端并不知道該如何處理,只能等待并最終以超時結束此次遠程調用請求。
以上所有的問題在后續將要介紹的Dubbo與Spring Cloud分布式框架中都得到了很好的解決,甚至基于Spring Boot構建的應用能讓整個開發過程變得輕松愉快。
1.4 主流微服務框架介紹
1.4.1 Dubbo
阿里巴巴在2011年開源了Dubbo框架,雖然在2013年停止更新,但在2017年9月又重啟維護并發布了新版本。目前已有很多的公司將自己的業務建立在Dubbo之上,同時阿里云也推出了企業級分布式應用服務EDAS,為Dubbo提供應用托管。
Dubbo采用Zookeeper作為注冊中心,RPC作為服務調用方式,致力于提供高性能和透明化的RPC遠程服務調用方案。它與Spring無縫集成,基于服務提供方(服務端)與服務調用方(客戶端)角色構建簡單模型,其優點是使用方便、學習成本低。
0102.tif{60%}① 服務提供方發布服務到服務注冊中心。
② 服務消費方從服務注冊中心訂閱服務。
③ 注冊中心通知消息調用方服務已注冊。
④ 服務消費方調用已經注冊的可用服務。
⑤ 監控計數。
1.4.2 Spring Cloud
Spring Cloud基于Spring Boot實現,使用HTTP的RESTful風格API作為調用方式。它所包含的多個子項目共同構建了微服務架構體系。
0103.tif{70%}Netflix Eureka
Spring Cloud 的服務注冊中心提供服務注冊、服務發現、負載均衡等功能。
Netflix Hystrix
當某個服務發生故障之后,則觸發熔斷機制(Hystrix)向服務調用方返回結果標識錯誤,而不是一直等待服務提供方返回結果,這樣就不會使得線程因調用故障服務而被長時間占用不釋放,避免了故障在分布式系統中的蔓延。
Netflix Zuul
代理各模塊提供的服務,統一暴露給第三方應用。提供動態路由、監控、彈性、全等的邊緣服務。
Config Server
分布式架構下多微服務會產生非常多的配置文件,分布式配置中心(Config Server)將所有配置文件交由GIT或SVN進行統一管理,避免出錯。
Spring Boot
在使用Spring開發時,通常需要完成Spring框架及其他第三方工具配置文件的編寫,非常麻煩。Spring Boot通過犧牲項目的自由度來減少配置的復雜度,約定一套規則,把這些框架都自動配置集成好,從而達到“開箱即用”。
本文摘自《微服務分布式構架開發實戰》
《微服務分布式架構開發實戰》
龔鵬rico 著
點擊封面購買紙書https://item.jd.com/25596768986.html
本書并沒有過多的探討理論性的東西,基于現有成熟框架,圍繞實際項目中遇見的具體需求,以微服務分布式架構的角度去逐一分解并且實現這些需求。掌握這些知識的讀者,完全有能力快速搭建出可靠、高效、靈活的微服務分布式架構。
微服務好書重磅推薦:
《深入理解Spring Cloud與微服務構建》
方志朋 著
點擊封面購買紙書https://item.jd.com/12312724.html
本書主要針對Java開發者構建微服務框架,作者比較青睞于Java 語言的Spring Cloud微服務框架,究其原因是Spring Cloud有快速開發、持續交付和易于部署等特點,且開源社區比較活躍,同時有國際巨頭公司的推動。本書在Spring Cloud框架范圍內,介紹了服務注冊和發現的Eureka組件、負載均衡Ribbon組件、熔斷器Hystrix組件、路由網關Zuul組件、Spring Cloud配置中心、服務鏈路追蹤等內容,同時也與其他微服務框架做了對比,拓展了微服務知識的深度和廣度。本書結構清晰,行文優美,每一個例子都經過作者斟酌再三,力求使用最簡單的例子,將復雜的邏輯原理闡述清楚,讓讀者印象深刻。
延伸推薦
你看過最有意思的科技類公眾號是什么?為什么?截止時間2月26日17時,小編將選出一名讀者贈送異步圖書一本。
點擊關鍵詞新書:
Python|機器學習|Kotlin|Java|移動開發|機器人|有獎活動|Web前端|書單
在“異步圖書”后臺回復“關注”,即可免費獲得2000門在線視頻課程;推薦朋友關注根據提示獲取贈書鏈接,免費得異步圖書一本。趕緊來參加哦!
點擊閱讀原文,查看本書更多信息
掃一掃上方二維碼,回復“關注”參與活動!
總結
以上是生活随笔為你收集整理的你所不了解的微服务架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【地图导航】3D地图软件是如何做路径规划
- 下一篇: #萌新日志#3.使用pix2pix Cy