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,如下图:
相关推荐
总结,gRPC在Golang开发中的应用涉及到多个方面,包括理解RPC和protobuf的概念,熟悉gRPC-Go库的使用,以及在没有go mod的情况下手动管理依赖。通过正确配置和实现,你可以构建高效、可靠的微服务架构。
5. **流式RPC**:探讨gRPC的双向流和单向流特性,理解它们在实时数据传输和长连接场景中的应用。 6. **安全与认证**:学习如何在gRPC中集成SSL/TLS以确保通信安全,以及如何使用gRPC的认证和授权机制。 7. **负载...
标题 "golang_grpc.zip" 提供的是一个用于搭建 Go 语言环境的 gRPC 工具包,这个包...通过这个 golang_grpc.zip 文件,开发者可以快速入门 gRPC 和 Protobuf 在 Go 中的应用,为构建高效、可靠的微服务架构奠定基础。
总结,通过在gRPC应用中使用中间件拦截器,我们可以实现链接验证、日志记录和重试等高级特性,提高系统的稳定性和可维护性。在Go中,这通常涉及创建自定义的拦截器函数,并在gRPC服务器初始化时注册它们。通过这种...
6. **gRPC在微服务架构中的应用**: - 微服务架构中,gRPC可作为服务间通信的首选,因为它轻量且高效。 - 支持健康检查和负载均衡,适应微服务环境。 7. **gRPC扩展**: - 支持拦截器(Interceptor),用于日志...
最近获得了对Interceptor的支持,即在将请求传递到用户的应用程序逻辑之前在gRPC服务器上执行的,或者在用户调用周围的gRPC客户端上执行的中间件。 这是实现常见模式的理想方法:身份验证,日志记录,消息,验证,重...
中间件gRPC Go最近获得了对Interceptor的支持,即在将请求传递到用户的应用程序逻辑之前在gRPC服务器上执行的中间件,或者在用户调用周围在gRPC客户端上执行的中间件。 这是实现常见模式的理想方法:身份验证,日志...
在IT行业中,Go语言(Golang)以其高效、简洁和并发特性受到了许多开发者的青睐,尤其是在构建网络服务方面。本文将深入探讨如何使用Go来实现一个转发服务,以帮助开发者理解Go语言在网络编程中的应用。 首先,让...
这是golang应用程序示例。 命令列表: 守护程序-主要服务 产品服务-返回产品的服务,gRPC客户端/服务器交互的示例 健康检查服务-需要此服务以显示了解jaeger中发生错误的服务有多方便 迁移-迁移命令 JWT-用于生成...
在Golang应用中集成Jaeger,首先需要引入Jaeger的SDK库,然后初始化Tracer。通常,这包括设置服务名、采样策略、报告方式等。在关键操作点(如函数入口、数据库查询)插入StartSpan和FinishSpan,以便记录执行时间和...
【标题】"TIM golang源代码"所涉及的知识点主要集中在即时通讯(IM)系统的设计与实现,以及Golang这门编程语言的应用上。Golang,由Google开发,以其并发模型、内存安全和高效的编译速度在服务器端编程领域广受欢迎...
总结来说,"Go-golang开发的h5小游戏服务端domo"项目涉及了Go语言的基础知识、游戏服务器架构设计、数据交互、并发处理、错误处理等多个方面的技术要点,是学习和实践Go语言在游戏开发中应用的典型案例。
在Golang应用中,可以通过SDK与OSS服务进行集成,处理文件的上传、下载和删除等操作。 JSON Web Token (JWT) 是一种轻量级的身份认证机制,它将用户信息编码为一个令牌,然后在请求头中传递。JWT包含了用户信息和...
《Go语言后端通用脚手架封装:http、grpc与xorm详解》 在现代软件开发中,为了提高效率和代码复用性,开发者...通过深入学习和实践,开发者可以更好地理解和掌握Go语言在后端开发中的应用,提升项目开发的效率和质量。
拦截器最近获得了对Interceptor的支持,即在请求传递到用户的应用程序逻辑之前由gRPC Server执行的中间件。 这是实现常见模式的理想方法:身份验证,日志记录和...监视。 要在链中使用拦截器,请参阅 。 该库需要Go ...
在这个名为"fullstack-grpc"的项目中,开发者构建了一个包含REST网关和拦截器的gRPC Web应用,并通过Envoy代理进行服务间通信。 首先,gRPC是一个由Google开源的高性能、开源和通用的RPC框架,基于HTTP/2协议设计,...
Go,RabbitMQ和gRPC 微服务 :waving_hand: ...Go-grpc-中间件-拦截器链接,身份验证,日志记录,重试等 Opentracing-go -Go的OpenTracing API Prometheus-go- client-用于Go应用程序的Prometheus工具库
在Golang中构建微服务是现代软件开发中的一个重要实践,特别是在构建可扩展、高可用性和模块化的系统时。本文将深入探讨如何使用Golang来创建一个微服务,并将其应用于培训场景。 首先,让我们理解微服务架构的核心...
3. **序列化和对象模型**:`github.com/golang/protobuf`和`google.golang.org/grpc`用于处理Protocol Buffers(protobuf),这是Kubernetes中广泛使用的序列化格式。`k8s.io/apimachinery`包含Kubernetes API对象的...
本文将深入探讨基于grpc-gateway的综合业务开发框架,并重点关注其在Go语言环境中的应用。 首先,我们需要理解gRPC的核心概念。gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,由Google开发并广泛应用于...