近幾年誕生了很多微服務(wù)框架,比如JAVA的Spring Cloud、Dubbo;Golang的GoKit和GoMicro以及NodeJs的Seneca。幾乎每種主流語(yǔ)言都有其對(duì)應(yīng)的微服務(wù)框架。

創(chuàng)新互聯(lián)專(zhuān)注于鎮(zhèn)雄企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城網(wǎng)站開(kāi)發(fā)。鎮(zhèn)雄網(wǎng)站建設(shè)公司,為鎮(zhèn)雄等地區(qū)提供建站服務(wù)。全流程按需求定制開(kāi)發(fā),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
Go在微服務(wù)框架中有其獨(dú)特的優(yōu)勢(shì),至于優(yōu)勢(shì)在哪,自行g(shù)oogle。
1、GoKit框架
這是一個(gè)工具包的集合,可以幫助攻城獅構(gòu)建強(qiáng)大、可靠和可維護(hù)的微服務(wù)。提供了用于實(shí)現(xiàn)系統(tǒng)監(jiān)控和彈性模式組件的庫(kù),例如日志、跟蹤、限流、熔斷等。
基于這個(gè)框架的應(yīng)用程序架構(gòu)由三個(gè)主要的部分組成:
傳輸層:用于網(wǎng)絡(luò)通信,服務(wù)通常使用HTTP或者gRPC等網(wǎng)絡(luò)傳輸協(xié)議,或者使用NATS等發(fā)布訂閱系統(tǒng)相互通信。
接口層:是服務(wù)器和客戶(hù)端的基本構(gòu)建塊。每個(gè)對(duì)外提供的接口方法都會(huì)定義為一個(gè)Endpoint,一遍在服務(wù)器和客戶(hù)端之間進(jìn)行網(wǎng)絡(luò)通信,每個(gè)端點(diǎn)使用傳輸層通過(guò)HTTP或gRPC等具體通信模式對(duì)外提供服務(wù)
服務(wù)成:具體的業(yè)務(wù)邏輯實(shí)現(xiàn)
2、GoMicro框架
這是一個(gè)基于Go語(yǔ)言實(shí)現(xiàn)的插件化RPC微服務(wù)框架。提供了服務(wù)發(fā)現(xiàn)、負(fù)載均衡、同步傳輸、異步通信以及事件驅(qū)動(dòng)等機(jī)制,嘗試簡(jiǎn)化分布式系統(tǒng)之間的通信,讓開(kāi)發(fā)者更專(zhuān)注于自身業(yè)務(wù)邏輯的開(kāi)發(fā)。
GoMicro的設(shè)計(jì)哲學(xué)是可插拔的架構(gòu)理念,提供了可快速構(gòu)建系統(tǒng)的組件,并且可以根據(jù)自身的需求對(duì)GoMicro提供的默認(rèn)實(shí)現(xiàn)進(jìn)行定制。所有插件都可在倉(cāng)庫(kù)github.com/micro/go-plugins 中找到。
網(wǎng)關(guān)=反向代理+負(fù)載均衡+各種策略,技術(shù)實(shí)現(xiàn)也有多種多樣,有基于 nginx 使用 lua 的實(shí)現(xiàn),比如 openresty、kong;也有基于 zuul 的通用網(wǎng)關(guān);還有就是 golang 的網(wǎng)關(guān),比如 tyk。
這篇文章主要是講如何基于 golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)關(guān)。
轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/
整理:go語(yǔ)言鐘文文檔:
啟動(dòng)兩個(gè)后端 web 服務(wù)(代碼)
這里使用命令行工具進(jìn)行測(cè)試
具體代碼
直接使用基礎(chǔ)庫(kù) httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對(duì)象實(shí)現(xiàn)了serveHttp方法,因此可以直接作為 handler。
具體代碼
director中定義回調(diào)函數(shù),入?yún)?http.Request,決定如何構(gòu)造向后端的請(qǐng)求,比如 host 是否向后傳遞,是否進(jìn)行 url 重寫(xiě),對(duì)于 header 的處理,后端 target 的選擇等,都可以在這里完成。
director在這里具體做了:
modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應(yīng)的信息,比如響應(yīng)的 Body,響應(yīng)的 Header 等信息。
最終依舊是返回一個(gè)ReverseProxy,然后將這個(gè)對(duì)象作為 handler 傳入即可。
參考 2.2 中的NewSingleHostReverseProxy,只需要實(shí)現(xiàn)一個(gè)類(lèi)似的、支持多 targets 的方法即可,具體實(shí)現(xiàn)見(jiàn)后面。
作為一個(gè)網(wǎng)關(guān)服務(wù),在上面 2.3 的基礎(chǔ)上,需要支持必要的負(fù)載均衡策略,比如:
隨便 random 一個(gè)整數(shù)作為索引,然后取對(duì)應(yīng)的地址即可,實(shí)現(xiàn)比較簡(jiǎn)單。
具體代碼
使用curIndex進(jìn)行累加計(jì)數(shù),一旦超過(guò) rss 數(shù)組的長(zhǎng)度,則重置。
具體代碼
輪詢(xún)帶權(quán)重,如果使用計(jì)數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會(huì)瞬間壓力過(guò)大;參考 nginx 內(nèi)部的加權(quán)輪詢(xún),或者應(yīng)該稱(chēng)之為平滑加權(quán)輪詢(xún),思路是:
后端真實(shí)節(jié)點(diǎn)包含三個(gè)權(quán)重:
操作步驟:
具體代碼
一致性 hash 算法,主要是用于分布式 cache 熱點(diǎn)/命中問(wèn)題;這里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本滿(mǎn)足流量綁定,一旦后端目標(biāo)節(jié)點(diǎn)故障,會(huì)自動(dòng)平移到環(huán)上最近的那么個(gè)節(jié)點(diǎn)。
實(shí)現(xiàn):
具體代碼
每一種不同的負(fù)載均衡算法,只需要實(shí)現(xiàn)添加以及獲取的接口即可。
然后使用工廠(chǎng)方法,根據(jù)傳入的參數(shù),決定使用哪種負(fù)載均衡策略。
具體代碼
作為網(wǎng)關(guān),中間件必不可少,這類(lèi)包括請(qǐng)求響應(yīng)的模式,一般稱(chēng)作洋蔥模式,每一層都是中間件,一層層進(jìn)去,然后一層層出來(lái)。
中間件的實(shí)現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計(jì)數(shù);一種是鏈?zhǔn)秸{(diào)用。
具體代碼
一,原因:
學(xué)習(xí)研究go-micro已經(jīng)有兩三天了,在這里做個(gè)總結(jié),有2點(diǎn)原因,第1點(diǎn)方便以后如果有一段時(shí)間沒(méi)有用過(guò)micro導(dǎo)致幾乎都忘了,那么這篇文章方便自己在很短的時(shí)間內(nèi)重朔對(duì)micro的知識(shí)體系,第2個(gè)原因也算給自己一個(gè)交代,比較花了時(shí)間去研究了。接下來(lái)會(huì)從go-micro庫(kù),和micro工具兩方面。
二,go-micro
介紹:go-micro可以理解為一個(gè)可以很快創(chuàng)建微服務(wù)器的第三方庫(kù),從可提供功能上分一下幾點(diǎn):
1,可提供開(kāi)發(fā)服務(wù)端:這個(gè)服務(wù)端只能通過(guò)其他微服務(wù)通過(guò)rpc方式調(diào)用。當(dāng)你看到用protoc工具生成的.micro.go文件的時(shí)候你會(huì)發(fā)現(xiàn),主要包含2部分,第1部分接口是給調(diào)用方提供的,定義了作為客戶(hù)端如何調(diào)用服務(wù)端。第2部分接口是服務(wù)端接口。通過(guò)實(shí)現(xiàn)接口,就可以實(shí)現(xiàn)服務(wù)端功能。大體上做server的流程如下。
1.1創(chuàng)建一個(gè)service實(shí)例(相當(dāng)與micro整體對(duì)外的接口)。Micro.NewService
1.2初始化service實(shí)例。Service.init()
1.3實(shí)踐自己的Handler邏輯。
1.4將自己實(shí)現(xiàn)的Handler和service綁定注冊(cè)。
1.5 service運(yùn)行。 ?service.run.
2,可提供開(kāi)發(fā)web服務(wù)端:用micro做web服務(wù)端的優(yōu)勢(shì)在于可以在這個(gè)web服務(wù)端內(nèi)部實(shí)現(xiàn)client接口,進(jìn)而通過(guò)rpc方式調(diào)用其他用micro搭建的微服務(wù)。大體上創(chuàng)建的流程如下。
2.1創(chuàng)建一個(gè)webservice實(shí)例(可設(shè)置靜態(tài)文件路由).
2.2初始化service
2.3注冊(cè)自己的handler函數(shù)。
2.4 service啟動(dòng)運(yùn)行。
3,可提供開(kāi)發(fā)網(wǎng)關(guān)api: 其實(shí)就是對(duì)后面多個(gè)服務(wù)端起到一個(gè)聚合的作用,因?yàn)閙icro工具中網(wǎng)關(guān)就是基于go-micro開(kāi)發(fā)的,初步看了一下micro中網(wǎng)關(guān)的源碼大體設(shè)計(jì)流程如下。
第二部分micro工具
1,做api使用:上面也有介紹這個(gè)api工具就是基于go-micro寫(xiě)的,啟動(dòng)需要注意兩個(gè)比較主要的參數(shù),--namespace、 --handler.一個(gè)是命名空間,一個(gè)是api,rpc,event中那種方式。
2,做cli控制臺(tái)使用:這個(gè)比較常用,主要提供一下功能。
2.1代替另一個(gè)微服務(wù)中的client端,調(diào)用call方法測(cè)試自己微服務(wù)。
2.2檢查自己的微服務(wù)狀態(tài),例如服務(wù)列表,服務(wù)是否保活。
2.3可以把指定的微服務(wù)注冊(cè)/撤銷(xiāo)到另一個(gè)服務(wù)發(fā)現(xiàn)中。
3,做web UI使用:我的理解就是一個(gè)web界面的控制臺(tái)。
4,proxy代理使用:不同的局域網(wǎng)是不能訪(fǎng)問(wèn)的,即使是各種局域網(wǎng)中的電腦能夠訪(fǎng)問(wèn)外網(wǎng)。因?yàn)橹虚g有所謂的nat技術(shù)。感覺(jué)這個(gè)proxy就是nat穿透技術(shù)的一種。
首先保證 Git 和 Go 已經(jīng)安裝成功。可以參考:
其次配置好 GOPATH 環(huán)境變量。
Go Micro 是基于 Go 語(yǔ)言用于開(kāi)發(fā)的微服務(wù)的 RPC 框架,它是 Micro 的基礎(chǔ),執(zhí)行下面當(dāng)命令安裝:
核心是 gogetgithub.com/micro/go-micro,但一些包需預(yù)先安裝好(由于網(wǎng)絡(luò)或映射原因)。
Protocol Buffers (a.k.a., protobuf) 是 Google 的數(shù)據(jù)交換格式。 在 下載安裝源碼,編譯安裝。本文選擇的 cpp 的版本:
還需要安裝 Go 對(duì) Protobuf 的支持,和 Protobuf 代碼生成器:
Micro 用于提供構(gòu)建微服務(wù)的關(guān)鍵元素集合。
時(shí)間會(huì)比較久。
至此一個(gè)基本的 Go Micro 環(huán)境就安裝完畢。
官方網(wǎng)站給了一個(gè)測(cè)試用例,我們先體驗(yàn)一下:
先安裝官方測(cè)試案例 srv:
安裝完成后,會(huì)在 $GOPATH/bin 下生成 srv 執(zhí)行文件,啟動(dòng)他。本文已經(jīng)將 $GOPATH/bin 設(shè)置到環(huán)境變量 path 中。
通過(guò)命令查看當(dāng)前運(yùn)行的微服務(wù)實(shí)例:
調(diào)用微服務(wù):
得到以上結(jié)果,表示 Go Micro 的相關(guān)產(chǎn)品安裝完畢!
Micro的api就是api網(wǎng)關(guān)
API參考了 API網(wǎng)關(guān)模式 為服務(wù)提供了一個(gè)單一的公共入口。基于服務(wù)發(fā)現(xiàn),使得micro api可以提供具備http及動(dòng)態(tài)路由的服務(wù)。
Micro的API基于HTTP協(xié)議。請(qǐng)求的API接口通過(guò)HTTP協(xié)議訪(fǎng)問(wèn),并且路由是基于服務(wù)發(fā)現(xiàn)機(jī)制向下轉(zhuǎn)發(fā)的。 Micro API在 go-micro 之上開(kāi)發(fā),所以它集成了服務(wù)發(fā)現(xiàn)、負(fù)載均衡、編碼及基于RPC的通信。
因?yàn)閙icro api內(nèi)部使用了go-micro,所以它自身也是可插拔的。 參考 go-plugins 了解對(duì)gRPC、kubernetes、etcd、nats、及rabbitmq等支持。另外,api也使用了 go-api ,這樣,接口handler也是可以配置的。
ACME( Automatic Certificate Management Environment)是由 Let’s Encrypt 制定的安全協(xié)議。
可以選擇是否配置白名單
API服務(wù)支持TLS證書(shū)
API使用帶分隔符的命名空間來(lái)在邏輯上區(qū)分后臺(tái)服務(wù)及公開(kāi)的服務(wù)。命名空間及http請(qǐng)求路徑會(huì)用于解析服務(wù)名與方法,比如 GET /foo HTTP/1.1 會(huì)被路由到 go.micro.api.foo 服務(wù)上。
API默認(rèn)的命名空間是 go.micro.api ,當(dāng)然,也可以修改:
我們演示一個(gè)3層的服務(wù)架構(gòu):
完整示例可以參考: examples/greeter
先決條件:我們使用Consul作為默認(rèn)的服務(wù)發(fā)現(xiàn),所以請(qǐng)先確定它已經(jīng)安裝好了,并且已經(jīng)運(yùn)行,比如執(zhí)行 consul agent -dev 這樣子方式運(yùn)行。
向micro api發(fā)起http請(qǐng)求
HTTP請(qǐng)求的路徑 /greeter/say/hello 會(huì)被路由到服務(wù) go.micro.api.greeter 的方法 Say.Hello 上。
繞開(kāi)api服務(wù)并且直接通過(guò)rpc調(diào)用:
使用JSON的方式執(zhí)行同一請(qǐng)求:
micro api提供下面類(lèi)型的http api接口
請(qǐng)看下面的例子
Handler負(fù)責(zé)持有并管理HTTP請(qǐng)求路由。
默認(rèn)的handler使用從注冊(cè)中心獲取的端口元數(shù)據(jù)來(lái)決定指向服務(wù)的路由,如果路由不匹配,就會(huì)回退到使用”rpc” hander。在注冊(cè)時(shí),可以通過(guò) go-api 來(lái)配置路由。
API有如下方法可以配置請(qǐng)求handler:
通過(guò) /rpc 入口可以繞開(kāi)handler處理器。
API處理器接收任何的HTTP請(qǐng)求,并且向前轉(zhuǎn)發(fā)指定格式的RPC請(qǐng)求。
RPC處理器接收json或protobuf格式的HTTP POST請(qǐng)求,然后向前轉(zhuǎn)成RPC請(qǐng)求。
代理Handler其實(shí)是內(nèi)置在服務(wù)發(fā)現(xiàn)中的反向代理服務(wù)。
事件處理器使用go-micro的broker代理接收http請(qǐng)求并把請(qǐng)求作為消息傳到消息總線(xiàn)上。
Web處理器是,它是內(nèi)置在服務(wù)發(fā)現(xiàn)中的HTTP反向代理服務(wù),支持web socket。
/rpc 端點(diǎn)允許繞過(guò)主handler,然后與任何服務(wù)直接會(huì)話(huà)。
示例:
更多信息查看可運(yùn)行的示例: github.com/micro/examples/api
解析器,Micro使用命名空間與HTTP請(qǐng)求路徑來(lái)動(dòng)態(tài)路由到具體的服務(wù)。
API命名的空間是 go.micro.api 。可以通過(guò)指令 --namespace 或者環(huán)境變量 MICRO_NAMESPACE= 設(shè)置命名空間。
下面說(shuō)一下解析器是如何使用的:
RPC解析器示例中的RPC服務(wù)有名稱(chēng)與方法,分別是 go.micro.api.greeter , Greeter.Hello 。
URL會(huì)被解析成以下幾部分:
帶版本號(hào)的API URL也可以很容易定位到具體的服務(wù):
代理解析器只處理服務(wù)名,所以處理方案和RPC解析器有點(diǎn)不太一樣。
URL會(huì)被解析成以下幾部分:
網(wǎng)站標(biāo)題:go語(yǔ)言編寫(xiě)微服務(wù)網(wǎng)關(guān),go搭建微服務(wù)
轉(zhuǎn)載來(lái)源:http://chinadenli.net/article14/dsgejge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)站制作、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)