傳統IT架構面臨的一些問題:
對於企業:node
對於產品:git
此外,從技術方面看,雲計算及互聯網公司大量開源輕量級技術不停涌現並日漸成熟:github
這一切都催生了新的架構設計風格 – 微服務架構的出現。spring
參考2014年3月Martin Fowler關於微服務架構的文章。微服務架構是一種架構模式,它提倡將單一應用程序劃分紅一組小的服務,服務之間互相協調、互相配合,爲用戶提供最終價值。每一個服務運行在其獨立的進程中,服務與服務間採用輕量級的通訊機制互相協做(一般是基於HTTP協議的Restful API)。每一個服務都圍繞着具體業務進行構建,並使用自動化佈署工具進行獨立的發佈。能夠有一個很是輕量級的集中式管理來協調這些服務,可使用不一樣的語言來編寫服務,也可使用不一樣的數據存儲。數據庫
In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.緩存
微服務架構 ≈ 模塊化開發 + 分佈式計算安全
通用特性:網絡
經過服務實現應用的組件化
圍繞業務能力組織服務
每一個微服務僅關注於完成一件任務並很好地完成該任務。每一個任務表明着一個小的業務能力。 因相同緣由而變化的功能聚合到一塊兒,而把因不一樣緣由而變化的功能分離開智能端點與管道扁平化
去中心化
使用合適的工具完成各自的任務基礎設施自動化
架構 | 優勢 | 缺點 | 適用場景 |
---|---|---|---|
單體應用 | 1. 開發簡單直接,集中式管理 2. 功能都在本地,沒有分佈式的管理開銷和調用開銷 |
1. 隨着項目增大,會帶來開發效率低,代碼維護難,部署不靈活的問題 2. 擴展性不足(橫向的硬件資源擴展和縱向的功能擴展) |
小項目,臨時項目 |
微服務 | 1. 下降系統複雜度。單體應用分解爲一組服務,每一個服務都比較簡單,只關注於一個業務功能 2. 鬆耦合,服務可獨立開發 3. 跨語言,選擇合適的語言和技術,而且易於重構和升級 4. 服務可獨立部署,使得持續集成和部署成爲可能也是必須 5. 服務可獨立擴展,根據服務特性選擇硬件資源 6. 和 Docker 容器結合的更好 |
1. 分佈式使服務間的調用,通訊,跟蹤變的複雜 2. 分區的數據庫體系和分佈式事務 3. 服務數量多,系統碎片化。必須考慮到部署,管理問題 4. 跨多個服務的更改須要仔細規劃和協調 |
大且業務複雜度高的項目, 須要長期演進的項目 |
架構 | 相同點 | 差別點 |
---|---|---|
SOA | 以服務爲核心 | SOA更關注企業規模範圍,強調的是異構系統之間的通訊和解耦合。 重ESB 以Web Service/BMP/ESB等技術爲主 |
微服務 | 以服務爲核心 | 微服務架構則更關注應用規模範圍,強調的是系統按業務邊界作細粒度的拆分和部署。 微服務甚至是去ESB、去中心化、分佈式 採用許多新的開源技術和經驗 |
可是顯而易見,不管是Dubbo仍是Spring Cloud都只適用於特定的應用場景和開發環境,它們的設計目的並非爲了支持通用性和多語言性。而且它們只是Dev層的框架,缺乏DevOps的總體解決方案(這正是微服務架構須要關注的)。架構
2017 年末,非侵入式的 Service Mesh 技術從萌芽到走向了成熟。譯做「服務網格」,做爲服務間通訊的基礎設施層。能夠將它比做是應用程序或者說微服務間的 TCP/IP,負責服務之間的網絡調用、限流、熔斷和監控。
Service Mesh有以下幾個特色:
目前流行的Service Mesh開源軟件有Linkerd,Envoy,Istio,Conduit等。
Linkerd和Envoy比較類似,都是一種面向服務通訊的網絡代理,都可實現諸如服務發現、請求路由、負載均衡等功能。它們的設計目標就是爲了解決服務之間的通訊問題,使得應用對服務通訊無感知,這也是Service Mesh的核心理念。Linkerd和Envoy像是分佈式的Sidebar,多個相似Linkerd和Envoy的proxy互相鏈接,就組成了service mesh。
而Istio則是站在了一個更高的角度,它將Service Mesh分爲了Data Plane和Control Plane。Data Plane負責微服務間的全部網絡通訊,而Control Plane負責管理Data Plane Proxy。Conduit定位和功能與Istio相似。