在go中玩下gRPC

版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权。 https://blog.csdn.net/stpeace/article/details/82740469

        gRPC很常见, 也很常用, 来玩下。

        先安装该安装的, 比如protoc, protoc-gen-go, grpc, 该设置的环境变量设置一下,这些很简单, 不必多说。

        写协议文件data.proto:

syntax = "proto3";
package example;

service TaogeApi {
    rpc MyFun(ReqBody) returns (RspBody){}
}

message ReqBody {
	int32  cmd = 1;
    string str = 2;
}

message RspBody {
	int32  cmd  = 1;
	int32  code = 2;
    string str  = 3;
}

         写服务端代码s.go

package main
import (
    "example"
    "net"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    "golang.org/x/net/context"
    "log"
)

const (
    HOST string = "localhost"
    PORT string = "8080"
)

type TaogeApi struct{}
func (fd *TaogeApi) MyFun(ctx context.Context, in *example.ReqBody) (out *example.RspBody, err error) {
    log.Println("Cmd is ", in.Cmd)
    log.Println("Str is ", in.Str)

    out = &example.RspBody{Cmd:in.Cmd, Code:10086, Str:"heheda"}
    return out, nil
}

func main() {
    listener, err := net.Listen("tcp", HOST + ":" + PORT)
    if err != nil {
        log.Fatalln("failed to listen at: " + HOST + ":" + PORT)
    } else {
        log.Println("server is listening at: " + HOST + ":" + PORT)
    }

    rpcServer := grpc.NewServer()
    example.RegisterTaogeApiServer(rpcServer, &TaogeApi{})
    reflection.Register(rpcServer)

    if err = rpcServer.Serve(listener); err != nil {
        log.Fatalln("failed to serve at: " + HOST + ":" + PORT)
    }
}

        让服务端跑起来。

        写客户端代码c.go:

package main
import (
    "google.golang.org/grpc"
    "log"
    "example"
    "golang.org/x/net/context"
)

const (
    ADDRESS string = "localhost:8080"
)

func main() {
    conn, err := grpc.Dial(ADDRESS, grpc.WithInsecure())
    if err != nil {
        log.Fatalln("failed to connect: " + ADDRESS)
    }
    defer conn.Close()

    client := example.NewTaogeApiClient(conn)
    rsp,err := client.MyFun(context.Background(), &example.ReqBody{Cmd:110, Str:"hehe"})
    if err != nil {
        log.Fatalln("MyFun error:" + err.Error())
    }

    log.Println("Cmd is ", rsp.Cmd)
    log.Println("Code is ", rsp.Code)
    log.Println("Str is ", rsp.Str)
}

         也跑起来。

         客户端log为:

2018/09/21 22:12:17 Cmd is  110
2018/09/21 22:12:17 Code is  10086
2018/09/21 22:12:17 Str is  heheda

         

       有个地方要注意, 在data.proto文件中,变量是小写的, 但protoc和protoc-gen-go转换成为大写的, google就喜欢这样搞, 我之前也说过一次(那一次是把大写转化为小写的了)。

      不多说。

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/82740469
今日推荐