1棺牧、Micro是一個(gè)專注于簡化分布式系統(tǒng)開發(fā)的微服務(wù)生態(tài)系統(tǒng)富俄。
go-micro - A pluggable Go RPC framework for writing a microservice; service discovery, client/server rpc, pub/sub, etc.
go-plugins - Plugins for go-micro including etcd, kubernetes, nats, rabbitmq, grpc, etc.
micro - A microservice toolkit containing traditional entry points; API Gateway, CLI, Slack Bot, Sidecar and Web UI.
2、怎么使用micro
使用go-micro編寫一些services
然后通過micro工具集訪問他們绕辖。(api、web擂红、cli等)
實(shí)例:https://github.com/micro/examples/tree/master/greeter
3仪际、使用consu進(jìn)行服務(wù)的發(fā)現(xiàn)
# install
brew install consul
# run
consul agent -dev
4、哪里可以運(yùn)行Micro
Micro is runtime agnostic. You can run it anywhere you like. On bare metal, on AWS, Google Cloud. On your favourite container orchestration system like Mesos or Kubernetes.
https://github.com/micro/kubernetes
5、API树碱,Web和SRV服務(wù)有什么區(qū)別肯适?
api.exp.com->micro api -> cunstomer api -> customer srv
web.exp.com->micro web -> cunstomer web -> customer srv
將api、web頁面和后端服務(wù)分離
API的服務(wù)由micro api提供成榜,默認(rèn)的命名空間是go.micro.api框舔。 micro api符合API網(wǎng)關(guān)模式
https://github.com/micro/micro/tree/master/api
Web服務(wù)由micro web提供,默認(rèn)名稱空間go.micro.web。 我們相信網(wǎng)絡(luò)應(yīng)用程序作為微型服務(wù)世界中的一流公民赎婚,將微型服務(wù)的Web儀表板構(gòu)建起來刘绣。 micro web是反向代理,并將基于路由到服務(wù)解析的HTTP請求轉(zhuǎn)發(fā)到適當(dāng)?shù)木W(wǎng)絡(luò)應(yīng)用程序惑淳。
https://github.com/micro/micro/tree/master/web
SRV服務(wù)基本上是標(biāo)準(zhǔn)的RPC服務(wù)额港,通常是您要編寫的服務(wù)饺窿。 我們通常稱之為RPC或后端服務(wù)歧焦,因?yàn)樗鼈儜?yīng)該主要是后端架構(gòu)的一部分,而不是面向公眾肚医。 默認(rèn)情況下绢馍,我們使用命名空間go.micro.srv作為這些,但您應(yīng)該使用您的域com.example.srv肠套。
6舰涌、Micro vs Go-Kit
Go-kit將自己描述為微服務(wù)的標(biāo)準(zhǔn)庫。像Go一樣你稚,go-kit為您提供可用于構(gòu)建應(yīng)用程序的各種包瓷耙。 Go-kit是您想要完全控制您如何定義服務(wù)的理想選擇。
Go-micro是微服務(wù)的可插拔RPC框架刁赖。 這是一個(gè)有意見的框架搁痛,其嘗試簡化分布式系統(tǒng)的通信方面,因此您可以專注于業(yè)務(wù)邏輯本身宇弛。 Go-micro是您想要快速開發(fā)和運(yùn)行的好地方鸡典,同時(shí)擁有可插拔的功能,可以在沒有代碼更改的情況下切換基礎(chǔ)架構(gòu)枪芒。
Micro是一個(gè)微服務(wù)工具包彻况。 這就像一個(gè)微軟服務(wù)的瑞士軍刀,它搭載在微軟上舅踪,提供傳統(tǒng)的入口點(diǎn)纽甘,如http api網(wǎng)關(guān),web ui抽碌,cli贷腕,slack bot等。Micro使用工具來指導(dǎo)您的架構(gòu)中的問題的邏輯分離,推動您 為公共API創(chuàng)建一個(gè)API層的微服務(wù)器泽裳,并為web UI單獨(dú)創(chuàng)建一個(gè)WEB層的微服務(wù)器瞒斩。
7、micro簡單介紹
工具集:
Go Micro:
是一個(gè)可插拔的RPC框架涮总,用于在Go中編寫微服務(wù)胸囱。
它提供了用于服務(wù)發(fā)現(xiàn),客戶端負(fù)載平衡瀑梗,編碼烹笔,同步和異步通信的庫。
Micro API:
是一個(gè)API網(wǎng)關(guān)或代理抛丽,用于提供HTTP并將請求路由到適當(dāng)?shù)奈⒎?wù)谤职。
它作為單個(gè)入口點(diǎn),可以用作反向代理或?qū)TTP請求轉(zhuǎn)換為RPC亿鲜。
它應(yīng)該在基礎(chǔ)架構(gòu)的邊緣運(yùn)行允蜈。
WEB UI:
web版本的go-micro,微型Web應(yīng)用程序的Web儀表板和反向代理蒿柳。 我們認(rèn)為網(wǎng)絡(luò)應(yīng)用程序應(yīng)該被構(gòu)建為微服務(wù)饶套,因此被視為微服務(wù)世界中的一流公民。 它的行為與API反向代理類似垒探,但也包括對Web套接字的支持妓蛮。
sidecar:
http api版本的go-micro,實(shí)現(xiàn)將非go的應(yīng)用整合到微服務(wù)
提供go-micro作為HTTP服務(wù)的所有功能圾叼。 雖然我們喜歡Go蛤克,并相信構(gòu)建微服務(wù)是一種偉大的語言,但您也可能希望使用其他語言夷蚊,因此Sidecar提供了將其他應(yīng)用程序集成到Micro世界中的一種方法构挤。
Bot:
A Hubot style bot that sits inside your microservices platform and can be interacted with via Slack, HipChat, XMPP, etc
Micro CLI
go-micro的命令行版本
一個(gè)直接的命令行界面,可與您的微服務(wù)進(jìn)行交互撬码。 您可能不想直接連接到服務(wù)注冊表儿倒,它還允許您利用Sidecar作為代理。
8.0呜笑、go-micro(Go-micro是微服務(wù)的獨(dú)立RPC框架夫否。 它是該工具包的核心)
默認(rèn)插件
consul或多播DNS用于服務(wù)發(fā)現(xiàn)
隨機(jī)散列客戶端負(fù)載均衡
用于消息編碼的JSON-RPC和PROTO-RPC
用于通信的HTTP
broker(異步通信)
可插拔的異步 pub/sub 接口
為消息代理提供了異步 pub/sub 通信的接口
這是事件驅(qū)動架構(gòu)和微服務(wù)的基本要求之一。
微服務(wù)是事件驅(qū)動的架構(gòu).
By default we use an inbox style point to point HTTP system to minimise the number of dependencies required to get started.
implementations include nats, rabbitmq and http (for development) in go-plugins
transport(同步通信)
可插拔的同步的消息點(diǎn)對點(diǎn)傳送的接口叫胁,是服務(wù)之間的同步請求/響應(yīng)通信的接口凰慈。 它類似于golang網(wǎng)絡(luò)包,但提供了更高級別的抽象驼鹅,它允許我們切換通信機(jī)制微谓,例如http森篷,rabbitmq,websockets豺型,NATS仲智。 該傳輸還支持雙向流。 這對于客戶端推送到服務(wù)器是強(qiáng)大的
Current implementations are http, rabbitmq and nats
codec(消息編碼/解碼)
用于將消息在傳輸之前編解碼
這可能是json姻氨,protobuf钓辆,bson,msgpack等肴焊。
與大多數(shù)其他編解碼器不同的是前联,我們實(shí)際上也支持這里的RPC格式。 所以我們有JSON-RPC娶眷,PROTO-RPC似嗤,BSON-RPC等。它將編碼從客戶端/服務(wù)器分離届宠,并提供了集成其他系統(tǒng)(如gRPC, Vanadium, etc等)的強(qiáng)大方法
registry(客戶端的服務(wù)發(fā)現(xiàn))
可插拔的服務(wù)發(fā)現(xiàn)的庫烁落。
將服務(wù)的名稱解析為地址,可以被consul, etcd, zookeeper, dns, gossip, etc支持
Current implementations are consul, etcd, memory and kubernetes.
selector(節(jié)點(diǎn)過濾和負(fù)載平衡)
負(fù)載均衡席揽。使用選擇器而不是注冊表registry
server(RPC服務(wù)器)
提供構(gòu)建運(yùn)行中微服務(wù)的接口
編寫服務(wù)的構(gòu)建塊
可以命名您的服務(wù)顽馋,注冊請求處理程序谓厘,添加中間件等
該服務(wù)基于上述包幌羞,為服務(wù)請求提供統(tǒng)一的接口。 內(nèi)置服務(wù)器是RPC系統(tǒng)竟稳。 在將來還有其他的實(shí)現(xiàn)属桦。 服務(wù)器還允許您定義多個(gè)編解碼器來提供不同的編碼消息。
provides a way of serving RPC requests
client(RPC客戶端)
提供一種RPC查詢的方式
客戶端提供了一個(gè)接口來對服務(wù)進(jìn)行請求
像服務(wù)器一樣他爸,它建立在其他軟件包上聂宾,以提供一個(gè)統(tǒng)一的接口,通過使用注冊表的名稱查找服務(wù)诊笤,使用選擇器進(jìn)行負(fù)載平衡系谐,使用代理使用傳輸和異步消息的同步請求。
provides retries, timeouts, use of context, etc
service
上述組件在micro的頂層組合成一個(gè)服務(wù)
綜述:broker transport codec registry selector作為go-micro的底層組件讨跟。
例如編寫api 服務(wù):
server 基于上述的組件編寫如srv服務(wù)
client 基于上述的組件編寫客戶端來調(diào)用服務(wù)
而一對一對的server和client組合成了一個(gè)個(gè)的api service纪他。
micro api來作為唯一入口解析請求來傳遞給對應(yīng)的service,通過client訪問server
8.1晾匠、micro api
將RPC請求從一個(gè)服務(wù)轉(zhuǎn)到另一個(gè)服務(wù)是Go Micro非常容易實(shí)現(xiàn)的茶袒,但不是外部訪問的理想選擇。
服務(wù)的實(shí)例可能會失敗凉馆,它們可能在其他地方重新安排薪寓,或者最終綁定到任何隨機(jī)端口亡资。
API提供了一個(gè)單一的入口點(diǎn)來查詢微服務(wù)器,應(yīng)該被用作外部訪問的網(wǎng)關(guān)向叉。
micro api是微服務(wù)的API網(wǎng)關(guān)锥腻。 使用API網(wǎng)關(guān)模式為您的服務(wù)提供單個(gè)入口點(diǎn)。 micro api提供HTTP并動態(tài)路由到適當(dāng)?shù)暮蠖朔?wù)母谎。
micro api通過service的client來訪問server來實(shí)現(xiàn)訪問
8.1.1旷太、/rpc
可以使用/ rpc端點(diǎn)通過RPC查詢各個(gè)服務(wù):
curl \
-d "service=go.micro.srv.greeter" \
-d "method=Say.Hello" \
-d "request={\"name\": \"John\"}" \
http://localhost:8080/rpc
{"msg":"Hello John"}
8.1.2 api.Request
API可用于細(xì)分由個(gè)人微服務(wù)提供服務(wù)的網(wǎng)址。 這是API組合的強(qiáng)大方法销睁。 這里API使用請求路徑的第一部分以及命名空間組件來確定將請求路由到的服務(wù)供璧。 然后將HTTP請求轉(zhuǎn)換為api.Request并進(jìn)行適當(dāng)轉(zhuǎn)發(fā)。
在Micro我們使用創(chuàng)建API微服務(wù)的模式來服務(wù)邊緣的請求冻记。 分離后端與前端服務(wù)的責(zé)任睡毒。
請求:
GET /greeter/say/hello?name=John
轉(zhuǎn)變成:
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"
}
}
下面是我們的proto文件:
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;
}
8.1.3、代理
API的請求處理的最終方法是反向代理冗栗。 如上所述演顾,API使用請求路徑和命名空間組件來確定將請求路由到的服務(wù)。 通過提供反向代理和微服務(wù)請求路由隅居,我們能夠支持REST钠至,這是廣泛追捧的要求。
代理可以通過傳遞--api_handler = proxy標(biāo)志來啟用胎源。
8.2棉钧、micro web ui
Web UI提供了一個(gè)簡單的儀表板,用于觀察和與正在運(yùn)行的系統(tǒng)進(jìn)行交互涕蚤。 不僅如此宪卿,它還提供了非常像API的反向代理。 我們的目標(biāo)是使用“Web代理”來實(shí)現(xiàn)Web應(yīng)用程序的開發(fā)万栅,作為微服務(wù)佑钾。 再次,就像API一樣烦粒,請求路徑與命名空間一起使用休溶,以確定將請求路由到的服務(wù)。 Web代理還支持Web套接字扰她,因?yàn)槲覀兛吹綄?shí)時(shí)是提供Web應(yīng)用程序的核心部分兽掰。
8.3、micro CLI
CLI是一種命令行工具义黎,可在運(yùn)行環(huán)境中提供觀察禾进,交互和管理服務(wù)的方法。 當(dāng)前的功能集允許您檢查注冊表廉涕,檢查服務(wù)的基本運(yùn)行狀況泻云,并對服務(wù)本身執(zhí)行查詢艇拍。
9、RPC宠纯,REST卸夕,Proto ...
所以你可能會想的第一件事是為什么RPC,為什么不REST婆瓜?
我們相信快集,RPC是更為合適的跨業(yè)務(wù)通信選擇。
或者更具體地說RPC使用protobuf編碼和使用protobuf IDL定義的API廉白。
這種組合允許在線上創(chuàng)建強(qiáng)定義的API接口和有效的消息編碼格式个初。
RPC是一個(gè)直接的,沒有虛擬的通信協(xié)議猴蹂。
Google是創(chuàng)建者protobuf院溺,在內(nèi)部使用RPC和最近開源的gRPC,一個(gè)RPC框架磅轻。
Hailo也是RPC / Protobuf的強(qiáng)力倡導(dǎo)者珍逸,在跨系統(tǒng)開發(fā)方面比系統(tǒng)性能更受益匪淺。
Uber選擇自己的路徑已經(jīng)開發(fā)了一個(gè)稱為TChannel的RPC框架協(xié)議聋溜。
就個(gè)人而言谆膳,我們認(rèn)為未來的API將使用RPC構(gòu)建,因?yàn)樗鼈兙哂辛己玫慕Y(jié)構(gòu)化格式撮躁,
使用高效編碼協(xié)議的傾向漱病,如使用強(qiáng)大定義的API和執(zhí)行通信的組合的protobuf。
10馒胆、HTTP到RPC缨称,API ...
實(shí)際上凝果,我們距離RPC在網(wǎng)絡(luò)上還有很長的路要走祝迂。
雖然它在數(shù)據(jù)中心內(nèi)部的完美內(nèi)容,面向公眾的流量器净,如網(wǎng)站和移動API型雳,是一個(gè)完整的方案。
讓我們面對它山害,在我們離開HTTP之前纠俭,這將是一段時(shí)間。
這是微軟包括API網(wǎng)關(guān)浪慌,服務(wù)和翻譯HTTP請求的原因之一冤荆。
API網(wǎng)關(guān)是用于微服務(wù)架構(gòu)的模式。
它作為外部世界的單個(gè)入口點(diǎn)权纤,并根據(jù)請求路由到適當(dāng)?shù)姆?wù)钓简。
這允許HTTP API本身由不同的微服務(wù)組成乌妒。
這是一個(gè)強(qiáng)大的架構(gòu)模式。在API的一部分單一更改可能會降低整個(gè)整體的日子已經(jīng)過去了外邓。
The micro API uses path-to-service resolution so that each unique request path can be served by a different API micro service 撤蚊。
e.g. /user => user api, /order => order api.
Here’s an example. A request to /customer/orders will be sent to the API service go.micro.api.customer with method Customer.Orders.
11、服務(wù)類型
微服務(wù)的概念是關(guān)于分離問題损话,借鑒了一貫做好事情的unix理念侦啸。 部分原因我們認(rèn)為需要在不同責(zé)任的服務(wù)之間建立邏輯和建筑分離。
現(xiàn)在我將承認(rèn)丧枪,這些概念并不是什么新鮮事物光涂,但是由于已經(jīng)在非常大的成功的技術(shù)公司中被證明了這些概念,因此它們是令人信服的 我們的目標(biāo)是傳播這些發(fā)展哲學(xué)拧烦,并通過工具指導(dǎo)設(shè)計(jì)決策顶捷。
所以這里是我們目前定義的服務(wù)類型。
11.1屎篱、API
由Micro API提供服赎,API服務(wù)位于基礎(chǔ)架構(gòu)的邊緣,
最有可能為公眾提供流量交播,以及移動或網(wǎng)絡(luò)應(yīng)用重虑。
您可以使用HTTP處理程序構(gòu)建它,并以反向代理模式運(yùn)行micro api秦士,
或者通過默認(rèn)處理一個(gè)特定的RPC API請求響應(yīng)格式缺厉,
可以在這里找到:https://github.com/micro/micro/blob/master/api/proto/api.proto
11.2、WEB
由micro web服務(wù)隧土,Web服務(wù)專注于提供html內(nèi)容和儀表板提针。
micro web反向代理HTTP和WebSockets。 這些是目前唯一支持的協(xié)議曹傀,但將來可能會被擴(kuò)展
如前所述we believe in web apps as microservices.
11.3辐脖、SRV
這些是后端的基于RPC的服務(wù)。
它們主要側(cè)重于為您的系統(tǒng)提供核心功能皆愉,并且很有可能不會面臨公眾嗜价。
如果您喜歡,還可以通過micro api或web使用/ rpc終端訪問它們幕庐,
但是更可能的是久锥,API,Web和其他SRV服務(wù)使用go-micro client直接調(diào)用它們异剥。
11.4瑟由、綜述
根據(jù)過去的經(jīng)驗(yàn),我們發(fā)現(xiàn)這種類型的架構(gòu)模式非常強(qiáng)大冤寿,可以看到它擴(kuò)展到數(shù)百種服務(wù)歹苦。 通過將其構(gòu)建到微架構(gòu)中绿鸣,我們認(rèn)為它為微服務(wù)開發(fā)提供了良好的基礎(chǔ)。
11.5暂氯、命名空間
是什么阻止micro api 和 web services通信潮模,micro web與api services通信。 我們使用邏輯命名空間分隔這些痴施。 通過在服務(wù)名稱前面添加一個(gè)命名空間擎厢,我們清楚地確定它在系統(tǒng)中的目的和位置。 這是一個(gè)簡單但有效的模式辣吃,為我們服務(wù)动遭。
micro api和web將組成命名空間的服務(wù)名稱和請求路徑的第一路徑,
例如 對api/customer的請求成為go.micro.api.customer神得。
默認(rèn)命名空間是:
API - go.micro.api
Web - go.micro.web
SRV - go.micro.srv
您應(yīng)該將這些設(shè)置為您的域厘惦,例如
com.example。{api哩簿,web宵蕉,srv}。
micro api和micro Web可以在運(yùn)行時(shí)配置為路由到您的命名空間节榜。
11.6羡玛、同步與異步
對許多人來說,微服務(wù)是關(guān)于創(chuàng)建事件驅(qū)動架構(gòu)和設(shè)計(jì)主要通過異步通信進(jìn)行交互的服務(wù)宗苍。
micro將異步通信視為一流的公民稼稿,是微服務(wù)的基礎(chǔ)。
通過異步消息傳遞事件可以讓任何人消費(fèi)和采取行動讳窟。
可以構(gòu)建新的獨(dú)立服務(wù)让歼,而無需對系統(tǒng)的其他方面進(jìn)行任何修改。
這是一個(gè)強(qiáng)大的設(shè)計(jì)模式丽啡,因此谋右,我們將Broker界面包含在微軟中。
同步和異步通信在Micro中被單獨(dú)提出碌上。
The Transport interface用于創(chuàng)建服務(wù)之間的點(diǎn)對點(diǎn)連接倚评。
The go-micro client and server構(gòu)建在傳輸上以執(zhí)行請求響應(yīng)RPC并提供雙向流的能力
在建立系統(tǒng)時(shí),應(yīng)該使用這兩種通信模式馏予,但是了解每個(gè)適當(dāng)?shù)臅r(shí)間和地點(diǎn)是關(guān)鍵。 在很多情況下盔性,沒有對或錯(cuò)霞丧,但是會做出一些權(quán)衡。
12冕香、什么定義了微服務(wù)
我們涵蓋了Micro工具包為微服務(wù)提供的許多工具蛹尝,
我們已經(jīng)定義了服務(wù)類型(API后豫,WEB,SRV)突那,但實(shí)際上并沒有什么真正的微服務(wù)器挫酿。
我們的信念和我們建立的理念是,微服務(wù)是一種專注于單一類型的實(shí)體或域的應(yīng)用程序愕难,它通過強(qiáng)大的API來提供訪問早龟。
版本也是微服務(wù)重要的組成部分。go-micro server創(chuàng)建時(shí)會定義name和version
13猫缭、安裝
13.1葱弟、go-micro
go get github.com/micro/go-micro
go get github.com/micro/protobuf/{proto,protoc-gen-go}
13.2、工具集
go get github.com/micro/micro
14猜丹、容錯(cuò)
Rationale原理Solution解決方案Usage用法
14.1芝加、心跳(刷新服務(wù)發(fā)現(xiàn)注冊的機(jī)制)
服務(wù)在啟動時(shí)注冊服務(wù)發(fā)現(xiàn),關(guān)閉時(shí)注銷服務(wù)發(fā)現(xiàn)射窒。但是意外死亡需要自動刪除的機(jī)制
Micro支持寄存器TTL和寄存器間隔的選項(xiàng)藏杖。
TTL指定服務(wù)注冊的時(shí)間,超過這個(gè)時(shí)間服務(wù)會被服務(wù)發(fā)現(xiàn)移除
interval讓服務(wù)在指定時(shí)間內(nèi)重新注冊脉顿,保持TTL獲取的注冊時(shí)間是有效的制市。
用法:
micro toolkit:
micro --register_ttl=30 --register_interval=15 api
go-micro:
service := micro.NewService(
micro.Name("com.example.srv.foo"),
micro.RegisterTTL(time.Second*30),
micro.RegisterInterval(time.Second*15),
)