偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

01介紹

我們?cè)谏弦黄恼隆??Go 語(yǔ)言基于 Go kit 開(kāi)發(fā) Web 項(xiàng)目??」中,介紹了怎么使用 Go kit 開(kāi)發(fā) Web 項(xiàng)目,在這篇文章中,我們傳輸層使用的是 HTTP,本文我們介紹 Go kit 怎么集成 gRPC,也就是說(shuō)我們?cè)趥鬏攲邮褂?rpc。

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

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

02實(shí)現(xiàn)原理

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

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

03Go kit 集成 gRPC 的示例項(xiàng)目

在了解完實(shí)現(xiàn)原理之后,我們通過(guò)示例項(xiàng)目介紹 Go kit 怎么集成 gRPC,關(guān)于定義 proto 文件,和使用 protoc 生成 pb 文件,我們?cè)谥暗奈恼轮幸呀?jīng)介紹過(guò),限于篇幅,本文不再贅述。

使用 Go kit 集成 gRPC,實(shí)際上就是在 Transport 層使用 gRPC 傳輸,除此之外,它和我們上一節(jié)講的使用 Go kit 開(kāi)發(fā) Web 項(xiàng)目的流程是一樣的,共分為五個(gè)步驟實(shí)現(xiàn)該示例項(xiàng)目,分別是定義 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

閱讀上面這段代碼,我們定義一個(gè) 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")
}

閱讀上面這段代碼,我們?cè)?Service 層創(chuàng)建 IUser 接口,接口包含一個(gè)方法 Register,需要注意的是,Register 方法會(huì)通過(guò)調(diào)用 grpc.Handler 的 ServeGRPC 方法,將請(qǐng)求參數(shù)傳遞給 Go kit 處理。

Endpoint - 接收請(qǐng)求和返回響應(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 層的接口的方法處理請(qǐng)求。

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,
),
}
}

閱讀上面這段代碼,我們?cè)?Transport 層實(shí)現(xiàn) pb 文件中的 UserServiceServer 方法,需要注意的是,我們?cè)? NewUserService 函數(shù)中,傳入 Endpoint。

完整代碼,請(qǐng)參閱 Github。

04總結(jié)

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

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

2022-02-27 23:10:26

微服務(wù)工具包Golang

2022-06-07 08:19:30

gRPCBallerina微服務(wù)

2025-10-20 07:17:10

Go語(yǔ)言微服務(wù)

2023-06-10 23:01:41

GrpcProtobuf數(shù)據(jù)

2022-03-13 23:51:39

Web項(xiàng)目Go

2025-01-13 00:00:07

Go語(yǔ)言微服務(wù)

2021-01-14 09:55:21

Java微服務(wù)Go

2015-03-06 17:46:55

2023-03-05 23:11:07

Go語(yǔ)言服務(wù)

2025-02-04 13:53:18

NixGogRPC

2022-01-26 00:03:00

高可用gRPC微服務(wù)

2021-03-10 10:00:31

Go語(yǔ)言strconv包類(lèi)型轉(zhuǎn)換工具

2022-04-20 08:00:53

服務(wù)Istio腳手架

2017-11-22 13:01:03

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

2025-08-04 01:22:00

Go 語(yǔ)言微服務(wù)Kratos

2025-01-06 00:00:01

KratosGo微服務(wù)

2025-01-20 00:10:00

Go語(yǔ)言Kratos

2021-07-26 11:19:43

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

2022-03-29 10:36:32

技術(shù)架構(gòu)微服務(wù)

2023-01-29 23:51:07

微服務(wù)框架Go
點(diǎn)贊
收藏

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