成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 微服務(wù)工具包 Go kit 怎么集成 gRPC?

開發(fā)
本文我們通過示例項目介紹 Go kit 怎么集成 gRPC,通過集成 gRPC,Transport 層實現(xiàn)通過 rpc 進(jìn)行網(wǎng)絡(luò)傳輸。

01介紹

我們在上一篇文章「??Go 語言基于 Go kit 開發(fā) Web 項目??」中,介紹了怎么使用 Go kit 開發(fā) Web 項目,在這篇文章中,我們傳輸層使用的是 HTTP,本文我們介紹 Go kit 怎么集成 gRPC,也就是說我們在傳輸層使用 rpc。

在閱讀完前面幾篇文章后,我們已經(jīng)了解 Go kit 分為三層,分別是 Transport、Endpoint 和 Service,其中 Transport 負(fù)責(zé)網(wǎng)絡(luò)傳輸,Endpoint 負(fù)責(zé)接收請求和返回響應(yīng),Service 層負(fù)責(zé)定義業(yè)務(wù)接口,并實現(xiàn)接口方法。

Go kit 集成 gRPC,主要在 Transport 層實現(xiàn)。

02實現(xiàn)原理

Go kit 集成 gRPC,即將 gRPC 集成到 Go kit 的 Transport 層。Transport 層將接收到的網(wǎng)絡(luò)請求轉(zhuǎn)換為 Endpoint 層可以處理的對象,主要需要實現(xiàn)兩個功能,解碼和編碼。

其中,解碼負(fù)責(zé)把網(wǎng)絡(luò)請求轉(zhuǎn)換為 Endpoint 可以處理的請求對象;編碼負(fù)責(zé)將 Endpoint 處理結(jié)果轉(zhuǎn)換為響應(yīng)對象,返回給客戶端。

03Go kit 集成 gRPC 的示例項目

在了解完實現(xiàn)原理之后,我們通過示例項目介紹 Go kit 怎么集成 gRPC,關(guān)于定義 proto 文件,和使用 protoc 生成 pb 文件,我們在之前的文章中已經(jīng)介紹過,限于篇幅,本文不再贅述。

使用 Go kit 集成 gRPC,實際上就是在 Transport 層使用 gRPC 傳輸,除此之外,它和我們上一節(jié)講的使用 Go kit 開發(fā) Web 項目的流程是一樣的,共分為五個步驟實現(xiàn)該示例項目,分別是定義 proto 并生成 pb 文件、創(chuàng)建 service 層、創(chuàng)建 endpoint 層、創(chuàng)建 transport 層和定義主函數(shù)。

定義 proto

...
option go_package = "./user";

service UserService {
rpc Register(RegisterReq) returns (RegisterRes) {}
}
...

生成 pb 文件

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

閱讀上面這段代碼,我們定義一個 proto 文件,并使用 protoc 工具生成 pb 文件,需要注意的是我們將 require_unimplemented_servers 設(shè)置為 false。

原因如下:

  • By default, to register services using the methods generated by this tool, the service implementations must embed the corresponding UnimplementedServer for future compatibility. This is a behavior change from the grpc code generator previously included with protoc-gen-go. To restore this behavior, set the option require_unimplemented_servers=false.

Service - 定義接口

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 接口,接口包含一個方法 Register,需要注意的是,Register 方法會通過調(diào)用 grpc.Handler 的 ServeGRPC 方法,將請求參數(shù)傳遞給 Go kit 處理。

Endpoint - 接收請求和返回響應(yīng)

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 層的接口的方法處理請求。

Transport - 傳輸層

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 層實現(xiàn) pb 文件中的 UserServiceServer 方法,需要注意的是,我們在 NewUserService 函數(shù)中,傳入 Endpoint。

完整代碼,請參閱 Github。

04總結(jié)

本文我們通過示例項目介紹 Go kit 怎么集成 gRPC,通過集成 gRPC,Transport 層實現(xiàn)通過 rpc 進(jìn)行網(wǎng)絡(luò)傳輸。

責(zé)任編輯:未麗燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2022-02-27 23:10:26

微服務(wù)工具包Golang

2022-06-07 08:19:30

gRPCBallerina微服務(wù)

2022-03-13 23:51:39

Web項目Go

2023-06-10 23:01:41

GrpcProtobuf數(shù)據(jù)

2025-01-13 00:00:07

Go語言微服務(wù)

2021-01-14 09:55:21

Java微服務(wù)Go

2015-03-06 17:46:55

2025-02-04 13:53:18

NixGogRPC

2023-03-05 23:11:07

Go語言服務(wù)

2022-01-26 00:03:00

高可用gRPC微服務(wù)

2021-03-10 10:00:31

Go語言strconv包類型轉(zhuǎn)換工具

2017-11-22 13:01:03

Go技術(shù)棧構(gòu)建

2022-04-20 08:00:53

服務(wù)Istio腳手架

2025-01-20 00:10:00

Go語言Kratos

2025-01-06 00:00:01

KratosGo微服務(wù)

2021-07-26 11:19:43

微服務(wù)開發(fā)技術(shù)

2023-01-29 23:51:07

微服務(wù)框架Go

2023-12-13 07:19:01

微服務(wù)架構(gòu)Golang

2022-11-09 09:15:31

ProtoBufGo語言

2024-12-23 00:22:55

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 污污的网站在线观看 | 国产精品高潮呻吟久久 | 日本小视频网站 | 资源首页二三区 | 欧美日韩在线观看一区二区三区 | 亚洲免费影院 | 一本综合久久 | 欧美成人手机视频 | av午夜激情| 欧美成人视屏 | 涩涩视频网站在线观看 | 97日日碰人人模人人澡分享吧 | 亚洲成人av| 天天射影院 | 国产精品一区2区 | 久色视频在线观看 | 呦呦在线视频 | 日韩美香港a一级毛片免费 国产综合av | 中文字幕在线视频一区二区三区 | 亚洲欧美中文字幕 | 国产精品99久久久久久宅男 | 成人精品一区亚洲午夜久久久 | 一区二区三区四区免费视频 | 成人中文字幕在线观看 | 久久在线 | 极品销魂美女一区二区 | 精品视频一区在线 | 精品亚洲一区二区三区四区五区 | 三级在线观看 | 夜久久 | 视频一区在线观看 | 在线免费观看成人 | 精品日本久久久久久久久久 | 免费性视频 | 亚洲精品麻豆 | 日本一区二区视频 | 美女人人操 | 一区二区三区免费在线观看 | 欧美a区 | 一级大黄色片 | 欧美日韩不卡合集视频 |