什么是微服務(wù)?
微服務(wù)的概念最早是在 2014 年由 Martin Fowler 和 James Lewis 共同提出,他們定義了微服務(wù)是由單一應(yīng)用程序構(gòu)成的小服務(wù),擁有自己的進(jìn)程與輕量化處理,服務(wù)依業(yè)務(wù)功能設(shè)計(jì),以全自動(dòng)的方式部署,與其他服務(wù)使用 HTTP API 通訊。同時(shí),服務(wù)會(huì)使用最小規(guī)模的集中管理 (例如 Docker)技術(shù),服務(wù)可以用不同的編程語言與數(shù)據(jù)庫等。 微服務(wù)是SOA架構(gòu)下的最終產(chǎn)物,該架構(gòu)的設(shè)計(jì)目標(biāo)是為了肢解業(yè)務(wù),使得服務(wù)能夠獨(dú)立運(yùn)行。 主要有一下幾個(gè)特點(diǎn)
服務(wù)拆分粒度更細(xì) 微服務(wù)可以說是更細(xì)維度的服務(wù)化,小到一個(gè)子模塊,只要該模塊依賴的資源與其他模塊都沒有關(guān)系,那么就可以拆分為一個(gè)微服務(wù)。
服務(wù)獨(dú)立部署 每個(gè)微服務(wù)都嚴(yán)格遵循獨(dú)立打包部署的準(zhǔn)則,互不影響。比如一臺(tái)物理機(jī)上可以部署多個(gè) Docker 實(shí)例,每個(gè) Docker 實(shí)例可以部署一個(gè)微服務(wù)的代碼。
服務(wù)獨(dú)立維護(hù) 每個(gè)微服務(wù)都可以交由一個(gè)小團(tuán)隊(duì)甚至個(gè)人來開發(fā)、測(cè)試、發(fā)布和運(yùn)維,并對(duì)整個(gè)生命周期負(fù)責(zé)。
服務(wù)治理能力要求高 因?yàn)椴鸱譃槲⒎?wù)之后,服務(wù)的數(shù)量變多,因此需要有統(tǒng)一的服務(wù)治理平臺(tái),來對(duì)各個(gè)服務(wù)進(jìn)行管理。
微服務(wù)架構(gòu)下,服務(wù)調(diào)用主要依賴下面幾個(gè)基本組件:服務(wù)描述 注冊(cè)中心 服務(wù)框架 服務(wù)監(jiān)控 服務(wù)追蹤 服務(wù)治理
開源RPC框架介紹
Dubbo
國內(nèi)最早開源的 RPC 框架,由阿里巴巴公司開發(fā)并于 2011 年末對(duì)外開源,僅支持 JAVA 語言。中間一度沒人維護(hù)坑了不少人,17年重啟維護(hù)煥發(fā)新春。架構(gòu)圖如下
官網(wǎng): http://dubbo.io/
通信框架方面,Dubbo 默認(rèn)采用了 Netty 作為通信框架。
通信協(xié)議方面,Dubbo 除了支持私有的 Dubbo 協(xié)議外,還支持 RMI 協(xié)議、Hession 協(xié)議、HTTP 協(xié)議、Thrift 協(xié)議等。
序列化格式方面,Dubbo 支持多種序列化格式,比如 Dubbo、Hession、JSON、Kryo、FST 等。
性能: http://dubbo.Apache.org/zh-cn/docs/user/perf-test.html
Tars
Tars是基于名字服務(wù)使用Tars協(xié)議的高性能RPC開發(fā)框架,同時(shí)配套一體化的服務(wù)治理平臺(tái),幫助個(gè)人或者企業(yè)快速的以微服務(wù)的方式構(gòu)建自己穩(wěn)定可靠的分布式應(yīng)用。 Tars是將騰訊內(nèi)部使用的微服務(wù)架構(gòu)TAF(Total Application Framework)多年的實(shí)踐成果總結(jié)而成的開源項(xiàng)目。
官網(wǎng):https://github.com/TarsCloud/Tars
架構(gòu)圖如下
開源協(xié)議為:BSD-3-Clause
支持多語言 C++,Java,Nodejs,php,Go
性能:https://github.com/TarsCloud/Tars/blob/master/docs/tars_performce.md
gRPC
一開始由 google 開發(fā),是一款語言中立、平臺(tái)中立、開源的遠(yuǎn)程過程調(diào)用(RPC)系統(tǒng)。 官網(wǎng):https://grpc.io
基于HTTP/2 HTTP/2 提供了連接多路復(fù)用、雙向流、服務(wù)器推送、請(qǐng)求優(yōu)先級(jí)、首部壓縮等機(jī)制。可以節(jié)省帶寬、降低TCP鏈接次數(shù)、節(jié)省CPU,幫助移動(dòng)設(shè)備延長(zhǎng)電池壽命等。gRPC 的協(xié)議設(shè)計(jì)上使用了HTTP2 現(xiàn)有的語義,請(qǐng)求和響應(yīng)的數(shù)據(jù)使用HTTP Body 發(fā)送,其他的控制信息則用Header 表示。
IDL使用ProtoBuf gRPC使用ProtoBuf來定義服務(wù),ProtoBuf是由Google開發(fā)的一種數(shù)據(jù)序列化協(xié)議(類似于XML、JSON、hessian)。ProtoBuf能夠?qū)?shù)據(jù)進(jìn)行序列化,并廣泛應(yīng)用在數(shù)據(jù)存儲(chǔ)、通信協(xié)議等方面。壓縮和傳輸效率高,語法簡(jiǎn)單,表達(dá)力強(qiáng)。
多語言支持(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java) gRPC支持多種語言,并能夠基于語言自動(dòng)生成客戶端和服務(wù)端功能庫。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發(fā)中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經(jīng)支持Android開發(fā)。
Motan
Motan 是國內(nèi)另外一個(gè)比較有名的開源的 RPC 框架,同樣也只支持 Java 語言實(shí)現(xiàn),它的架構(gòu)可以用下面這張圖描述。
Motan 與 Dubbo 的架構(gòu)類似,都需要在 Client 端(服務(wù)消費(fèi)者)和 Server 端(服務(wù)提供者)引入 SDK,其中 Motan 框架主要包含下面幾個(gè)功能模塊。
register:用來和注冊(cè)中心交互,包括注冊(cè)服務(wù)、訂閱服務(wù)、服務(wù)變更通知、服務(wù)心跳發(fā)送等功能。Server 端會(huì)在系統(tǒng)初始化時(shí)通過 register 模塊注冊(cè)服務(wù),Client 端會(huì)在系統(tǒng)初始化時(shí)通過 register 模塊訂閱到具體提供服務(wù)的 Server 列表,當(dāng) Server 列表發(fā)生變更時(shí)也由 register 模塊通知 Client。
protocol:用來進(jìn)行 RPC 服務(wù)的描述和 RPC 服務(wù)的配置管理,這一層還可以添加不同功能的 filter 用來完成統(tǒng)計(jì)、并發(fā)限制等功能。
serialize:將 RPC 請(qǐng)求中的參數(shù)、結(jié)果等對(duì)象進(jìn)行序列化與反序列化,即進(jìn)行對(duì)象與字節(jié)流的互相轉(zhuǎn)換,默認(rèn)使用對(duì) Java 更友好的 Hessian 2 進(jìn)行序列化。
transport:用來進(jìn)行遠(yuǎn)程通信,默認(rèn)使用 Netty NIO 的 TCP 長(zhǎng)鏈接方式。
cluster:Client 端使用的模塊,cluster 是一組可用的 Server 在邏輯上的封裝,包含若干可以提供 RPC 服務(wù)的 Server,實(shí)際請(qǐng)求時(shí)會(huì)根據(jù)不同的高可用與負(fù)載均衡策略選擇一個(gè)可用的 Server 發(fā)起遠(yuǎn)程調(diào)用。
Spring Cloud
Spring Cloud 是為了解決微服務(wù)架構(gòu)中服務(wù)治理而提供的一系列功能的開發(fā)框架,它是完全基于 Spring Boot 進(jìn)行開發(fā)的,Spring Cloud 利用 Spring Boot 特性整合了開源行業(yè)中優(yōu)秀的組件,整體對(duì)外提供了一套在微服務(wù)架構(gòu)中服務(wù)治理的解決方案。它的架構(gòu)圖可以用下面這張圖來描述。
以下為Spring Cloud的核心功能:
- 分布式/版本化配置
- 服務(wù)注冊(cè)和發(fā)現(xiàn)
- 路由
- 服務(wù)和服務(wù)之間的調(diào)用
- 負(fù)載均衡
- 斷路器
- 分布式消息傳遞
Spring Cloud對(duì)于中小型互聯(lián)網(wǎng)公司來說是一種福音,因?yàn)檫@類公司往往沒有實(shí)力或者沒有足夠的資金投入去開發(fā)自己的分布式系統(tǒng)基礎(chǔ)設(shè)施,使用Spring Cloud一站式解決方案能在從容應(yīng)對(duì)業(yè)務(wù)發(fā)展的同時(shí)大大減少開發(fā)成本。
下圖是RPC框架詳細(xì)的比較
如何選擇?
一家A輪融資的公司 原來架構(gòu)是net,想換java架構(gòu)。 公司沒有強(qiáng)大的研發(fā)實(shí)力,公司主要是to B業(yè)務(wù),對(duì)并發(fā)要求不高,那可以試試Spring Cloud 架構(gòu), Spring Cloud 不僅提供了基本的 RPC 框架功能,還提供了服務(wù)注冊(cè)組件、配置中心組件、負(fù)載均衡組件、斷路器組件、分布式消息追蹤組件等一系列組件,被技術(shù)圈的人稱之為“Spring Cloud 全家桶”,而 Dubbo、Motan 基本上只提供了最基礎(chǔ)的 RPC 框架的功能,其他微服務(wù)組件都需要自己去實(shí)現(xiàn),對(duì)于這類研發(fā)能力弱的團(tuán)隊(duì),SpringCloud 無疑是最合適的,減少了研發(fā)成本,社區(qū)熱度高,相關(guān)的教程文檔很多,減少了入門成本;
再比如這家公司不準(zhǔn)備切換Java框架還是繼續(xù)使用net架構(gòu), 有一定的研發(fā)能力,對(duì)并發(fā)要求很高, 那gRPC無疑是最適合的,跨語言支持,高性能;
沒有完美的解決方案,只有最合適的