摘要: - 一,、遠(yuǎn)程調(diào)用技術(shù)簡史 - 二,、gRPC 簡介 - 三、gRPC 示例代碼 自從產(chǎn)業(yè)界發(fā)明機(jī)器聯(lián)網(wǎng)的那一天就已經(jīng)開始探索最優(yōu)的遠(yuǎn)程通信機(jī)制,。操作系統(tǒng)如 UNIX,、Windows 和 Linux 等都有實(shí)現(xiàn)遠(yuǎn)程通信的內(nèi)部協(xié)議,挑戰(zhàn)在于如何向開發(fā)人員開放一個(gè)通信框架,。 一,、遠(yuǎn)程調(diào)用技術(shù)簡史在20世紀(jì)90年代,當(dāng) TCP/IP 協(xié)議日臻成熟變成網(wǎng)絡(luò)通信的黃金標(biāo)準(zhǔn)時(shí),,焦點(diǎn)轉(zhuǎn)移到跨平臺(tái)通信 —— 一臺(tái)計(jì)算機(jī)可以通過某種類型網(wǎng)絡(luò)在另一臺(tái)計(jì)算機(jī)上發(fā)起一個(gè)動(dòng)作,。例如如 CORBA、DCOM,、Java RMI 技術(shù),,在核心網(wǎng)絡(luò)基礎(chǔ)設(shè)施之上創(chuàng)造了一個(gè)對(duì)開發(fā)者友好的抽象層。這些技術(shù)還試圖發(fā)展出一套與開發(fā)語言無關(guān)的通信框架,,這一點(diǎn)對(duì)于客戶機(jī)/服務(wù)器體系結(jié)構(gòu)至關(guān)重要,。 隨著本世紀(jì)初 Web 技術(shù)的演進(jìn),HTTP 逐漸演變?yōu)槭聦?shí)上的通信標(biāo)準(zhǔn),。HTTP 結(jié)合 XML 提供了一種自我描述,、不依賴語言、與平臺(tái)無關(guān)的遠(yuǎn)程通信框架,。這種結(jié)合的成果是 SOAP 和 WSDL 標(biāo)準(zhǔn),它們保證了在各種運(yùn)行環(huán)境和平臺(tái)之間實(shí)現(xiàn)互操作的標(biāo)準(zhǔn)化,。 下一個(gè)沖擊互聯(lián)網(wǎng)的浪潮是 Web 編程,。許多開發(fā)人員發(fā)現(xiàn)定義 SOAP 標(biāo)準(zhǔn)的 HTTP 和 XML 的組合過于嚴(yán)格。這時(shí) JavaScript 和 JSON 開始流行了,。Web 2.0 現(xiàn)象(API 發(fā)揮了關(guān)鍵作用), JSON 替代 XML 成為首選的協(xié)議,。HTTP 和 JSON 這對(duì)致命的組合,催生了一個(gè)新的非官方標(biāo)準(zhǔn) REST 。SOAP 要求嚴(yán)格遵守標(biāo)準(zhǔn)和結(jié)構(gòu)定義,,僅局限于大型企業(yè)應(yīng)用程序,,而 REST 在當(dāng)代開發(fā)人員中很受歡迎。 1.1 HTTP, REST 和微服務(wù)歸功于 JavaScript 框架,,Node.js 以及文檔數(shù)據(jù)庫的發(fā)展,,REST 在 Web 開發(fā)者中廣受歡迎。許多應(yīng)用程序開始基于 REST 實(shí)現(xiàn) ,,即使是內(nèi)部序列化和通信模式領(lǐng)域,。但 HTTP 是最有效的消息交換協(xié)議嗎?即使在同一上下文,、同一網(wǎng)絡(luò),,或者是同一臺(tái)機(jī)器上運(yùn)行的服務(wù)之間?HTTP 的便捷性與高性能之間需要作出權(quán)衡,,這促使我們回到問題的起點(diǎn),,尋找微服務(wù)架構(gòu)中最優(yōu)的通信框架。 進(jìn)入 gRPC 時(shí)代 —— 來自谷歌,,現(xiàn)代的輕量級(jí)通信協(xié)議,。這是一個(gè)高性能的、開源的通用遠(yuǎn)程過程調(diào)用(RPC) 框架,,它可以在多種開發(fā)語言,、任何操作系統(tǒng)上運(yùn)行。 gRPC 在推出的第一年內(nèi)就被 CoreOS,,Netflix,,Square 和 Cockroach Labs 等機(jī)構(gòu)采用。 CoreOS 團(tuán)隊(duì)的 Etcd,,是一種分布式鍵/值存儲(chǔ)服務(wù),,采用 gRPC 實(shí)現(xiàn)端通信。電信公司如 Cisco,,Juniper 和 Arista 都使用 gRPC 實(shí)現(xiàn)數(shù)據(jù)流遙測(cè)和網(wǎng)絡(luò)設(shè)備配置,。 1.2 什么是 gRPC ?當(dāng)我第一次遇到 gRPC,它使我想到 CORBA,。兩個(gè)框架都基于語言無關(guān)的接口定義語言(IDL) 聲明服務(wù),,通過特定的語言綁定實(shí)現(xiàn)。 CORBA 和 gRPC 二者的設(shè)計(jì),,都是為了使客戶端相信服務(wù)器在同一臺(tái)機(jī)器,。客戶機(jī)在樁(Stub)上調(diào)用一個(gè)方法(method),,調(diào)用過程由底層協(xié)議透明地處理,。 gRPC 的秘訣在于處理序列化的方式,。gRPC 基于 Protocol Buffer,一個(gè)開源的用于結(jié)構(gòu)化數(shù)據(jù)序列化機(jī)制,,它是語言和平臺(tái)無關(guān)的,。Protocol Buffer 的描述非常詳細(xì),與 XML 類似,。但是它們比其他的協(xié)議格式更小,,更快,效率更高,。任何需要序列化的自定義數(shù)據(jù)類型在 gRPC 被定義為一個(gè) Protocol Buffer ,。 Protocol Buffer 的最新版本是 proto3,支持多種開發(fā)語言的代碼生成,,Java , C++,,Python,Ruby , Java Lite , JavaScript,,Objective-C 和 C # ,。當(dāng)一個(gè) Protocol Buffer 編譯為一個(gè)特定的語言,它的訪問器(setter 和 getter)為每個(gè)字段提供定義,。 相比于 REST + JSON 組合 ,,gRPC 提供更好的性能和安全性。它極大的促進(jìn)了在客戶端和服務(wù)器之間使用 SSL / TLS 進(jìn)行身份驗(yàn)證和數(shù)據(jù)交換加密,。 為什么微服務(wù)開發(fā)者需要使用 gRPC ,?gRPC 采用 HTTP / 2 以支持高性能的、可擴(kuò)展的 API ,。報(bào)文使用二進(jìn)制而不是文本通信可以保持載荷緊湊,、高效。HTTP / 2 請(qǐng)求在一個(gè) TCP 連接上可支持多路復(fù)用,,允許多個(gè)消息并發(fā)傳送而不影響網(wǎng)絡(luò)資源利用率,。gRPC 使用報(bào)頭壓縮(header compression )來減少請(qǐng)求和響應(yīng)的大小。 二,、gRPC 簡介2.1 創(chuàng)建 gRPC 服務(wù)的流程
Note:Node.js 客戶端不需要生成存根(Stub),,只要 Protocol Buffer 文件是可訪問的,它就可以直接與服務(wù)端對(duì)話,。 三,、gRPC 示例代碼為了進(jìn)一步熟悉 gRPC,我們將用 Python 語言創(chuàng)建一個(gè)簡單的計(jì)算服務(wù),。它將同時(shí)被一個(gè) Python 客戶端和一個(gè) Node.js 客戶端調(diào)用,。以下測(cè)試示例運(yùn)行在 Mac OS X 。 你可以從 GitHub 庫 https://github.com/grpc/grpc/tree/master/examples 訪問源代碼,,在自己的機(jī)器上運(yùn)行示例,。
|
|