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

Go 微服務工具包 Go kit 怎么集成 gRPC?

開發
本文我們通過示例項目介紹 Go kit 怎么集成 gRPC,通過集成 gRPC,Transport 層實現通過 rpc 進行網絡傳輸。

01介紹

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

在閱讀完前面幾篇文章后,我們已經了解 Go kit 分為三層,分別是 Transport、Endpoint 和 Service,其中 Transport 負責網絡傳輸,Endpoint 負責接收請求和返回響應,Service 層負責定義業務接口,并實現接口方法。

Go kit 集成 gRPC,主要在 Transport 層實現。

02實現原理

Go kit 集成 gRPC,即將 gRPC 集成到 Go kit 的 Transport 層。Transport 層將接收到的網絡請求轉換為 Endpoint 層可以處理的對象,主要需要實現兩個功能,解碼和編碼。

其中,解碼負責把網絡請求轉換為 Endpoint 可以處理的請求對象;編碼負責將 Endpoint 處理結果轉換為響應對象,返回給客戶端。

03Go kit 集成 gRPC 的示例項目

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

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

定義 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 設置為 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 層創建 IUser 接口,接口包含一個方法 Register,需要注意的是,Register 方法會通過調用 grpc.Handler 的 ServeGRPC 方法,將請求參數傳遞給 Go kit 處理。

Endpoint - 接收請求和返回響應

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 層,我們給業務接口 IUser 構建 endpoint.Endpoint,用于調用 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 層實現 pb 文件中的 UserServiceServer 方法,需要注意的是,我們在 NewUserService 函數中,傳入 Endpoint。

完整代碼,請參閱 Github。

04總結

本文我們通過示例項目介紹 Go kit 怎么集成 gRPC,通過集成 gRPC,Transport 層實現通過 rpc 進行網絡傳輸。

責任編輯:未麗燕 來源: Golang語言開發棧
相關推薦

2022-02-27 23:10:26

微服務工具包Golang

2022-06-07 08:19:30

gRPCBallerina微服務

2022-03-13 23:51:39

Web項目Go

2023-06-10 23:01:41

GrpcProtobuf數據

2015-03-06 17:46:55

2025-01-13 00:00:07

Go語言微服務

2021-01-14 09:55:21

Java微服務Go

2023-03-05 23:11:07

Go語言服務

2025-02-04 13:53:18

NixGogRPC

2022-01-26 00:03:00

高可用gRPC微服務

2021-03-10 10:00:31

Go語言strconv包類型轉換工具

2022-04-20 08:00:53

服務Istio腳手架

2017-11-22 13:01:03

Go技術棧構建

2025-01-20 00:10:00

Go語言Kratos

2025-01-06 00:00:01

KratosGo微服務

2021-07-26 11:19:43

微服務開發技術

2022-03-29 10:36:32

技術架構微服務

2023-01-29 23:51:07

微服務框架Go

2023-12-13 07:19:01

微服務架構Golang

2022-11-09 09:15:31

ProtoBufGo語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区三区丝袜 | 精品三级| 久久www免费人成看片高清 | 亚洲精品一二三区 | 影音先锋中文字幕在线观看 | 男女在线网站 | 久久久久国产精品一区三寸 | 97精品国产97久久久久久免费 | 亚洲国产成人精品久久久国产成人一区 | 亚洲精品4| 国产1区2区在线观看 | 男女羞羞视频大全 | 亚洲精品在线看 | 中文字幕亚洲精品 | 久久国产精品久久久久久 | 国产精品久久久久久久久久了 | 亚洲一区二区中文字幕 | 国家一级黄色片 | 精品一区二区三区在线观看 | 国产精品区一区二区三区 | 亚洲在线免费观看 | 日韩久久网 | 涩涩导航| 一级做a爰片久久毛片免费看 | 亚洲狠狠丁香婷婷综合久久久 | 日本在线免费 | 在线播放亚洲 | 久久精品小短片 | 国产亚洲精品综合一区 | 精品欧美一区二区精品久久 | 精精国产xxxx视频在线 | 超碰成人免费 | 综合自拍 | 91久久国产综合久久91精品网站 | 国产精品三级久久久久久电影 | 97精品超碰一区二区三区 | 情侣av| 成人a免费 | 日本久久精品 | 久久亚洲经典 | 伊人最新网址 |