分享
  1. 首页
  2. 文章

golang gRPC示例

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

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。
1、普通帐号安装protobuf

unzip protobuf-cpp-3.0.0-alpha-3.zip
cd protobuf-3.0.0-alpha-3/
./configure
make && sudo make install
go get -u github.com/golang/protobuf/protoc-gen-go #golang 插件

2、定义grpc.proto文件

syntax = "proto3"; //protobuf3协议
package inf;
//请求
message UserRq {
 int32 id = 1;
}
//响应
message UserRp {
 string name = 1;
}
//服务
service Data {
 rpc GetUser(UserRq) returns (UserRp);
}

然后编译


cd ~/src/inf
protoc --go_out=plugins=grpc:. grpc.proto

3、get 所引用的包

go get -u google.golang.org/grpc

由于墙的原因,我们一些依赖的包文件可以通过下面方式下载到:
在 github 可以找到源码,下载后复制到对应目录即可的:
google.golang.org/grpc 对应的代码地址在: https://github.com/grpc/grpc-go
google.golang.org/cloud/compute/metadata 对应的代码地址在: https://github.com/GoogleCloudPlatform/gcloud-golang
golang.org/x/oauth2 对应的代码地址在: https://github.com/golang/oauth2
golang.org/x/net/context 对应的代码地址在: https://github.com/golang/net
这些包的源码也可以通过 http://gopm.io/ 或者 http://golangtc.com/download/package 进行下载.

4、服务端代码

// grpc project main.go
package main
import (
 "inf"
 "log"
 "net"
 "runtime"
 "strconv"
 "golang.org/x/net/context"
 "google.golang.org/grpc"
)
const (
 port = "41005"
)
type Data struct{}
func main() {
 runtime.GOMAXPROCS(runtime.NumCPU()) 
 //起服务
 lis, err := net.Listen("tcp", ":"+port) 
 if err != nil {
 log.Fatalf("failed to listen: %v", err)
 }
 s := grpc.NewServer() 
 inf.RegisterDataServer(s, &Data{})
 s.Serve(lis)
 log.Println("grpc server in: %s", port)
}
// 定义方法
func (t *Data) GetUser(ctx context.Context, request *inf.UserRq) (response *inf.UserRp, err error) {
 response = &inf.UserRp{
 Name: strconv.Itoa(int(request.Id)) + ":test",
 }
 return response, err
}

5、客户端代码

package main
import (
 "inf"
 "log"
 "runtime"
 "strconv"
 "strings"
 "sync"
 "time"
 "math/rand"
 "golang.org/x/net/context"
 "google.golang.org/grpc"
)
var (
 wg sync.WaitGroup 
)
const (
 networkType = "tcp"
 server = "127.0.0.1"
 port = "41005"
 parallel = 50 //连接并行度
 times = 100000 //每连接请求次数
)
func main() {
 runtime.GOMAXPROCS(runtime.NumCPU())
 currTime := time.Now()
 //并行请求
 for i := 0; i < int(parallel); i++ {
 wg.Add(1)
 go func() {
 defer wg.Done()
 exe()
 }()
 }
 wg.Wait()
 log.Printf("time taken: %.2f ", time.Now().Sub(currTime).Seconds())
}
func exe() {
 //建立连接
 conn, _ := grpc.Dial(server + ":" + port)
 defer conn.Close()
 client := inf.NewDataClient(conn)
 for i := 0; i < int(times); i++ {
 getUser(client)
 }
}
func getUser(client inf.DataClient) {
 var request inf.UserRq
 r := rand.Intn(parallel)
 request.Id = int32(r)
 response, _ := client.GetUser(context.Background(), &request) //调用远程方法
 //判断返回结果是否正确
 if id, _ := strconv.Atoi(strings.Split(response.Name, ":")[0]); id != r {
 log.Printf("response error %#v", response)
 }
}

引用

http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf
https://github.com/google/protobuf
https://github.com/golang/protobuf
http://studygolang.com/articles/3192


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

本文来自:CSDN博客

感谢作者:dazheng

查看原文:golang gRPC示例

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

关注微信
26326 次点击
被以下专栏收入,发现更多相似内容
1 回复 | 直到 2019年09月26日 15:40:51
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏