grpc-环境与示例
2021/8/26 23:06:26
本文主要是介绍grpc-环境与示例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1. 数据传输基本原理
2. grpc环境安装
- 代码生成器
go get -u github.com/golang/protobuf/protoc-gen-go // 会自动在 $GOPATH/bin 目录下生成 protoc-gen-go 可执行二进制文件 // 需要设置GOPATH环境变量,并且将 $GOPATH/bin 添加到系统或当前用户的环境变量PATH中
- grpc框架
go get -u google.golang.org/grpc
- Proto buffer 文件编译器
1. 下载地址: https://github.com/protocolbuffers/protobuf/releases 2. 下载编译器 protoc 3. 将编译器放在 $GOPATH/bin/目录下 4. 将$GOPATH/bin/目录添加到系统或当前用户环境变量 PATH 中 # protoc编译器会依据proto文件生成对应语言的代码
3. Demo
- 编写 proto buffer文件
syntax = "proto3"; // 声明当前使用的是proto3语法 option go_package = "service/"; // option --选项,指明依据当前proto文件生成的go代码放到哪个包下 // 定义rpc消息结构 -- 请求 message ProductRequest { int64 product_id = 1; } // 定义rcp消息结构 -- 响应 message ProductResponse { int64 product_store = 1; // 字段类型 字段名 字段值在二进制数据中的排序位置 }
- 使用 protoc编译 proto文件,生成Go代码
protoc --go_out=service proto/hai.proto // --go_out 指定生成go代码保存的目录位置,最后一个参数是proto文件 // 会生成一个 *.pb.go 文件
- grpc服务端与客户端
- 定义 proto buffer文件
syntax = "proto3"; option go_package = "service/"; message ProductRequest { int64 product_id = 1; } message ProductResponse { int64 product_store = 1; } // 定义一个产品服务 service ProductService { // GetProductStoreNums 获取商品库存 rpc GetProductStoreNums (ProductRequest) returns (ProductResponse); }
- Protoc 编译 proto文件
protoc --go_out=plugins=grpc:. .\proto\shop.proto // 指定插件 plugins=grpc // 冒号后面是生成Go代码的保存目录 // 生成代码之后,需执行 go mod tidy 安装依赖
- 创建grpc服务端\
package main import ( "context" "fmt" "google.golang.org/grpc" "learn-go-project/service" "log" "net" ) // ImplementProductService 定义产品服务实现类 type ImplementProductService struct { } // GetProductStoreNums 实现 proto buffer文件中service 定义的rpc方法 ==> 实现 pb文件中 rpc方法生成的接口 func (s *ImplementProductService) GetProductStoreNums(ctx context.Context, in *service.ProductRequest) (*service.ProductResponse, error) { fmt.Println(in.GetProductId()) return &service.ProductResponse{ProductStore: 20}, nil } func main() { // 1. 声明一个grpc服务 grpcService := grpc.NewServer() // 2. 将实现类注册到生成的pd文件中 service.RegisterProductServiceServer(grpcService, &ImplementProductService{}) // 3. 启动tcp服务 l, err := net.Listen("tcp", "0.0.0.0:9999") if err != nil { log.Fatalln(err) } // 3. 让grp去处理tcp连接 err = grpcService.Serve(l) if err != nil { log.Fatalln(err) } }
- 创建grpc客户端
package main import ( "context" "fmt" "google.golang.org/grpc" "learn-go-project/service" "log" ) func main() { // 1. 创建grpc客户端连接 conn, err := grpc.Dial(":9999", grpc.WithInsecure()) if err != nil { log.Fatalln(err) } defer conn.Close() // 2. 创建对应服务的连接 cli := service.NewProductServiceClient(conn) // 3. 调用方法,获取响应体 response, err := cli.GetProductStoreNums(context.Background(), &service.ProductRequest{ProductId: 50}) if err != nil { log.Fatalln(err) } fmt.Println(response.ProductStore) }
这篇关于grpc-环境与示例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23DevExpress 怎么实现右键菜单(Context Menu)显示中文?-icode9专业技术文章分享
- 2024-12-22怎么通过控制台去看我的页面渲染的内容在哪个文件中呢-icode9专业技术文章分享
- 2024-12-22el-tabs 组件只被引用了一次,但有时会渲染两次是什么原因?-icode9专业技术文章分享
- 2024-12-22wordpress有哪些好的安全插件?-icode9专业技术文章分享
- 2024-12-22wordpress如何查看系统有哪些cron任务?-icode9专业技术文章分享
- 2024-12-21Svg Sprite Icon教程:轻松入门与应用指南
- 2024-12-20Excel数据导出实战:新手必学的简单教程
- 2024-12-20RBAC的权限实战:新手入门教程
- 2024-12-20Svg Sprite Icon实战:从入门到上手的全面指南
- 2024-12-20LCD1602显示模块详解