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 Go最近获得了对Interceptor的支持,即在将请求传递到用户的应用程序逻辑之前在gRPC服务器上执行的中间件,或者在用户调用周围在gRPC客户端上执行的中间件。 这是实现常见模式的理想方法:身份验证,日志...
最近获得了对Interceptor的支持,即在将请求传递到用户的应用程序逻辑之前在gRPC服务器上执行的,或者在用户调用周围的gRPC客户端上执行的中间件。 这是实现常见模式的理想方法:身份验证,日志记录,消息,验证,重...
这是golang应用程序示例。 命令列表: 守护程序-主要服务 产品服务-返回产品的服务,gRPC客户端/服务器交互的示例 健康检查服务-需要此服务以显示了解jaeger中发生错误的服务有多方便 迁移-迁移命令 JWT-用于生成...
拦截器最近获得了对Interceptor的支持,即在请求传递到用户的应用程序逻辑之前由gRPC Server执行的中间件。 这是实现常见模式的理想方法:身份验证,日志记录和...监视。 要在链中使用拦截器,请参阅 。 该库需要Go ...
Go,RabbitMQ和gRPC 微服务 :waving_hand: ...Go-grpc-中间件-拦截器链接,身份验证,日志记录,重试等 Opentracing-go -Go的OpenTracing API Prometheus-go- client-用于Go应用程序的Prometheus工具库
Zepto是用于在golang中开发微服务和Web服务的轻量级框架。 作为一个自以为是的框架,zepto提出了一种快速的设置,并且最需要开发现代微服务。 但不仅如此。 它是为开发完整的Web应用程序而准备的框架。 请参阅以下...
主要用于使用gRPC进行应用程序开发。 (ascii-art由生成) 建立 $ make build # startup server (default port 3000) $ ./bin/server # startup client (default port 3000) $ ./bin/client 如果要更改端口,则...
堆栈跟踪错误代码(表示HTTP / gRPC状态代码) 可报告性(与错误报告服务集成) 附加信息(标签和参数)为什么由于Golang中的error类型只是方法的接口,因此它根本没有堆栈跟踪。 而且这些错误很可能会在函数之间...
Mortar对配置,应用程序指标,日志记录,跟踪,概要分析,依赖项注入等提供了开箱即用的支持。虽然它具有预定义的默认值,但Mortar可以让您完全控制它以完全自定义它。 演示版 克隆此存储库并。 完成后,请在阅读或...
GRPC 数据库迁移 环境变量 智威汤逊 电子邮件API 计时器 记录仪 终端GUI 构建第一个可扩展的Web服务 使用以下内容创建routing.go : package main import ( "fmt" "net/http" "github....
该存储库包含我在自己的Go项目中使用的HTTP中间件。 也可以随意使用它们! Compressor:如果客户端支持,则将gzip压缩应用于响应主体。 记录器:记录HTTP请求,包括:远程用户,远程IP,延迟,请求ID,txbytes,...
leetcode题库 ...LeetCode:记录了Golang写的LeetCode每日一题 Container:一些容器类,目前只有栈和队列 lang 语言基础 CatchError 错误处理 defer recover panic error FunctionalProgramme 函数式编程 grpc
投资者 在上管理股票资产的帮助工具。 我想跟踪有关我的投资组合的数据比应用程序中的数据多,所以我决定制作自己的跟踪器。... 将投资组合历史记录存储在数据库中 使用作为用户界面 创建一个带有项目描