掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在閱讀完前面幾篇文章后,我們已經(jīng)了解 Go kit 分為三層,分別是 Transport、Endpoint 和 Service,其中 Transport 負(fù)責(zé)網(wǎng)絡(luò)傳輸,Endpoint 負(fù)責(zé)接收請求和返回響應(yīng),Service 層負(fù)責(zé)定義業(yè)務(wù)接口,并實(shí)現(xiàn)接口方法。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都做網(wǎng)站、鎮(zhèn)寧網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、鎮(zhèn)寧網(wǎng)絡(luò)營銷、鎮(zhèn)寧企業(yè)策劃、鎮(zhèn)寧品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供鎮(zhèn)寧建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
Go kit 集成 gRPC,主要在 Transport 層實(shí)現(xiàn)。
Go kit 集成 gRPC,即將 gRPC 集成到 Go kit 的 Transport 層。Transport 層將接收到的網(wǎng)絡(luò)請求轉(zhuǎn)換為 Endpoint 層可以處理的對(duì)象,主要需要實(shí)現(xiàn)兩個(gè)功能,解碼和編碼。
其中,解碼負(fù)責(zé)把網(wǎng)絡(luò)請求轉(zhuǎn)換為 Endpoint 可以處理的請求對(duì)象;編碼負(fù)責(zé)將 Endpoint 處理結(jié)果轉(zhuǎn)換為響應(yīng)對(duì)象,返回給客戶端。
在了解完實(shí)現(xiàn)原理之后,我們通過示例項(xiàng)目介紹 Go kit 怎么集成 gRPC,關(guān)于定義 proto 文件,和使用 protoc 生成 pb 文件,我們在之前的文章中已經(jīng)介紹過,限于篇幅,本文不再贅述。
使用 Go kit 集成 gRPC,實(shí)際上就是在 Transport 層使用 gRPC 傳輸,除此之外,它和我們上一節(jié)講的使用 Go kit 開發(fā) Web 項(xiàng)目的流程是一樣的,共分為五個(gè)步驟實(shí)現(xiàn)該示例項(xiàng)目,分別是定義 proto 并生成 pb 文件、創(chuàng)建 service 層、創(chuàng)建 endpoint 層、創(chuàng)建 transport 層和定義主函數(shù)。
...
option go_package = "./user";
service UserService {
rpc Register(RegisterReq) returns (RegisterRes) {}
}
...
protoc -I proto \
> --go_out ./pb/user --go_opt paths=source_relative \
> --go-grpc_out=require_unimplemented_servers=false:./pb/user --go-grpc_opt paths=source_relative \
> proto/user.proto
閱讀上面這段代碼,我們定義一個(gè) proto 文件,并使用 protoc 工具生成 pb 文件,需要注意的是我們將 require_unimplemented_servers 設(shè)置為 false。
原因如下:
type IUser interface {
Register(ctx context.Context, username, email, password string) error
}
type User struct{}
func (u User) Register(ctx context.Context, username, email, password string) error {
if username != "" && email != "" && password != "" {
return nil
}
return errors.New("register param is invalid")
}閱讀上面這段代碼,我們在 Service 層創(chuàng)建 IUser 接口,接口包含一個(gè)方法 Register,需要注意的是,Register 方法會(huì)通過調(diào)用 grpc.Handler 的 ServeGRPC 方法,將請求參數(shù)傳遞給 Go kit 處理。
func MakeUserEndpoint(user IUser) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(RegisterReq)
err = user.Register(ctx, req.Username, req.Email, req.Password)
if err != nil {
log.Printf("err:%s", err)
}
return RegisterRes{
Username: req.Username,
Email: req.Email,
}, nil
}
}閱讀上面這段代碼,在 Endpoint 層,我們給業(yè)務(wù)接口 IUser 構(gòu)建 endpoint.Endpoint,用于調(diào)用 Service 層的接口的方法處理請求。
type grpcHandler struct {
register grpc.Handler
}
func (g *grpcHandler) Register(ctx context.Context, req *pb.RegisterReq) (*pb.RegisterRes, error) {
_, res, err := g.register.ServeGRPC(ctx, req)
if err != nil {
return nil, err
}
return res.(*pb.RegisterRes), nil
}
func NewUserServer(ctx context.Context, endpoints Endpoints) pb.UserServiceServer {
return &grpcHandler{
register: grpc.NewServer(
endpoints.UserEndpoint,
DecodeRegister,
EncodeRegister,
),
}
} 閱讀上面這段代碼,我們在 Transport 層實(shí)現(xiàn) pb 文件中的 UserServiceServer 方法,需要注意的是,我們在 NewUserService 函數(shù)中,傳入 Endpoint。
完整代碼,請參閱 Github。
本文我們通過示例項(xiàng)目介紹 Go kit 怎么集成 gRPC,通過集成 gRPC,Transport 層實(shí)現(xiàn)通過 rpc 進(jìn)行網(wǎng)絡(luò)傳輸。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流