美文网首页
gRPC 远程调用基础案例

gRPC 远程调用基础案例

作者: Squall_峰 | 来源:发表于2018-11-11 00:30 被阅读0次

完整项目路径:cd /Users/squall/go/src/myproject/goGrpc_course


go语言实现 gRPC远程调用

HelloServer需求:

  • 服务端:
    创建一个服务,一个接口接收客户端传输过来的用户姓名
    并且返回“Nice to meet you ” + 用户姓名 给客户端
  • 客户端:
    只需要调用接口传输姓名参数给服务端即可

protobuf定义
创建一个protobuf package,如:hello;
在工程目录下创建hello文件夹
里面创建 protobuf协议文件 hello.proto

syntax = "proto3";
package hello;

// The HelloServer service definition.
service Hello {
    //远程调用接口
    rpc SayHello (Request) returns (Reply) {}
}

// The request message containing the user's name.
message Request {
    string name = 1;
}

// The response message containing the greetings
message Reply {
    string msg = 1;
}

在当前文件下,编译 helloServer.proto文件
protoc --go_out=plugins=grpc:./ *.proto
得到 hello.pb.go文件

gRPC-Server

package main
import (
    "fmt"
    "net"
    context "golang.org/x/net/context"
    grpc "google.golang.org/grpc"
    pb "./hello"
)

//1 实现接口
type HelloService  struct {}
func (this *HelloService) SayHello(ctx context.Context ,request *pb.Request) (*pb.Reply , error) {
    //接受客户端的调用,输出客户端的姓名并且返回一个结构体
    fmt.Println("Get call , name is :",request.GetName())
    var replyStr string = "Nice to meet you " + request.GetName()
    return &pb.Reply{Msg:replyStr},nil
}

const (
    Address = ":10080"
)

func main(){
    //2 开启服务等待客户端连接和调用 
    service := HelloService{}
    ln,err := net.Listen("tcp",Address)
    if err !=nil{
        fmt.Println("Error in listen :",err)
        return
    }
    //函数返回的时候自动关闭服务
    defer ln.Close()
    //创建grpc的服务器
    server := grpc.NewServer()
    pb.RegisterHelloServer(server,&service)
    if err!=nil{
        fmt.Println("Error in register server :",err)
        return
    }
    if err:=server.Serve(ln);err!=nil{
        fmt.Println("Error in Serve:",err)
        return
    }

}

gRPC-Client

package main
import(
    fmt "fmt"
    context "golang.org/x/net/context"
    grpc "google.golang.org/grpc"
    pb "./hello"
)

func main(){
    //1 建立连接
    conn ,err := grpc.Dial("127.0.0.1:10080",grpc.WithInsecure())
    if err!=nil{
        fmt.Println("Error in dial:",err)
        return
    }
    //2 调用rpc接口
    client := pb.NewHelloClient(conn)
    reply,err := client.SayHello(context.Background(),&pb.Request{ Name:"squall"})
    fmt.Println("Get reply :",reply.GetMsg())
}

运行结果
先运行 server,在运行 client
得到以下输出结果

#服务端输出:
squall:04_grpc$ ./server
SayHello to squall

#客户端输出:
lsquall:04_grpc$ ./client
Nice to meet you squall

相关文章

网友评论

      本文标题:gRPC 远程调用基础案例

      本文链接:https://www.haomeiwen.com/subject/ukatfqtx.html