Go Micro(2)——微服務(wù)工具箱

微服務(wù)工具箱

現(xiàn)在你也許聽(tīng)到了這個(gè)新現(xiàn)象:微服務(wù)。如果你對(duì)此不熟悉也有興趣學(xué)習(xí),歡迎參考上一篇文章。

這篇文章我們將討論 Micro - 一個(gè)開(kāi)源的微服務(wù)工具箱,Micro 提供了核心的必須工具來(lái)構(gòu)建和管理微服務(wù)。它包含了一系列由 golang 開(kāi)發(fā)的庫(kù)和工具,同時(shí)也通過(guò) Sidecar 特性與其他語(yǔ)言兼容。

在我們開(kāi)始了解 Micro 之前,我們討論一下為什么我們要把時(shí)間花費(fèi)在它上面。

開(kāi)發(fā)與部署

從我們過(guò)去在軟件工程領(lǐng)域的經(jīng)驗(yàn)可以很清晰的看到,我們有這樣一種需求:專(zhuān)注于開(kāi)發(fā)而不是部署。PasS 的解決方案是可行的,類(lèi)似 AWS,Google 和微軟的公司,提供了功能豐富的平臺(tái),并快速的推進(jìn)著容器技術(shù)(container)。所有的這些讓我們點(diǎn)幾下鼠標(biāo)就能使用大規(guī)模計(jì)算服務(wù)。

新世界看著不錯(cuò),你也許說(shuō)這解決了你所有的問(wèn)題,真的是這樣嗎?當(dāng)我們能接觸到大規(guī)模計(jì)算的能力時(shí),仍然缺少工具來(lái)讓我們發(fā)揮出大規(guī)模計(jì)算的優(yōu)勢(shì)。不僅如此,在這個(gè)新世界中,容器的生命周期變得更加短暫,在運(yùn)行時(shí)調(diào)度中不斷創(chuàng)建和銷(xiāo)毀。

規(guī)模的挑戰(zhàn)

另一個(gè)問(wèn)題是,正如我們一次又一次看到的,我們一直是巨型架構(gòu)的受害者。隨著功能需求的增加,現(xiàn)在的趨勢(shì)是在巨型系統(tǒng)上不斷增加功能,直到不斷增加的技術(shù)債務(wù)讓我們回天乏術(shù)。除此以外,隨著組織不斷擴(kuò)張工程師團(tuán)隊(duì),開(kāi)發(fā)者想要單獨(dú)的進(jìn)行代碼開(kāi)發(fā),或者開(kāi)發(fā)功能時(shí)不被其他人 block,變得極其困難。

這是一種難以避免的需求:重新進(jìn)行架構(gòu)設(shè)計(jì),使用 SOA 或者微服務(wù)架構(gòu)。公司需要在研發(fā)上投入努力,在嘗試和錯(cuò)誤中學(xué)習(xí)。現(xiàn)在正需要這樣一種工具來(lái)幫助我們構(gòu)建可擴(kuò)展系統(tǒng),減少研發(fā)部門(mén)的阻礙,由在此領(lǐng)域有經(jīng)驗(yàn)的人士為大家提供建議。

了解 Micro

Micro 中我們構(gòu)建了一個(gè)微服務(wù)生態(tài)系統(tǒng),包括用于開(kāi)發(fā)的基本的工具、服務(wù)和解決方案。我們已經(jīng)構(gòu)建好了基礎(chǔ)的工具,這個(gè)工具與整個(gè)項(xiàng)目同名,也叫 Micro,這一工具讓我們更容易構(gòu)建可擴(kuò)展的架構(gòu),提供效率。

讓我們更深入的挖掘 Micro 的特性。

Go Micro

Go Micro 是一個(gè) golang 編寫(xiě)的用于構(gòu)建微服務(wù)的插件化的 RPC 框架。它實(shí)現(xiàn)了服務(wù)創(chuàng)建、服務(wù)發(fā)現(xiàn)、服務(wù)間通信需要的功能需求。任何優(yōu)秀的微服務(wù)架構(gòu)都需要解決這三個(gè)基礎(chǔ)問(wèn)題:服務(wù)發(fā)現(xiàn)、同步通信和異步通信。

Go Micro 包括以下這些包和功能:

  • Registry:客戶端的服務(wù)發(fā)現(xiàn)
  • Transport:同步通信
  • Broker:異步通信
  • Selector:節(jié)點(diǎn)過(guò)濾、負(fù)載均衡
  • Codec:消息編解碼
  • Server:基于此庫(kù)構(gòu)建RPC服務(wù)端
  • Client:基于此庫(kù)構(gòu)建RPC客戶端

Go Micro 跟其他工具最大的不同是它是插件化的架構(gòu),這讓上面每個(gè)包的具體實(shí)現(xiàn)都可以切換出去。舉個(gè)例子,默認(rèn)的服務(wù)發(fā)現(xiàn)的機(jī)制是通過(guò) Consul,但是如果想切換成 etcd 或者 zookeeper 或者任何你實(shí)現(xiàn)的方案,都是非常便利的。官方實(shí)現(xiàn)的插件可以在這個(gè)地址看到:[github.com/micro/go-plugins]

插件化架構(gòu)的最大好處是你可以選擇你喜歡的平臺(tái)來(lái)支撐微服務(wù)架構(gòu),但無(wú)需更改任何底層代碼。Go Micro 無(wú)需任何更改,只需要 import 你的插件,直接使用即可。

Go Micro 是編寫(xiě)微服務(wù)的切入點(diǎn),readme 提供了說(shuō)明包括怎樣編寫(xiě)、運(yùn)行和查詢(xún)一個(gè)服務(wù)。這個(gè) greeter 示例可以參考:micro/examples/greeter ,更多的服務(wù)示例可以在這個(gè)工程看到: github.com/micro

Sidecar

Go Micro 提供了用 Golang 編寫(xiě)服務(wù)的方式,那么其他編程語(yǔ)言呢?我們?cè)鯓訕?gòu)建一個(gè)有兼容性的系統(tǒng),讓任何人都能受益于 Micro?雖然 Micro 是用 golang 編寫(xiě)的,我們提供了一個(gè)快速且方便的方式,讓其他語(yǔ)言能夠接入。

Sidecar 是一個(gè)輕量級(jí)的組裝服務(wù),概念上來(lái)說(shuō)就是將 Micro 的庫(kù)提供的功能,依附于其他語(yǔ)言的主程序中。Sidecar 本質(zhì)上是一個(gè)單獨(dú)運(yùn)行的服務(wù),通過(guò) http 提供接口,其他語(yǔ)言通過(guò)接口使用 Go Micro 提供的功能。

Sidecar 的特性:

  • 在服務(wù)發(fā)現(xiàn)系統(tǒng)進(jìn)行注冊(cè)
  • 發(fā)現(xiàn)其他服務(wù)
  • 與主程序進(jìn)行健康檢查
  • 作為代理與 RPC 系統(tǒng)通信
  • 通過(guò) websocket 訂閱

[圖片上傳失敗...(image-e9608-1513045777103)]

rubypython 借助Sidecar 進(jìn)行使用的例子可以在這里看到 micro/examples/greeter,我們會(huì)提供更多示例,幫助理解 Sidecar 的使用。


API

服務(wù)之間請(qǐng)求調(diào)用是非常簡(jiǎn)單直接的,但外部調(diào)用就要復(fù)雜一些。具體的服務(wù)實(shí)例可能會(huì)崩潰,重新調(diào)度,并監(jiān)聽(tīng)隨機(jī)的端口。API 這個(gè)組件提供了一個(gè)接入點(diǎn),外部的服務(wù)可以通過(guò)這個(gè) API 網(wǎng)關(guān)向內(nèi)部的服務(wù)發(fā)起請(qǐng)求。

API 提供了幾種不同的請(qǐng)求方式

/rpc

每個(gè)單獨(dú)的服務(wù)可以通過(guò) /rpc 這個(gè)接入點(diǎn)進(jìn)行訪問(wèn),示例如下:

curl \
    -d "service=go.micro.srv.greeter" \
    -d "method=Say.Hello" \
    -d "request={\"name\": \"John\"}" \
    http://localhost:8080/rpc

{"msg":"Hello John"}

api.Request

API 也可以通過(guò)約定好的 URL 格式,請(qǐng)求到內(nèi)部的服務(wù),這是 API 服務(wù)的一個(gè)強(qiáng)大功能。經(jīng)過(guò) URL 解析能將路徑轉(zhuǎn)換成實(shí)際的請(qǐng)求,示例如下

請(qǐng)求

GET /greeter/say/hello?name=John

將會(huì)處理成

service: go.micro.api.greeter (default namespace go.micro.api is applied)
method: Say.Hello
request {
    "method": "GET",
    "path": "/greeter/say/hello",
    "get": {
        "name": "John"
    }
}

可以查看 protobuf 定義的這個(gè)接口實(shí)現(xiàn):

// 內(nèi)部定義的接口
syntax = "proto3";

message Pair {
    optional string key = 1;
    repeated string values = 2;
}

message Request {
    optional string method = 1;   // GET, POST, etc
    optional string path = 2;     // e.g /greeter/say/hello
    map<string, Pair> header = 3;
    map<string, Pair> get = 4;    // The URI query params
    map<string, Pair> post = 5;   // The post body params
    optional string body = 6;     // raw request body; if not application/x-www-form-urlencoded
}

message Response {
    optional int32 statusCode = 1;
    map<string, Pair> header = 2;
    optional string body = 3;
}

使用示例可以在這里看到:Greeter API

反向代理

最后一個(gè) API 服務(wù)提供的功能是反向代理。正如上面例子中提到的,API 服務(wù)可以通過(guò)路徑解析到具體的服務(wù),通過(guò)添加參數(shù) --api_handler=proxy 我們就可以支持 REST 風(fēng)格的請(qǐng)求。反向代理只需要簡(jiǎn)單的在運(yùn)行時(shí)添加 --api_handler=proxy 參數(shù)即可。

使用 API 構(gòu)建 RESTful 風(fēng)格的 API 可以在這個(gè)例子中看到:micro/examples/greeter/api


Web UI

web UI 提供了一個(gè)簡(jiǎn)單的界面觀察運(yùn)行中的系統(tǒng),也可以進(jìn)行一些交互。它提供了類(lèi)似 API 這樣的反向代理功能,我們的『web代理』也可以把開(kāi)發(fā)好的其他 web 應(yīng)用接入到 web UI 中,web UIAPI 一樣仍然通過(guò)路徑解析實(shí)現(xiàn)與內(nèi)部服務(wù)的通信,通過(guò) websocket 我們可以實(shí)時(shí)了解運(yùn)行中系統(tǒng)的情況

[圖片上傳失敗...(image-dac467-1513045777104)]


CLI

CLI 是一個(gè)命令行工具,讓我們可以觀察、交互和管理運(yùn)行中的服務(wù),當(dāng)前的特性允許你查詢(xún)服務(wù)注冊(cè),檢查服務(wù)的健康情況,也可以對(duì)服務(wù)進(jìn)行請(qǐng)求

[圖片上傳失敗...(image-995294-1513045777104)]

其他有意思的特性包括,CLI 可以使用 Sidecar 作為代理,只需要簡(jiǎn)單的設(shè)置參數(shù):--proxy_address=example.proxy.com


組裝在一起

我們已經(jīng)寫(xiě)了一個(gè)全功能的示例,整體的執(zhí)行過(guò)程是這樣的:

  1. HTTP GET 請(qǐng)求到 API 服務(wù),請(qǐng)求地址是:/greeter/say/hello with the query name=John
  2. API 服務(wù)將請(qǐng)求解析并轉(zhuǎn)換成默認(rèn)的服務(wù)形式,服務(wù)名是 go.micro.api.greeter,方法是 Say.Hello
  3. API 使用 Go Micro,查詢(xún)注冊(cè)器中服務(wù) go.micro.api.greeter 注冊(cè)的所有節(jié)點(diǎn),根據(jù)負(fù)載均衡算法,選擇其中一個(gè)節(jié)點(diǎn),發(fā)出請(qǐng)求
  4. go.micro.api.greeter 服務(wù)收到請(qǐng)求,解析到結(jié)構(gòu)體,去注冊(cè)器查詢(xún)到 go.micro.srv.greeter 這個(gè)服務(wù),發(fā)送請(qǐng)求
  5. go.micro.srv.greeter 服務(wù)處理完成后,返回相應(yīng)的內(nèi)容到 go.micro.api.greeter
  6. go.micro.api.greeter 轉(zhuǎn)換 go.micro.srv.greeter 服務(wù)的響應(yīng)內(nèi)容到 api.Response,返回到 API 服務(wù)
  7. API 服務(wù)解析請(qǐng)求,返回 HTTP 請(qǐng)求

整體流程如下:

[圖片上傳失敗...(image-c77079-1513045777104)]

有更復(fù)雜的例子,比如 API 服務(wù)請(qǐng)求多個(gè)服務(wù),組裝多個(gè)服務(wù)的返回內(nèi)容。示例如下:greeter service

總結(jié)一下就是: HTTP 請(qǐng)求發(fā)送到 Micro Api 服務(wù),然后請(qǐng)求被解析到具體微服務(wù)的 api 服務(wù),具體微服務(wù)的 api 服務(wù)再去請(qǐng)求對(duì)應(yīng)的干活服務(wù)。

注意 Micro Api 并不需要我們?nèi)?shí)現(xiàn),是 Micro 自帶的。

Demo

如果你想看看正在運(yùn)行中的系統(tǒng),在這個(gè)頁(yè)面查看:web.micro.pm

我們運(yùn)行了一個(gè) MicroKubernetes 上,demo 是開(kāi)源的,可以運(yùn)行一下:github.com/micro/kubernetes

總結(jié)

Micro 提供了基礎(chǔ)的工具用于編寫(xiě)和管理微服務(wù),Go Micro 包括了核心的必須功能:服務(wù)發(fā)現(xiàn)、客戶端、服務(wù)端和訂閱、發(fā)布。CLI 可以讓你與運(yùn)行中的服務(wù)進(jìn)行交互。Sidecar 可以讓你接入其他非 Micro 應(yīng)用。API 是一個(gè)單獨(dú)的接入點(diǎn)來(lái)調(diào)用內(nèi)部的服務(wù)。借助于插件化的接口,你可以靈活選擇各種組件來(lái)提升你的微服務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評(píng)論 3 422
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,947評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,201評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,960評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,350評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,549評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,914評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,089評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,340評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,753評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,007評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,834評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,106評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容