`

grpc在golang中的应用记录

阅读更多

1.安装protobuf,这玩意是个跨多种编程语言的序列号反序列化的东西,也负责数据传输,用的是http2,效率比spring cloud的restful 调用要高得多

 

https://github.com/protocolbuffers/protobuf/releases

 

里面有细分多种编程语言的版本,建议直接下载all的那个使用,我下载的是protobuf-all-3.7.0-rc-3.zip
下载后将bin\protoc.exe解压缩出来,放到PATH搜索路径能找到的地方,比如放到c:\windows目录里面

 

2.下载golang开发grpc需要用到的东西

 

  • go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
  • go get -u google.golang.org/grpc

因为网的原因,我是从别的地方下载回来的,后续通过go install github.com/golang/protobuf/protoc-gen-go来编译生成protoc-gen-go.exe并自动安装到%GOPATH%\bin里面的

 

3.编写.proto rpc接口声明文件

 

syntax = "proto3";  //protobuf3协议
package proto;

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

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

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

将以上内容存盘为HelloWorld.proto文件以后,通过执行以下命令生成.go文件

 

protoc --go_out=plugins=grpc:. HelloWorld.proto

以下为生成的结果,生成出来一个HelloWorld.pb.go文件,如下图

 

,然后编写grpc的server端代码,如下

 

package main

import (
   "golang.org/x/net/context"
   "google.golang.org/grpc"
   "log"
   "motorway/proto"
   "net"
   "runtime"
   "strconv"
)

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()
   proto.RegisterDataServer(s, &Data{})
   log.Printf("grpc server in: %s", port)
   s.Serve(lis)
   
}

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

 

 

 

然后是编写调用的客户端程序代码,如下:

 

 

package main

import (
   "fmt"
   "motorway/proto"
   "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      = "172.0.16.105"//"127.0.0.1"
port        = "41005"
parallel    = 5        //连接并行度
times       = 10    //每连接请求次数
)

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 s ", time.Now().Sub(currTime).Seconds())
}

func exe() {
   //建立连接
conn, err := grpc.Dial(server + ":" + port,grpc.WithInsecure())
   if nil!=conn{
      defer conn.Close()
   }

   if (nil!=err){
      fmt.Printf("创建连接失败!%s\n",err)
      return
}
   client := proto.NewDataClient(conn)

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

func getUser(client proto.DataClient) {
   var request proto.UserRq
   r := rand.Intn(parallel)
   request.Id = int32(r)

   response, _ := client.GetUser(context.Background(), &request) //调用远程方法
id, err:= strconv.Atoi(strings.Split(response.Name, ":")[0]);
   if err!=nil{
      fmt.Printf("error %s \n",err)
      return
}
   //判断返回结果是否正确
if  id != r {
      log.Printf("response error  %#v", response)
   }

}

 

实地在外地出差的网络环境下,通过v那个p那个n连接单位的机器做grpc远程调用,500次调用在1s左右,瓶颈应该在网络方面,再尝试多调用几次v那个p那个n就断掉了,本机调用本机5万次耗时3.84s,如下图:

 



 

 

  • 大小: 4.4 KB
  • 大小: 27 KB
分享到:
评论

相关推荐

    Golang gRPC中间件:拦截器链接,身份验证,日志记录,重试等。-Golang开发

    中间件gRPC Go最近获得了对Interceptor的支持,即在将请求传递到用户的应用程序逻辑之前在gRPC服务器上执行的中间件,或者在用户调用周围在gRPC客户端上执行的中间件。 这是实现常见模式的理想方法:身份验证,日志...

    go-grpc-middleware:Golang gRPC中间件:拦截器链接,身份验证,日志记录,重试等

    最近获得了对Interceptor的支持,即在将请求传递到用户的应用程序逻辑之前在gRPC服务器上执行的,或者在用户调用周围的gRPC客户端上执行的中间件。 这是实现常见模式的理想方法:身份验证,日志记录,消息,验证,重...

    golang-example-app:应用范例

    这是golang应用程序示例。 命令列表: 守护程序-主要服务 产品服务-返回产品的服务,gRPC客户端/服务器交互的示例 健康检查服务-需要此服务以显示了解jaeger中发生错误的服务有多方便 迁移-迁移命令 JWT-用于生成...

    go-grpc-prometheus:对gRPC Go服务器的Prometheus监视

    拦截器最近获得了对Interceptor的支持,即在请求传递到用户的应用程序逻辑之前由gRPC Server执行的中间件。 这是实现常见模式的理想方法:身份验证,日志记录和...监视。 要在链中使用拦截器,请参阅 。 该库需要Go ...

    Go-gRPC-RabbitMQ-microservice:转到gRPC RabbitMQ电子邮件微服务

    Go,RabbitMQ和gRPC 微服务 :waving_hand: ...Go-grpc-中间件-拦截器链接,身份验证,日志记录,重试等 Opentracing-go -Go的OpenTracing API Prometheus-go- client-用于Go应用程序的Prometheus工具库

    zepto::high_voltage:golang中用于微服务和Web服务的轻量级框架

    Zepto是用于在golang中开发微服务和Web服务的轻量级框架。 作为一个自以为是的框架,zepto提出了一种快速的设置,并且最需要开发现代微服务。 但不仅如此。 它是为开发完整的Web应用程序而准备的框架。 请参阅以下...

    testing-grpc:go-grpc服务器,用于启动的客户端

    主要用于使用gRPC进行应用程序开发。 (ascii-art由生成) 建立 $ make build # startup server (default port 3000) $ ./bin/server # startup client (default port 3000) $ ./bin/client 如果要更改端口,则...

    失败:专门为Web应用程序服务器设计的更好的错误处理解决方案

    堆栈跟踪错误代码(表示HTTP / gRPC状态代码) 可报告性(与错误报告服务集成) 附加信息(标签和参数)为什么由于Golang中的error类型只是方法的接口,因此它根本没有堆栈跟踪。 而且这些错误很可能会在函数之间...

    mortar:Mortar是用于构建gRPC(和REST)Web服务的GO框架库

    Mortar对配置,应用程序指标,日志记录,跟踪,概要分析,依赖项注入等提供了开箱即用的支持。虽然它具有预定义的默认值,但Mortar可以让您完全控制它以完全自定义它。 演示版 克隆此存储库并。 完成后,请在阅读或...

    应用:微服务和命令行工具的可重用框架

    GRPC 数据库迁移 环境变量 智威汤逊 电子邮件API 计时器 记录仪 终端GUI 构建第一个可扩展的Web服务 使用以下内容创建routing.go : package main import ( "fmt" "net/http" "github....

    handlers:我在项目中使用的Go的HTTP处理程序

    该存储库包含我在自己的Go项目中使用的HTTP中间件。 也可以随意使用它们! Compressor:如果客户端支持,则将gzip压缩应用于响应主体。 记录器:记录HTTP请求,包括:远程用户,远程IP,延迟,请求ID,txbytes,...

    leetcode题库-GoPractice:去练习

    leetcode题库 ...LeetCode:记录了Golang写的LeetCode每日一题 Container:一些容器类,目前只有栈和队列 lang 语言基础 CatchError 错误处理 defer recover panic error FunctionalProgramme 函数式编程 grpc

    投资者:用于管理股票资产的辅助工具

    投资者 在上管理股票资产的帮助工具。 我想跟踪有关我的投资组合的数据比应用程序中的数据多,所以我决定制作自己的跟踪器。... 将投资组合历史记录存储在数据库中 使用作为用户界面 创建一个带有项目描

Global site tag (gtag.js) - Google Analytics