`

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
分享到:
评论

相关推荐

    grpc在golang开发中所需要的依赖包

    总结,gRPC在Golang开发中的应用涉及到多个方面,包括理解RPC和protobuf的概念,熟悉gRPC-Go库的使用,以及在没有go mod的情况下手动管理依赖。通过正确配置和实现,你可以构建高效、可靠的微服务架构。

    -gRPC-Golang-Master-Class-Build-Modern-API-and-Microservices:gRPC [Golang]大师班

    5. **流式RPC**:探讨gRPC的双向流和单向流特性,理解它们在实时数据传输和长连接场景中的应用。 6. **安全与认证**:学习如何在gRPC中集成SSL/TLS以确保通信安全,以及如何使用gRPC的认证和授权机制。 7. **负载...

    golang_grpc.zip

    标题 "golang_grpc.zip" 提供的是一个用于搭建 Go 语言环境的 gRPC 工具包,这个包...通过这个 golang_grpc.zip 文件,开发者可以快速入门 gRPC 和 Protobuf 在 Go 中的应用,为构建高效、可靠的微服务架构奠定基础。

    Go-GolanggRPC中间件拦截器链接验证日志记录重试等

    总结,通过在gRPC应用中使用中间件拦截器,我们可以实现链接验证、日志记录和重试等高级特性,提高系统的稳定性和可维护性。在Go中,这通常涉及创建自定义的拦截器函数,并在gRPC服务器初始化时注册它们。通过这种...

    gRPC_1.34.zip

    6. **gRPC在微服务架构中的应用**: - 微服务架构中,gRPC可作为服务间通信的首选,因为它轻量且高效。 - 支持健康检查和负载均衡,适应微服务环境。 7. **gRPC扩展**: - 支持拦截器(Interceptor),用于日志...

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

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

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

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

    Go-Golang实现转发服务

    在IT行业中,Go语言(Golang)以其高效、简洁和并发特性受到了许多开发者的青睐,尤其是在构建网络服务方面。本文将深入探讨如何使用Go来实现一个转发服务,以帮助开发者理解Go语言在网络编程中的应用。 首先,让...

    golang-example-app:应用范例

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

    golang分布式链路追踪系统-jaeger

    在Golang应用中集成Jaeger,首先需要引入Jaeger的SDK库,然后初始化Tracer。通常,这包括设置服务名、采样策略、报告方式等。在关键操作点(如函数入口、数据库查询)插入StartSpan和FinishSpan,以便记录执行时间和...

    TIM golang源代码

    【标题】"TIM golang源代码"所涉及的知识点主要集中在即时通讯(IM)系统的设计与实现,以及Golang这门编程语言的应用上。Golang,由Google开发,以其并发模型、内存安全和高效的编译速度在服务器端编程领域广受欢迎...

    Go-golang开发的h5小游戏服务端domo

    总结来说,"Go-golang开发的h5小游戏服务端domo"项目涉及了Go语言的基础知识、游戏服务器架构设计、数据交互、并发处理、错误处理等多个方面的技术要点,是学习和实践Go语言在游戏开发中应用的典型案例。

    使用grpc+gin+gorm+oss等构建的简易版抖音后端

    在Golang应用中,可以通过SDK与OSS服务进行集成,处理文件的上传、下载和删除等操作。 JSON Web Token (JWT) 是一种轻量级的身份认证机制,它将用户信息编码为一个令牌,然后在请求头中传递。JWT包含了用户信息和...

    Go-一个golang的后端通用脚手架封装httpgrpcxorm

    《Go语言后端通用脚手架封装:http、grpc与xorm详解》 在现代软件开发中,为了提高效率和代码复用性,开发者...通过深入学习和实践,开发者可以更好地理解和掌握Go语言在后端开发中的应用,提升项目开发的效率和质量。

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

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

    fullstack-grpc:带有REST网关和拦截器的gRPC Web以及带有envoy代理的示例Web应用程序

    在这个名为"fullstack-grpc"的项目中,开发者构建了一个包含REST网关和拦截器的gRPC Web应用,并通过Envoy代理进行服务间通信。 首先,gRPC是一个由Google开源的高性能、开源和通用的RPC框架,基于HTTP/2协议设计,...

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

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

    go-microservice:在Golang中创建用于培训目的的微服务

    在Golang中构建微服务是现代软件开发中的一个重要实践,特别是在构建可扩展、高可用性和模块化的系统时。本文将深入探讨如何使用Golang来创建一个微服务,并将其应用于培训场景。 首先,让我们理解微服务架构的核心...

    k8s 依赖的golang pkg包

    3. **序列化和对象模型**:`github.com/golang/protobuf`和`google.golang.org/grpc`用于处理Protocol Buffers(protobuf),这是Kubernetes中广泛使用的序列化格式。`k8s.io/apimachinery`包含Kubernetes API对象的...

    vv:基于grpc-gateway的综合业务开发框架

    本文将深入探讨基于grpc-gateway的综合业务开发框架,并重点关注其在Go语言环境中的应用。 首先,我们需要理解gRPC的核心概念。gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,由Google开发并广泛应用于...

Global site tag (gtag.js) - Google Analytics