Golang RPC 之 gRPC

谢烟客 · · 1716 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

gRPC 简介:

gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等)。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

安装:

  1. gRPC 的安装

    $ go get -u google.golang.org/grpc

  2. 因为 gRPC 是基于 protobuf 实现的接口序列化,所以也要安装 protobuf: 安装及简介教程

实践:

下面我们使用 gRPC 定义一个接口,该接口实现对传入的数据进行大写的格式化处理。

  1. 创建项目 golang Demo 工程:


    Paste_Image.png
    1. client目录下的 main.go 实现了客户端用于发送数据并打印接收到 server 端处理后的数据
    2. server 目录下的 main.go 实现了服务端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端
    3. example 包用户编写 proto 文件并生成 data 接口
  2. 定义 gRPC 接口:

    syntax = "proto3";
    package example;
    service FormatData {
     rpc DoFormat(Data) returns (Data){}
    }
    message Data {
     string text = 1;
    }
  3. 实现 server 端

    package main
    import (
     "Demo/example"
     "net"
     "google.golang.org/grpc"
     "google.golang.org/grpc/reflection"
     "golang.org/x/net/context"
     "strings"
     "log"
    )
    // 定义监听地址
    const (
     HOST string = "localhost"
     PORT string = "8080"
    )
    // 定义接口
    type FormatData struct{}
    func (fd *FormatData) DoFormat(ctx context.Context, in *example.Data) (out *example.Data, err error) {
     str := in.Text
     out = &example.Data{Text: strings.ToUpper(str)}
     return out, nil
    }
    // 直接在 main 方法中注册接口
    func main() {
     listener, err := net.Listen("tcp", HOST+":"+PORT)
     if err != nil {
         log.Fatalln("faile listen at: " + HOST + ":" + PORT)
     } else {
         log.Println("Demo server is listening at: " + HOST + ":" + PORT)
     }
     rpcServer := grpc.NewServer()
     example.RegisterFormatDataServer(rpcServer, &FormatData{})
     reflection.Register(rpcServer)
     if err = rpcServer.Serve(listener); err != nil {
         log.Fatalln("faile serve at: " + HOST + ":" + PORT)
     }
    }
  4. 实现 client 端:
    package main
    import (
     "google.golang.org/grpc"
     "log"
     "Demo/example"
     "golang.org/x/net/context"
    )
    // 定义请求地址
    const (
     ADDRESS string = "localhost:8080"
    )
    // main 方法实现对 gRPC 接口的请求
    func main() {
     conn, err := grpc.Dial(ADDRESS, grpc.WithInsecure())
     if err != nil {
         log.Fatalln("Can't connect: " + ADDRESS)
     }
     defer conn.Close()
     client := example.NewFormatDataClient(conn)
     resp,err := client.DoFormat(context.Background(), &example.Data{Text:"hello,world!"})
     if err != nil {
         log.Fatalln("Do Format error:" + err.Error())
     }
     log.Println(resp.Text)
    }
  5. 执行验证结果:
    1. 先启动 server,之后再执行 client
    2. client 侧控制台如果打印的结果为: HELLO,WORLD! ,证明 gRPC 接口定义成功

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:谢烟客

查看原文:Golang RPC 之 gRPC

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1716 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传