印象中從2016年開始「微服務」這個詞逐漸爲人們所熟知,那究竟什麼是微服務呢?redis
微服務是一種軟件架構風格,一種架構模式,提倡將單體應用劃分爲一組小的服務,服務之間互相協調,互相配合,爲用戶提供最終價值。架構
每一個服務運行在其獨立的進程中,服務與服務之間採用輕量級的通訊機制互相溝通(一般是基於HTTP的RESTful API),通訊的方式應該與語言無關(C/C++/Golang/Python...),與平臺無關(Windows/Linux/AIX/Android...)。運維
每一個服務都圍繞這具體業務進行構建,而且可以被獨立地部署到生產環境、類生產環境等。另外,應儘可能避免統一的、集中式的服務管理機制,對具體的一個服務而言,應根據業務上下文,選擇合適的語言、工具對其進行構建。異步
傳統三層架構圖分佈式
三層架構一般包括表示層(UI),業務邏輯層以及數據訪問層。主要面臨的問題:微服務
微服務架構圖工具
分佈式系統的複雜度。微服務架構是一種分佈式系統,從交付的角度出發,構建分佈式系統必然會帶來額外的開銷,例如性能(進程內通訊VS跨機通訊),可靠性(遠程訪問的可靠性),數據一致性(不一樣節點間數據同步問題)等等。性能
微服務其實不算是一個全新的概念,早在1996年,Gartner就提出了面向服務架構(SOA),闡述了「對於複雜的企業IT系統,應按照不一樣的、可重用的力度劃分,將功能相關的一組功能提供者組織在一塊兒爲消費者提供服務」。既然相關的概念早就有了,那爲何微服務是最近幾年才火爆起來呢?學習
由於拋開自動化的CI/CD,相關的服務網關,服務註冊與發現 去空談微服務是沒有辦法精準落地的,得益於2014年Docker的橫空出世解決了應用打包問題,2016年K8S在容器編排大戰中完勝Mesos和Swarm,微服務相關的生態才被完美建設起來,纔有了精準落地的可行性。測試
微服務架構的本質是分佈式系統,隨着系統複雜度的增長以及微服務數量的增多,如何選擇輕量級通訊機制、完成服務和服務之間的協做和交互愈加重要。這裏主要比對RPC(例如Thrift),RESTful HTTP,消息隊列(例如beanstalk/redis)。
RPC(遠程方法調用) | REST | 消息隊列 | |
通訊方式 | 同步通訊 | 同步通訊 | 異步通訊 |
平臺依賴性 | 強 | 平臺無關 | 強 |
語言支持 | 好 | 語言無關 | 好 |
學習成本 | 高 | 低 | 高 |
維護成本 | 高 | 低 | 高 |
若是是同步的通訊方式推薦使用RESTful HTTP通訊方式,輕量級,且與平臺和語言無關,幾乎沒有學習的成本。
若是須要異步的通訊方式推薦使用消息隊列,生產者和消費者異步有利於提升整個系統的性能,可是須要學習消息隊列的用法,而且作好選型,還需考慮消息隊列的高可用等等。