微服務(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)]
用 ruby
和 python
借助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 UI
與 API
一樣仍然通過路徑解析實(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í)行過程是這樣的:
-
HTTP GET
請求到API
服務(wù)浸间,請求地址是:/greeter/say/hello with the query name=John
-
API
服務(wù)將請求解析并轉(zhuǎn)換成默認(rèn)的服務(wù)形式,服務(wù)名是go.micro.api.greeter
吟榴,方法是Say.Hello
-
API
使用Go Micro
魁蒜,查詢注冊器中服務(wù)go.micro.api.greeter
注冊的所有節(jié)點(diǎn),根據(jù)負(fù)載均衡算法吩翻,選擇其中一個(gè)節(jié)點(diǎn)兜看,發(fā)出請求 -
go.micro.api.greeter
服務(wù)收到請求狭瞎,解析到結(jié)構(gòu)體,去注冊器查詢到go.micro.srv.greeter
這個(gè)服務(wù)熊锭,發(fā)送請求 -
go.micro.srv.greeter
服務(wù)處理完成后,返回相應(yīng)的內(nèi)容到go.micro.api.greeter
-
go.micro.api.greeter
轉(zhuǎn)換go.micro.srv.greeter
服務(wù)的響應(yīng)內(nèi)容到api.Response
球涛,返回到API
服務(wù) -
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è) Micro
在 Kubernetes
上滑频,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ù)董饰。