前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >grpc之golang的简单使用

grpc之golang的简单使用

作者头像
黑光技术
修改2020-05-15 11:37:45
3.5K0
修改2020-05-15 11:37:45
举报
文章被收录于专栏:黑光技术黑光技术

点击上方“黑光技术”关注之

完美之道,不在无可增加,而在无可删减!

gRPC是一个高性能、通用的开源RPC框架,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。

1、相关包安装

1)protobuf

在下面的链接下载之后源码安装, https://github.com/google/protobuf 安装过程也比较简单:

代码语言:javascript
复制
./autogen.sh
./configure
./make && make install

就可以安装好。

2)安装protoc的golang插件

设置好gopath之后直接使用下面的命令即可。 我的gopath设置为:/home/helight/gopath/ go get -u github.com/golang/protobuf/protoc-gen-go #golang 插件

3)安装grpc框架

go get -u google.golang.org/grpc google.golang.org/grpc 对应的代码地址在: https://github.com/grpc/grpc-go 由于墙的原因,我们可能需要使用这个命令 go get -u github.com/grpc/grpc-go

4)其它需要依赖的库

golang.org/x/text 对应的代码地址在: https://github.com/golang/text golang.org/x/net/context 对应的代码地址在: https://github.com/golang/net google.golang.org/genproto 对应的代码地址在:github.com/google/go-genproto

以上应该都可以用go get -u 来获取,也是因为墙的原因,我们需要是github的源。

2.定义grpc.proto文件

代码语言:javascript
复制
syntax = "proto3"; //protobuf3协议
package xgrpcd;

//请求
message UserRq {
int32 id = 1;
}

//响应
message UserRp {
string name = 1;
}

//服务
service Data {
rpc GetUser(UserRq) returns (UserRp);
}

然后编译 protoc –go_out=plugins=grpc:. grpc.proto

### 3.server端代码

代码语言:javascript
复制
// grpc project main.go
package main

import (
    "xgrpcd"
    "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()   
    xgrpcd.RegisterDataServer(s, &Data{})
    s.Serve(lis)

    log.Println("grpc server in: %s", port)
}


// 定义方法
func (t *Data) GetUser(ctx context.Context, request *xgrpcd.UserRq) (response *xgrpcd.UserRp, err error) {
    response = &xgrpcd.UserRp{
        Name: strconv.Itoa(int(request.Id)) + ":test",
    }
    return response, err
}

4.client端代码

代码语言:javascript
复制
package main

import (
    "xgrpcd"
    "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, err := grpc.Dial(server + ":" + port,  grpc.WithInsecure())
	 if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    client := xgrpcd.NewDataClient(conn)

    for i := 0; i < int(times); i++ {
        getUser(client)
    }
}

func getUser(client xgrpcd.DataClient) {
    var request xgrpcd.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)
    }
}

5.编译

代码语言:javascript
复制
#!/bin/bash

cd ..
export GOPATH=$GOPATH:<code>pwd</code>
echo $GOPATH
cd -
go build server.go
go build client.go

6.特别注意

1.库文件保存

因为golang.org站点国内被墙,那么相关包下载只能到github上下载,但是下载之后要把它的路径在拷贝成golang.org的路径才可以使用。

2.客户端链接

特别要注意,client.go 下 dial 时,要指定 conn, err := grpc.Dial(address, grpc.WithInsecure()),否则会报异常: did not connect: grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)

看完本文有收获?请分享给更多人

关注「黑光技术」加星标,关注大数据+微服务

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑光技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、相关包安装
    • 1)protobuf
      • 2)安装protoc的golang插件
        • 3)安装grpc框架
          • 4)其它需要依赖的库
          • 2.定义grpc.proto文件
          • 4.client端代码
          • 5.编译
          • 6.特别注意
            • 1.库文件保存
              • 2.客户端链接
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档