王柳 发表于 2022-9-1 21:14:17

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

下载通用编译器
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEwMzYxOTM4NC02NDYxMDU5NjEucG5n
地址:https://github.com/protocolbuffers/protobuf/releases
选择对应的版本,解压后将文件夹下bin目录配置到环境变量
安装go编译器
$ go install google.golang.org/protobuf/cmd/protoc-gen-go
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc创建文件夹,创建两个项目
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEwNDEzMzYwMS0xOTMxOTYzMzQzLnBuZw==
记得 go mod init 项目名
然后 go mod tidy
Demo.proto内容
// 这个就是protobuf的中间文件

// 指定的当前proto语法的版本,有2和3
syntax = "proto3";
//输出路径
option go_package="../pdfile";


// 定义request model
message GrpcDemoRequest{
int32 number1 = 1; // 1代表顺序
int32 number2 = 2;
}

// 定义response model
message GrpcDemoResponse{
int32 sum = 1; // 1代表顺序
}

// 定义服务主体
service ProdService{
// 定义方法
rpc GetSum(GrpcDemoRequest) returns(GrpcDemoResponse);

}这里我们实现GetSum的功能是,传过来的GrpcDemoRequest结构体内 n1+n2 然后通过GrpcDemoResponse返回。
proto文件定义了方法和方法的参数,方法的内容要通过编译后的文件以接口的方式来实现
编译文件,终端进入到pdfile文件夹下,运行命令
protoc --go_out=. --go-grpc_out=. Demo.proto会在pdfile下生成两个文件
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEwNTM1NzEwNC0xNjEzMzI1MTg2LnBuZw==
生成后的go文件不要改动
如果导入包报红
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjExMTExMTIzNC0xNjI2ODI0Mjc5LnBuZw==
鼠标悬浮点击Sync
Demo_grpc.pd.go
我们要实现的就是51 52 行的方法,下面红框是示例,到时候我们复制一下拿来用
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEwNTYyMTMwOS0xNTE5NDg2OTA2LnBuZw==
在pdfile文件夹下创建Demo_imp.go
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjExMDQwNTk2Ni05OTI1MzA0NDMucG5n
代码
package pdfile

import (
        "context"
)

type DemoServiceServer struct {
}

func (d *DemoServiceServer) GetSum(ctx context.Context,req *GrpcDemoRequest) (*GrpcDemoResponse, error) {
        resp := GrpcDemoResponse{
                Sum:                  req.Number1+req.Number2,
        }

        return &resp,nil
}

func (d *DemoServiceServer) mustEmbedUnimplementedProdServiceServer() {}服务注册
回到我们srv下的main文件
package main

import (
        "google.golang.org/grpc"
        "net"
        "srv/pdfile"
)

func main() {


        server := grpc.NewServer()
        demoServer := &pdfile.DemoServiceServer{}
        pdfile.RegisterProdServiceServer(
                server,
                demoServer,
        )

        listenin ,err := net.Listen("tcp","0.0.0.0:8858")
        if err != nil {
                panic(err)
        }
        _ = server.Serve(listenin)
}客户端调用
将pdfile文件夹拷贝到cli文件夹下
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjExMTI0NzA1OC0yMDEyOTcwMjMwLnBuZw==
修改cli main文件
package main

import (
        "cli/pdfile"
        "context"
        "fmt"
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/insecure"
        "log"
)

func main() {
        conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
        if err != nil {
                log.Fatal(err)
        }

        demoServiceClient := pdfile.NewProdServiceClient(conn)

        // 直接像调用本地方法一样调用GetSum方法
        resp, err := demoServiceClient.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
                Number1:            10,
                Number2:            5,
        })
        if err != nil {
                log.Fatal("调用gRPC方法错误: ", err)
        }
        fmt.Println(resp)
}运行srv 然后运行 cli
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjExNTgwMzM4Ny0xMDAxOTU0Njc5LnBuZw==
完成
封装方便调用
新建文件
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEyMTEwMjkzMC05NzI3MDU4MDkucG5n
package grpc_conn

import (
        "cli/pdfile"
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/insecure"
        "log"
)

var Grpc_conn pdfile.ProdServiceClient

func init() {
        conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
        if err != nil {
                log.Fatal(err)
        }
        Grpc_conn = pdfile.NewProdServiceClient(conn)
}新建测试模块
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEyMTIwNTExNy00MzA5NzE1MzMucG5n
package test

import (
        "cli/grpc_conn"
        "cli/pdfile"
        "context"
        "fmt"
        "log"
        "testing"
)

func TestDemo1(t *testing.T) {
        resp, err := grpc_conn.Grpc_conn.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
                Number1:            10,
                Number2:            5,
        })
        if err != nil {
                log.Fatal("调用gRPC方法错误: ", err)
        }
        fmt.Println(resp)
}运行test
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pbWcyMDIyLmNuYmxvZ3MuY29tL2Jsb2cvMjkzMjA0MS8yMDIyMDcvMjkzMjA0MS0yMDIyMDcyNjEyMTMwMjM4OS0xMDY3MjAzMjM1LnBuZw==

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: [grpc快速入门] 一 grpc生成与调用