标签: grpc

protoc不生成服务存根文件

我刚开始玩谷歌原型.当我尝试编译proto-java示例中存在的proto文件时,它不会生成任何grpc文件.

proto文件, https://github.com/grpc/grpc-java/blob/master/examples/src/main/proto/hello_world.proto

终端输出,

rsonkhla @ raman-OptiPlex-9020:〜/ sandbox/grpc-java/examples $ protoc --version libprotoc 3.0.0 rsonkhla @ raman-OptiPlex-9020:〜/ sandbox/grpc-java/examples $ protoc --java_out = test/-I ../../ grpc-java/examples ../../grpc-java/examples/src/main/proto/hello_world.proto rsonkhla @ raman-OptiPlex-9020:〜/ sandbox/grpc-java/examples $ ls -R test/test /:io

test/io:grpc

test/io/grpc:示例

test/io/grpc/examples:helloworld

test/io/grpc/examples/helloworld:HelloRequest.java
HelloResponse.java HelloWorldProto.java HelloRequestOrBuilder.java HelloResponseOrBuilder.java

还有其他人遇到过这个问题吗?

protocol-buffers grpc protoc

22
推荐指数
2
解决办法
1万
查看次数

如何在gRPC服务器中添加全局异常拦截器?

在gRPC中,如何添加拦截任何RuntimeException并将有意义的信息传播给客户端的全局异常拦截器?

例如,一个divide方法可能引发ArithmeticException/ by zero消息.在服务器端,我可以写:

@Override
public void divide(DivideRequest request, StreamObserver<DivideResponse> responseObserver) {
  int dom = request.getDenominator();
  int num = request.getNumerator();

  double result = num / dom;
  responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
  responseObserver.onCompleted();
}
Run Code Online (Sandbox Code Playgroud)

如果客户端通过denominator = 0,它将得到:

Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN
Run Code Online (Sandbox Code Playgroud)

并且服务器输出

Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2@62e95ade
java.lang.ArithmeticException: / by zero
Run Code Online (Sandbox Code Playgroud)

客户不知道发生了什么.

如果我想将/ by zero消息传递给客户端,我必须将服务器修改为:(如本问题所述)

  try {
    double result = num / dom;
    responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
    responseObserver.onCompleted();
  } catch (Exception e) {
    logger.error("onError …
Run Code Online (Sandbox Code Playgroud)

java protocol-buffers grpc grpc-java

21
推荐指数
2
解决办法
8477
查看次数

用于gRPC中丰富错误处理的模式

使用gRPC向客户端发送有关错误的更多详细信息的模式是什么?

例如,假设我有一个用于注册用户的表单,用于发送消息

message RegisterUser {
  string email = 1;
  string password = 2;
}
Run Code Online (Sandbox Code Playgroud)

电子邮件必须格式正确且唯一,密码长度必须至少为8个字符.

如果我正在编写JSON API,我将使用以下正文返回400错误:

{
  "errors": [{
    "field": "email",
    "message": "Email does not have proper format."
   }, {
     "field": "password",
     "message": "Password must be at least 8 characters."
   }],
}
Run Code Online (Sandbox Code Playgroud)

并且客户端可以向用户提供好的错误消息(即通过突出显示密码字段并特别告诉用户他们输入的内容有问题).

有了gRPC有没有办法做类似的事情?似乎在大多数客户端语言中,错误会导致抛出异常,无法获取响应.

例如,我喜欢类似的东西

message ValidationError {
  string field = 1;
  string message = 2;
}

message RegisterUserResponse {
  repeated ValidationError validation_errors = 1;
  ...
}
Run Code Online (Sandbox Code Playgroud)

或类似的.

grpc

20
推荐指数
2
解决办法
8311
查看次数

将 gRPC 服务绑定到 aspnetcore 中的特定端口

使用aspnetcore 3.1nugetGrpc.AspNetCore包,我成功地使 gRPC 服务与标准 asp.net 控制器一起成功运行,如本教程中所述。

不过,我想将 gRPC 服务绑定到特定端口(例如 5001),如果可能的话最好通过配置而不是代码。这是因为我想限制 gRPC 服务的公开方式。

我最接近的是RequireHost在映射端点时使用的:

// Startup.cs
public void Configure(IApplicationBuilder app)
{
    // ...
    
    app.useEndpoints(endpoints => 
    {
        endpoints.MapGrpcService<MyService>()
            .RequireHost("0.0.0.0:5001");
    }); 
}
Run Code Online (Sandbox Code Playgroud)

这似乎符合我的要求,但我找不到任何有关它的文档,并且它需要在每个服务的代码中进行配置。也许有更好的方法?

.net c# .net-core grpc asp.net-core

20
推荐指数
4
解决办法
2万
查看次数

为什么Google.Pubsub.V1 beta01不适用于dotnet cli项目?

我创建了一个非常简单的程序,该程序应该列出Google Cloud项目中可用的主题.代码很简单:

using System;
using Google.Pubsub.V1;

public class Test
{
    static void Main()
    {
        var projectId = "(fill in project ID here...)";
        var projectName = PublisherClient.FormatProjectName(projectId);
        var client = PublisherClient.Create();
        foreach (var topic in client.ListTopics(projectName))
        {
            Console.WriteLine(topic.Name);
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

当我从针对.NET 4.5的"常规"msbuild项目运行它时,它工作正常.当我尝试将dotnet cli(1.0.0-preview2-003121)与以下project.json文件一起使用时:

{
  "buildOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "Google.Pubsub.V1": "1.0.0-beta01"
  },
  "frameworks": {
    "net45": { }
  }
}
Run Code Online (Sandbox Code Playgroud)

......我看到一个例外:

Unhandled Exception: System.IO.FileNotFoundException: Error loading native library.
Not found in any of the possible locations c:\[...]\Pubsub.Demo\bin\Debug\net45\win7-x64\nativelibs\windows_x64\grpc_csharp_ext.dll …
Run Code Online (Sandbox Code Playgroud)

c# google-cloud-platform grpc dotnet-cli

19
推荐指数
1
解决办法
1277
查看次数

Python 无法连接到 grpc 通道 -&gt;“无法连接到所有地址”“grpc_status”:14

尝试调用存根方法时出现以下错误。知道是什么原因造成的吗?

[bolt.api.handlers] 2019-08-21 20:07:57,792 ERROR handlers:1066: 'ResourceHandler' object has no attribute 'ontology_service_handler'
Traceback (most recent call last):
  File "/bolt-webserver/bolt/api/onse/onse_handlers/ontology_service.py", line 17, in post
    ontology_id = await self.onse_stub.createOntology()
  File "/bolt-webserver/bolt/api/onse/onse_stub.py", line 41, in createOntology
    return self.stub.CreateOntology(ontology_messages_pb2.Ontology())
  File "/usr/local/lib/python3.6/site-packages/grpc/_channel.py", line 565, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/usr/local/lib/python3.6/site-packages/grpc/_channel.py", line 467, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
        status = StatusCode.UNAVAILABLE
        details = "failed to connect to all addresses"
        debug_error_string = "{"created":"@1566418077.791002345","description":"Failed to pick …
Run Code Online (Sandbox Code Playgroud)

python grpc grpc-python

19
推荐指数
2
解决办法
2万
查看次数

gRPC 队列是如何管理的?gRPC 队列有大小限制吗?

我试图了解 gRPC 队列的管理方式以及 gRPC 队列大小是否有任何大小限制。

根据此,帖子请求已排队:

如果您的服务器已经同时处理了maximum_concurrent_rpcs个请求,并且又收到另一个请求,则该请求将立即被拒绝。

如果ThreadPoolExecutor的max_workers小于maximum_concurrent_rpcs,那么在所有线程都忙于处理请求后,下一个请求将排队,并在线程完成处理时处理。

根据此 GitHub 帖子,队列由 gRPC 服务器管理:

因此,maximum_concurrent_rpcs 为您提供了一种方法来设置服务器队列中等待线程服务的 RPC 数量的上限。

微软的这篇文章让我很困惑,它说请求在客户端排队:

当活动呼叫数量达到连接流限制时,其他呼叫将在客户端中排队。排队的呼叫等待活动呼叫完成后再发送。

但请注意,微软在这里谈论的是连接流限制。当达到该限制时,客户端上会形成一个队列。

有两种类型的队列吗?一个是在满足某些限制时在服务器(gRPC 队列)上创建的(如上所述),另一个是在达到此连接流限制时在客户端上创建的。

gRPC 队列的大小限制是多少?我的意思是,它仅受底层硬件(RAM)的限制?

我们是否有可能因为队列大小过大而导致服务器失败?是否可以限制此队列大小?

如果我们谈论的是 2 个不同的队列,我们​​是否也可以管理和限制客户端上的队列?

我对python的观点特别感兴趣。

谢谢!

PS 我假设当人们谈论 gRPC 队列时,他们谈论的是在服务器上创建的队列。

grpc grpc-python

18
推荐指数
0
解决办法
4108
查看次数

导入“google/api/annotations.proto”未找到或有错误。如何将其添加为依赖项?

按照有关如何设置 gRPC 网关的文档,我发现自己陷入了生成 grpc 网关的第四步。

也就是说,当添加以下行时,事情就会崩溃:

import "google/api/annotations.proto";
Run Code Online (Sandbox Code Playgroud)

该文档说了You will need to provide the required third party protobuf files to the protoc compiler- 但实际上并没有说明如何做到这一点。

如何添加google/api/annotations.proto为依赖项?

go protocol-buffers grpc

18
推荐指数
2
解决办法
5万
查看次数

gRPC +图片上传

我想创建一个简单的gRPC端点,用户可以上传他/她的图片.协议缓冲区声明如下:

message UploadImageRequest {
    AuthToken auth = 1;
    // An enum with either JPG or PNG
    FileType image_format = 2;
    // Image file as bytes
    bytes image = 3;
}
Run Code Online (Sandbox Code Playgroud)

无论gRPC文档中的警告如何,这种上传图片(和接收图片)的方法仍然可以吗?

如果没有,使用标准表格上传图片并存储图像文件位置是更好的方法(标准)吗?

protocol-buffers grpc

17
推荐指数
2
解决办法
2万
查看次数

gRPC客户端负载均衡

我正在使用gRPC和Python作为kubernetes pods中的客户端/服务器......我希望能够启动多个相同类型的pod(gRPC服务器)并让客户端(随机)连接它们.

我发送了10个服务器的pod并设置了一个"服务"来定位它们.然后,在客户端,我连接到服务的DNS名称 - 意味着kubernetes应该进行负载平衡并将我引导到随机服务器pod.实际上,客户端调用gRPC函数(效果很好)但是当我查看日志时,我看到所有调用都转到同一个服务器pod.

我假设客户端正在进行某种DNS缓存,这导致所有调用都被发送到同一服务器.是这样的吗?无论如何要禁用它并设置相同的存根客户端进行"新"呼叫并通过DNS每次呼叫获取新的IP?

我知道如果它每次都会查询DNS服务器,我可能会产生的开销,但是分配负载对我来说更重要.

编辑

可能不是缓存问题......可能只是gRPC的工作方式.HTTP/2和持久可重用连接.每次通话后有什么方法可以"断开"?

python dns http kubernetes grpc

17
推荐指数
2
解决办法
5308
查看次数