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

微服務(wù)工具箱

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

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

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

開發(fā)與部署

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

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

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

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

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

了解 Micro

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

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

Go Micro

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

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

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

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

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

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

Sidecar

Go Micro 提供了用 Golang 編寫服務(wù)的方式荧缘,那么其他編程語言呢皆警?我們怎樣構(gòu)建一個(gè)有兼容性的系統(tǒng),讓任何人都能受益于 Micro截粗?雖然 Micro 是用 golang 編寫的耀怜,我們提供了一個(gè)快速且方便的方式,讓其他語言能夠接入桐愉。

Sidecar 是一個(gè)輕量級的組裝服務(wù),概念上來說就是將 Micro 的庫提供的功能掰派,依附于其他語言的主程序中从诲。Sidecar 本質(zhì)上是一個(gè)單獨(dú)運(yùn)行的服務(wù),通過 http 提供接口靡羡,其他語言通過接口使用 Go Micro 提供的功能系洛。

Sidecar 的特性:

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

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

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


API

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

API 提供了幾種不同的請求方式

/rpc

每個(gè)單獨(dú)的服務(wù)可以通過 /rpc 這個(gè)接入點(diǎn)進(jì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 也可以通過約定好的 URL 格式蜂桶,請求到內(nèi)部的服務(wù),這是 API 服務(wù)的一個(gè)強(qiáng)大功能也切。經(jīng)過 URL 解析能將路徑轉(zhuǎn)換成實(shí)際的請求扑媚,示例如下

請求

GET /greeter/say/hello?name=John

將會處理成

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ù)可以通過路徑解析到具體的服務(wù)疆股,通過添加參數(shù) --api_handler=proxy 我們就可以支持 REST 風(fēng)格的請求。反向代理只需要簡單的在運(yùn)行時(shí)添加 --api_handler=proxy 參數(shù)即可褂萧。

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


Web UI

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

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


CLI

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

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

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


組裝在一起

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

  1. HTTP GET 請求到 API 服務(wù)浸间,請求地址是:/greeter/say/hello with the query name=John
  2. API 服務(wù)將請求解析并轉(zhuǎn)換成默認(rèn)的服務(wù)形式,服務(wù)名是 go.micro.api.greeter吟榴,方法是 Say.Hello
  3. API 使用 Go Micro魁蒜,查詢注冊器中服務(wù) go.micro.api.greeter 注冊的所有節(jié)點(diǎn),根據(jù)負(fù)載均衡算法吩翻,選擇其中一個(gè)節(jié)點(diǎn)兜看,發(fā)出請求
  4. go.micro.api.greeter 服務(wù)收到請求狭瞎,解析到結(jié)構(gòu)體,去注冊器查詢到 go.micro.srv.greeter 這個(gè)服務(wù)熊锭,發(fā)送請求
  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ù)解析請求,返回 HTTP 請求

整體流程如下:

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

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

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

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

Demo

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

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

總結(jié)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楼雹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尖阔,更是在濱河造成了極大的恐慌,老刑警劉巖榨咐,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件介却,死亡現(xiàn)場離奇詭異,居然都是意外死亡块茁,警方通過查閱死者的電腦和手機(jī)齿坷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來数焊,“玉大人永淌,你說我怎么就攤上這事∨宥” “怎么了遂蛀?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長干厚。 經(jīng)常有香客問我李滴,道長,這世上最難降的妖魔是什么蛮瞄? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任所坯,我火速辦了婚禮,結(jié)果婚禮上挂捅,老公的妹妹穿的比我還像新娘芹助。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布状土。 她就那樣靜靜地躺著无蜂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪声诸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天泻肯,我揣著相機(jī)與錄音灶挟,去河邊找鬼毒租。 笑死墅垮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抬伺。 我是一名探鬼主播灾梦,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼能岩,長吁一口氣:“原來是場噩夢啊……” “哼萧福!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毛俏,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤煌寇,失蹤者是張志新(化名)和其女友劉穎阀溶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银锻,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了更振。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡献宫,死狀恐怖姊途,靈堂內(nèi)的尸體忽然破棺而出知态,到底是詐尸還是另有隱情,我是刑警寧澤负敏,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布原在,位于F島的核電站庶柿,受9級特大地震影響浮庐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜审残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一搅轿、第九天 我趴在偏房一處隱蔽的房頂上張望璧坟。 院中可真熱鬧既穆,春花似錦幻工、人聲如沸黎茎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奸鬓。三九已至掸读,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澡罚,已是汗流浹背肾请。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工铛铁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饵逐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓掷豺,卻偏偏與公主長得像薄声,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子德频,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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