自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā)
本文我們通過示例項目介紹 Go kit 怎么集成 gRPC,通過集成 gRPC,Transport 層實現(xiàn)通過 rpc 進行網(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 負責(zé)網(wǎng)絡(luò)傳輸,Endpoint 負責(zé)接收請求和返回響應(yīng),Service 層負責(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)兩個功能,解碼和編碼。

其中,解碼負責(zé)把網(wǎng)絡(luò)請求轉(zhuǎn)換為 Endpoint 可以處理的請求對象;編碼負責(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 進行網(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ù)

2015-03-06 17:46:55

2021-01-14 09:55:21

Java微服務(wù)Go

2023-03-05 23:11:07

Go語言服務(wù)

2025-02-04 13:53:18

NixGogRPC

2022-01-26 00:03:00

高可用gRPC微服務(wù)

2021-03-10 10:00:31

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

2022-04-20 08:00:53

服務(wù)Istio腳手架

2017-11-22 13:01:03

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

2025-01-06 00:00:01

KratosGo微服務(wù)

2021-07-26 11:19:43

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

2022-03-29 10:36:32

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

2025-01-20 00:10:00

Go語言Kratos

2023-01-29 23:51:07

微服務(wù)框架Go

2023-11-25 09:41:34

GogRPCHandler

2022-11-09 09:15:31

ProtoBufGo語言
點贊
收藏

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