go基於grpc構建微服務框架 服務註冊與發現

2021-09-13 20:14:46 字數 2551 閱讀 7143

grpc 是谷歌開源的rpc框架,基於http2實現,並支援跨語言,目前基本涵蓋了主流語言.跨語言的實現主要得益於protobuf,通過編寫proto檔案,通過protobuf工具生成對應語言的類庫進行使用.

對於go這樣一門新生語言來說,生態鏈還處於發展階段,微服務框架也是如此,下面將基於grpc-go版本搭建乙個微服務通訊框架.

1.1 解決的問題

服務註冊與發布主要解決的服務依賴問題,通常意義上,如果a服務呼叫b服務時,最直接的做法是配置ip位址和埠.但隨著服務依賴變多時,配置將會是否龐雜,且當服務發生遷移時,那麼所有相關服務的配置均需要修改,這將十分難以維護以及容易出現問題.

因此為了解決這種服務依賴關係,服務註冊與發布應運而生.

1.2 機制

服務註冊與發現主要分為以下幾點.

這裡主要是服務的服務名,ip資訊,以及一些附件元資料.通過註冊介面註冊到服務註冊發布中心.

當服務意外停止時,客戶端需要感知到服務停止,並將服務的ip位址踢出可用的ip位址列表,這裡可以使用定時心跳去實現.

通過服務註冊與發布,可以實現乙個服務部署多台例項,客戶端實現在例項直接的負載均衡,從而實現服務的橫向擴充套件.

因此,服務註冊與發布可以概況為,服務將資訊上報,客戶端拉取服務資訊,通過服務名進行呼叫,當服務宕機時客戶端踢掉故障服務,服務新上線時客戶端自動新增到呼叫列表.

2.1 客戶端

具體需要實現幾個介面,針對客戶端,最簡單的實現方式只需要實現兩個介面方法resolve(),以及next(),然後使用輪詢的負載均衡方式.

主要通過etcd的get介面以及watch介面實現.

//用於生成watcher,監聽註冊中心中的服務資訊變化

func (er *etcdregistry) resolve(target string) (naming.watcher, error)

return w, nil

}

//next介面主要用於獲取註冊的服務資訊,通過channel以及watch,當服務資訊發生

//變化時,next介面會將變化返回給grpc框架從而實現服務資訊變更.

func (ew *etcdwatcher) next() (*naming.update, error)

for _, kv := range resp.kvs

}//建立etcd的watcher監聽target(服務名)的資訊.

opts := etcd.opoption

ew.watchchan = ew.cli.watch(context.todo(), ew.target, opts...)

return updates, nil

}//阻塞監聽,服務發生變化時才返回給上層

wrsp, ok :=

if !ok

if wrsp.err() != nil

for _, e := range wrsp.events

if err != nil

}return updates, nil

}

2.2 服務端

服務端只需要上報服務資訊,並定時保持心跳,這裡通過etcd的put介面以及keepalive介面實現.

具體如下:

//將服務資訊序列化成json格式

var upbytes byte

if upbytes, err = json.marshal(update); err != nil

ctx, cancel := context.withtimeout(context.todo(), resolvertimeout)

er.cancal = cancel

for _, opt := range opts

switch update.op

//put服務資訊到etcd,並設定key的值ttl,通過後面的keepalive介面

//對ttl進行續期,超過ttl的時間未收到續期請求,則說明服務可能掛了,從而清除服務資訊

etcdopts := etcd.opoption

key := target + "/" + update.addr

_, err = er.cli.kv.put(ctx, key, string(upbytes), etcdopts...)

if err != nil

//保持心跳

lsrspchan, err := er.lscli.keepalive(context.todo(), lsrsp.id)

if err != nil

go func()

}}()

case naming.delete:

_, err = er.cli.delete(ctx, target+"/"+update.addr)

default:

return status.error(codes.invalidargument, "unsupported op")

}return nil

}

如何基於gRPC溝通微服務框架

本文我們來講解一下如何使用 grpc構建微服務,grpc是乙個開源框架,可用於構建可擴充套件且高效能的微服務並建立服務之間的通訊。隨著企業越來越多地轉向微服務,對構建這些微服務的低延遲和可擴充套件框架的需求也在增加。為了滿足這一需求,各種工具和框架提供商正加快滿足微服務需求。同時從構建大型微服務應用...

Go微服務 grpc的簡單使用

我的是windows,將壓縮包bin目錄下的exe放到環境path目錄中即可。然後獲取外掛程式支援庫 grpc執行時介面編譯碼支援庫 從 proto檔案 grpc介面描述檔案 生成 go檔案 的編譯器外掛程式 go get u github.com golang protobuf protoc ge...

Go語言 gRPC框架使用

上節課已經學習了grpc基本知識,對grpc有了初步的認識。本節課通過程式設計實現grpc程式設計。我們想要實現的是通過grpc框架進行遠端服務呼叫,首先第一步應該是要有服務。利用之前所掌握的內容,grpc框架支援對服務的定義和生成。grpc框架預設使用protocol buffers作為介面定義語...