问题标签 [grpc-go]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
395 浏览

go - 从 Golang 中限制 GRPC 应用程序的带宽

我想限制我的 Go 客户端使用的带宽量。有没有办法从 Go 程序内部做到这一点

这很难提供代码示例,但到目前为止我已经看到

  1. 弄乱 IPTables(对于客户端程序来说听起来很复杂) https://unix.stackexchange.com/questions/34116/how-can-i-limit-the-bandwidth-used-by-a-process

  2. Golang 的 GRPC 客户端上的 DialOptions 但似乎没有相关 https://godoc.org/google.golang.org/grpc#DialOption

  3. Wondershaper,但我不希望我的程序使用其他程序来工作

0 投票
1 回答
719 浏览

grpc - 链接多个 gRPC 调用时何时创建 gRPC 客户端

我有一些 gRPC 服务器,并且想链接一些调用,这样流程就会变成这样:

为此,我一直在每次调用服务器 A RPC 时为服务器 B 连接创建一个 gRPC 客户端(如上所示< 1 >)。我在这里发现了一个类似的问题,并且我理解这种方法不适合利用这里讨论的并发性的长期连接。

从以上两个参考资料中我没有完全得到的是什么时候应该创建 gRPC 客户端。如果我要与服务器 B 调用服务器 C 等进一步链接,是否每个服务器都需要在进程开始时生成连接?这是否会引入每个服务器的启动依赖性?

另外,作为基线,我认为使用上下文可以很好地链接,并且仍然可以控制这些远程调用。这是 gPRC 的正确用法吗?

0 投票
1 回答
885 浏览

go - 是否需要通过 gprc 流客户端重新创建新流?

有一个 gRPC 流服务器和客户端。客户端通过 gRPC 双向流拨号到服务器。服务器在 kunbeness docker 上运行。

升级一次 kubeness 服务器后,客户端在尝试向流服务器发送请求时总是收到 EOF 错误。我发现 TCP 连接是活动的。为什么?

我是否需要通过在 go-grpc 中调用“NewStream”API 来重新创建新的 strean?

如果我在拨号到 gRPC 流服务器时设置了 keep-alive 参数,流会自动重新连接还是只是 TCP 连接?

0 投票
2 回答
7003 浏览

go - 如何使用 gracefulStop 关闭所有 grpc 服务器流?

我正在尝试停止从服务器端连接到流服务器的所有客户端。实际上我正在使用GracefulStop方法来优雅地处理它。

我正在等待os.Interrupt通道上的信号为 gRPC 执行正常停止。server.GracefulStop()但是当客户端连接时它会卡住。

我希望contextin 方法ctx.Done()可以处理它并打破 for 循环。如何关闭像这样的所有响应流?

0 投票
0 回答
1152 浏览

performance - 如何在 GRPC 服务器实现中模拟 Grpc 客户端

我有一个与许多其他 GRPC 服务器通信的 GRPC 服务器。因此,我的服务器是许多其他 GRPC 服务器的客户端,我想测试我的服务器实现,但我一直坚持如何模拟 GRPC 客户端。

我有一个来自我的 GRPC 服务器的方法,如下所示:

在这种类型的实现中,我不能模拟 UserServiceClient 因为我在方法中创建了一个:(

我想了两种方法来解决这个问题

  1. UserBackendServer在结构内有客户端引用

有了这个实现,我就有了与客户端保持持续活动连接的副作用(我有 10 个客户端可以与之通信)。生产环境好吗?拥有始终连接的客户端会导致内存泄漏或过多的并发连接吗?

  1. 使用将客户端作为参数的方法

编写所有这些小功能似乎有点麻烦,我无法对服务器功能进行单元测试。

一号战略可行吗?如果连接保持在服务器结构中,您是否有关于限制或如何重试失败连接的经验

0 投票
1 回答
69 浏览

node.js - 为什么 grpc-gateway 没有构建新的端点

当我尝试通过go build -o ./out/grpc-proxy生成代理文件时,代理正在生成而没有在 proto 文件中添加新端点

我使用 node.js (v10.16.3) 和 grpc/go 之后我构建了 grpc-proxy。

通过 protoc 从 *.proto 生成代码到 *.pb.go、*.pb.gw.go、*. swagger.json

然后用sed修补它,然后通过go build -o path 构建

这里一样

0 投票
1 回答
542 浏览

go - 如何在 .proto 文件中正确导入 go 模型

我目前正在使用 protobuf 将我们基于 rest api 的 go 服务迁移到 gRPC。我正在使用互联网上的一些示例,我的 service.proto 文件就像

现在在给定的代码片段中,我们可以看到我们在同一个 .proto 文件中定义了所有请求和响应。

我想在不同的 go 文件中定义这些,以便可以在整个项目中使用它们,例如 - 我有一个名为 CreateRequest.go 的模型文件,我可以以某种方式将其导入到这个 .proto 文件中以及项目的其余部分我也可以使用该 CreateRequest 模型,这样我就不必两次定义相同的模型。

1)有可能做到这一点吗?

2)如果是,那么正确的语法是什么?

我是新手,所以如果这个问题看起来很愚蠢,那就笑一笑然后忘记。

0 投票
1 回答
47 浏览

grpc-go - 什么是 grpc 中的 r.Scheme()+":///test.server" 在所有 grpc 测试用例中的拨号调用

通常我们将服务器地址(例如“localhost:56666”或“someserver:9999”)传递给 grpc-go 的 Dial 方法。

例如:grpc.Dial("localhost:56666", grpc.WithInSecure())

但是在 grpc-go repo 给出的测试用例中(参考下面的链接), Dial 的第一个参数被称为 "*Dial( r.Scheme()+":///test.server" , WithInsecure(), WithTimeout (5*time.Second))*”。当我通过运行这些 go test 文件打印该值时,我观察到该地址值为“ bykrwuxel00s:///test.server

https://github.com/grpc/grpc-go/blob/master/balancer/roundrobin/roundrobin_test.go#L102

https://github.com/grpc/grpc-go/blob/master/clientconn_test.go#L135

这如何作为有效的服务器地址工作?

0 投票
0 回答
219 浏览

go - 根据 API 测试查找 gRPC API 的代码覆盖率

假设

  • API 测试使用 GoLang 编写在同一个 API 代码存储库中
  • API 测试作为 Pull Request CI 构建的一部分运行。
  • API 测试基本上是启动 gRPC 服务器,从基于 golang 的 gRPC 客户端发出请求并验证响应

流动

  1. 开发人员开始为 API 构建新端点
  2. 开发人员不编写任何 API 测试(请注意,我特别提到了 API 测试而不是单元测试)
  3. 开发人员为更改创建一个拉取请求
  4. 拉取请求应确定没有为新更改编写测试并阻止 PR

我的问题

我们如何构建这样的 CI 流程来实现第 4 点?我知道代码覆盖率是一种方法,但我不完全相信这是否是 API 测试的正确方法?

是否可以根据此类 API 测试找到 gRPC 服务的代码覆盖率?如果是,那么如何?

0 投票
0 回答
979 浏览

go - GRPC中错误响应的正确方法?

我试图找出通过 grpc 报告服务器错误的方法。我想要实现的是详细且静态定义的错误,足以告诉客户实际发生了什么。

想象一下我有下一个请求:

然后我试图让错误更详细,因为状态码不会告诉客户错误细节。您可以使用FieldViolation,但它只指定字段,而不是静态方式的错误。您可以Description向这些提供,FieldViolations但客户端需要处理字符串错误并以某种方式将它们映射到内部客户端错误,或者客户端直接显示这些错误,这在某些情况下不起作用,因为业务逻辑可能会根据错误类型而有所不同。

我发明的是:

通过这种方式,您可以让客户端了解与状态代码相结合的特定错误,但它不使用开箱即用的方式FieldViolations,并且看起来像非 grpc 方式来处理错误。

FieldViolations其他解决方案是在's中嵌入带有错误代码(我仍然可以在请求实体中定义)和错误消息的 json Description,但同样,它看起来像非 grpc 方式。

所以,我在grpc中遇到错误,你能告诉我正确的方法吗?

谢谢。