golang使用grpc目前正在学习后端有关概念, 了解到了grpc. 本文将简述一个简单demo的搭建.rpc理解我的网络通信概念还停留在比较基础的地方, 直觉来说就是发送一个get/post请求, 设定一定的参数格式, 这样对方再解析你的数据, 基于此完成通讯.而rpc则不使用这种显式的通讯方式, 通过proto与生成grpc文件, 里面提供方法, 供client与server通过方法来进行通讯. 简单来说, 就是如果你以前要告诉server你好, 需要发送一个完整网络请求, 但是现在你只需要调用一个hello方法就可以了环境依赖以及安装golanggrpcgo get -u google.golang.org/grpcprotocgo get -u github.com/golang/protobuf/protoc-gen-go环境变量配置export PATH=$PATH:$GOPATH/bin项目目录结构grpc_test/|– client| -- client.go|-- proto| |-- greeter.pb.go|
– greeter.proto-- server
– server.goDEMO1. 编写proto文件 syntax = “proto3”; package proto; service Hello { rpc Hello (Request) returns (Response) {} } message Request { string Name = 1; } message Response { string Msg = 1; }非常简单, 提供了request, response对象, 并且提供了hello方法.2. 生成grpc文件执行protoc -I ./ ./greeter.proto –go_out=plugins=grpc:../proto/ 前面的./与./greeter.proto是上面的proto文件的文件夹以及文件, 后面的../proto是输出目录, 运行成功的时候, 会生成greeter.pb.go文件. 有兴趣可以详细去读里面的代码.3. 编写服务端脚本package mainimport ( “fmt” “net” “context” grpc “google.golang.org/grpc” proto “grpc_test/proto” // 引用刚才生成grpc代码)const( Address = “127.0.0.1:8801” // 监听的端口)type Greeter struct {}// 实现proto中定义的hello方法func (greeter *Greeter) Hello(ctx context.Context, request *proto.Request) (*proto.Response, error){ fmt.Println(“get client info, name is: “, request.Name) response_msg := “Hello " + request.Name return &proto.Response{Msg:response_msg}, nil }func main(){ service := Greeter{} conn, err := net.Listen(“tcp”, Address) // tcp监听端口 if err != nil{ fmt.Println(err) return } fmt.Println(“tcp listening…”) defer conn.Close() server := grpc.NewServer() proto.RegisterHelloServer(server, &service) // 将tcp服务于grpc进行绑定 fmt.Println(“server serve…..”) if err := server.Serve(conn); err != nil{ fmt.Println(err) return } }4. 编写客户端脚本package mainimport ( “context” “fmt” grpc “google.golang.org/grpc” proto “grpc_test/proto” //引用grpc代码)const( Address = “127.0.0.1:8801” // 服务监听的端口)func main() { conn, err := grpc.Dial(Address, grpc.WithInsecure()) if err != nil{ fmt.Println(err) } defer conn.Close() client := proto.NewHelloClient(conn) // 自动生成方法, 因为proto文件中service的名字是hello name := “jhonsmith” result, err := client.Hello(context.Background(), &proto.Request{Name:name}) // 调用grpc方法, 对服务端进行通讯 if err != nil{ fmt.Println(err) } fmt.Println(“I see, u see. I say “, name, “u say “, result.Msg)}終わり。