?gRPC與go?chassis
盡管grpc-go本身也自帶一些云原生能力,比如負(fù)載均衡,但是還遠(yuǎn)遠(yuǎn)不夠,并且需要使用者自己來(lái)編寫代碼實(shí)現(xiàn)。
go?chassis是一個(gè)統(tǒng)一的微服務(wù)開(kāi)發(fā)框架,能夠集成不同的通信協(xié)議,并使用統(tǒng)一的路由管理,負(fù)載均衡,熔斷降級(jí),限流,監(jiān)控等功能。
隨著grpc的流行,go?chassis決定將grpc集成到自己的框架中,為grpc-go帶來(lái)更加豐富強(qiáng)大的功能
關(guān)于go?chassis能夠提供的能力可以從這篇來(lái)開(kāi)始了解。
Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架實(shí)踐-go chassis
原理
go chassis的設(shè)計(jì)允許任意協(xié)議的接入
無(wú)論協(xié)議如何,都可以通過(guò)實(shí)現(xiàn)client與server接口來(lái)接入到go?chassis框架
https://github.com/go-chassis/go-chassis/blob/master/core/client/client.go
https://github.com/go-chassis/go-chassis/blob/master/core/server/server.go
每種請(qǐng)求都會(huì)被轉(zhuǎn)換為統(tǒng)一的抽象Invocation,而invocation是微服務(wù)治理中的標(biāo)準(zhǔn)模型,所以就可以使用標(biāo)準(zhǔn)的功能,例如負(fù)載均衡,熔斷,路由管理等,最終再次使用標(biāo)準(zhǔn)協(xié)議將請(qǐng)求發(fā)送出去,協(xié)議與原生協(xié)議完全兼容。
例子
使用go?chassis編寫grpc程序需要遵從一定的標(biāo)準(zhǔn),并不與原生的編寫方法相同,完整的例子在https://github.com/go-chassis/go-chassis-examples/tree/master/grpc
本次將使用Apache?ServiceComb?Service?Center作為注冊(cè)中心
編寫proto?IDL
1. 編寫proto描述文件
go?chassis內(nèi)部有schema與operation的概念:?其中helloworld.Greeter就是schema,?SayHello為operation
2.?生成helloworld.pb.go
protoc –go_out=. helloworld.proto
之后的步驟就與原生grpc-go有所不同了
3.?手動(dòng)更改helloworld.pb.go中的一個(gè)變量
必須將_Greeter_serviceDesc改為Greeter_serviceDesc
也就是將此變量暴露出去,供別的package使用
Provider端
1.?編寫業(yè)務(wù)邏輯
2.將業(yè)務(wù)邏輯注冊(cè)到go?chassis,此時(shí)就需要更改的那個(gè)變量Greeter_serviceDesc
第一個(gè)參數(shù)表示你要向哪個(gè)協(xié)議服務(wù)器注冊(cè),第二個(gè)為業(yè)務(wù)邏輯,第三個(gè)為grpc serivce desc
3.?修改配置文件chassis.yaml,最小配置項(xiàng)需要配置服務(wù)中心,以及指定需要啟動(dòng)的協(xié)議服務(wù)器
4.?修改microservice.yaml,為這個(gè)微服務(wù)起個(gè)名字
5.?啟動(dòng)服務(wù)
Consumer端
1.?拿到pb文件生成go代碼
protoc –go_out=. hello.proto
2.?修改配置文件chassis.yaml
3.?修改microservice.yaml,?為consumer起個(gè)名字
4.?main中調(diào)用服務(wù)端,指定微服務(wù)名(RPCServer),schema,operation與參數(shù)和返回
那么現(xiàn)在grpc已經(jīng)擁有了基本的負(fù)載均衡能力,服務(wù)端向Service?Center注冊(cè)
而consumer將周期緩存provider實(shí)例列表,進(jìn)行負(fù)載均衡
更多高級(jí)特性,可參考文檔進(jìn)行配置
http://go-chassis.readthedocs.io/en/latest/