[grpc快速入门] 一 grpc生成与调用

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

下载通用编译器

地址:https://github.com/protocolbuffers/protobuf/releases
选择对应的版本,解压后将文件夹下bin目录配置到环境变量
安装go编译器
  1. $ go install google.golang.org/protobuf/cmd/protoc-gen-go
  2. $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
复制代码
创建文件夹,创建两个项目

记得 go mod init 项目名
然后 go mod tidy
Demo.proto内容
  1. // 这个就是protobuf的中间文件
  2. // 指定的当前proto语法的版本,有2和3
  3. syntax = "proto3";
  4. //  输出路径
  5. option go_package="../pdfile";
  6. // 定义request model
  7. message GrpcDemoRequest{
  8.   int32 number1 = 1; // 1代表顺序
  9.   int32 number2 = 2;
  10. }
  11. // 定义response model
  12. message GrpcDemoResponse{
  13.   int32 sum = 1; // 1代表顺序
  14. }
  15. // 定义服务主体
  16. service ProdService{
  17.   // 定义方法
  18.   rpc GetSum(GrpcDemoRequest) returns(GrpcDemoResponse);
  19. }
复制代码
这里我们实现GetSum的功能是,传过来的GrpcDemoRequest结构体内 n1+n2 然后通过GrpcDemoResponse返回。
proto文件定义了方法和方法的参数,方法的内容要通过编译后的文件以接口的方式来实现
编译文件,终端进入到pdfile文件夹下,运行命令
  1. protoc --go_out=. --go-grpc_out=. Demo.proto
复制代码
会在pdfile下生成两个文件

生成后的go文件不要改动
如果导入包报红

鼠标悬浮点击Sync
Demo_grpc.pd.go
我们要实现的就是51 52 行的方法,下面红框是示例,到时候我们复制一下拿来用

在pdfile文件夹下创建Demo_imp.go

代码
  1. package pdfile
  2. import (
  3.         "context"
  4. )
  5. type DemoServiceServer struct {
  6. }
  7. func (d *DemoServiceServer) GetSum(ctx context.Context,req *GrpcDemoRequest) (*GrpcDemoResponse, error) {
  8.         resp := GrpcDemoResponse{
  9.                 Sum:                  req.Number1+req.Number2,
  10.         }
  11.         return &resp,nil
  12. }
  13. func (d *DemoServiceServer) mustEmbedUnimplementedProdServiceServer() {}
复制代码
服务注册
回到我们srv下的main文件
  1. package main
  2. import (
  3.         "google.golang.org/grpc"
  4.         "net"
  5.         "srv/pdfile"
  6. )
  7. func main() {
  8.         server := grpc.NewServer()
  9.         demoServer := &pdfile.DemoServiceServer{}
  10.         pdfile.RegisterProdServiceServer(
  11.                 server,
  12.                 demoServer,
  13.         )
  14.         listenin ,err := net.Listen("tcp","0.0.0.0:8858")
  15.         if err != nil {
  16.                 panic(err)
  17.         }
  18.         _ = server.Serve(listenin)
  19. }
复制代码
客户端调用
将pdfile文件夹拷贝到cli文件夹下

修改cli main文件
  1. package main
  2. import (
  3.         "cli/pdfile"
  4.         "context"
  5.         "fmt"
  6.         "google.golang.org/grpc"
  7.         "google.golang.org/grpc/credentials/insecure"
  8.         "log"
  9. )
  10. func main() {
  11.         conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
  12.         if err != nil {
  13.                 log.Fatal(err)
  14.         }
  15.         demoServiceClient := pdfile.NewProdServiceClient(conn)
  16.         // 直接像调用本地方法一样调用GetSum方法
  17.         resp, err := demoServiceClient.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
  18.                 Number1:              10,
  19.                 Number2:              5,
  20.         })
  21.         if err != nil {
  22.                 log.Fatal("调用gRPC方法错误: ", err)
  23.         }
  24.         fmt.Println(resp)
  25. }
复制代码
运行srv 然后运行 cli

完成
封装方便调用
新建文件
  1. package grpc_conn
  2. import (
  3.         "cli/pdfile"
  4.         "google.golang.org/grpc"
  5.         "google.golang.org/grpc/credentials/insecure"
  6.         "log"
  7. )
  8. var Grpc_conn pdfile.ProdServiceClient
  9. func init() {
  10.         conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
  11.         if err != nil {
  12.                 log.Fatal(err)
  13.         }
  14.         Grpc_conn = pdfile.NewProdServiceClient(conn)
  15. }
复制代码
新建测试模块
  1. package test
  2. import (
  3.         "cli/grpc_conn"
  4.         "cli/pdfile"
  5.         "context"
  6.         "fmt"
  7.         "log"
  8.         "testing"
  9. )
  10. func TestDemo1(t *testing.T) {
  11.         resp, err := grpc_conn.Grpc_conn.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
  12.                 Number1:              10,
  13.                 Number2:              5,
  14.         })
  15.         if err != nil {
  16.                 log.Fatal("调用gRPC方法错误: ", err)
  17.         }
  18.         fmt.Println(resp)
  19. }
复制代码
运行test


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表