标签: grpc-java

在服务器拦截器中应答 gRPC 调用

我想验证调用并可能在服务器拦截器中回答错误。有办法做到吗?如果是的话我怎样才能实现它?

grpc grpc-java

4
推荐指数
1
解决办法
1999
查看次数

映射字段中的键不能是浮点/双精度、字节或​​消息类型

我们正计划将我们现有的服务迁移到 grpc 服务。所以需要将服务转换为原型定义的消息类型。在响应中,我们以自定义对象为键进行映射。

例如回应:

 //java
 Map<key_object, Project>

//proto
map<key_object_not_supported, Project> projects = 3;
Run Code Online (Sandbox Code Playgroud)

在官方文档中,他们提到,

其中 key_type 可以是任何整数或字符串类型(因此,除了浮点类型和字节之外,任何标量类型)。value_type 可以是任何类型

是否有其他方法可以在 proto3 中实现自定义对象键映射?

proto grpc proto3 grpc-java

4
推荐指数
1
解决办法
2491
查看次数

gRPC 服务器可以立即回收 DEADLINE_EXCEEDED 线程吗?

是否可以这样说 - java gRPC 服务器线程即使在 DEADLINE 时间之后仍然会运行。但是,自从超过截止时间以来,gRPC 服务器只会停止/阻止该线程进行任何后续 gRPC 调用吗?

如果上述说法正确,那么有没有办法停止/阻止线程进行任何 Redis/DB 调用以及超过 DEADLINE 时间的线程?或者一旦超过 DEADLINE 时间,立即中断线程?

java multithreading threadpool grpc grpc-java

4
推荐指数
1
解决办法
2011
查看次数

onComplete/onCancel 是否保证用 grpc 调用?

我应该在 grpc 服务器处理的每个调用的开始和结束时执行一些代码。

我使用 ServerCall.Listener:

  • 调用开始时执行的代码位于侦听器的构造函数中
  • 调用结束时执行的代码由 onComplete 和 onCancel 触发
  • 实例化侦听器的线程必须是调用 onComplete / onCancel 的线程(我们使用线程局部变量)

侦听器由注册到我的服务器的拦截器实例化。

但有一个问题:有时,即使侦听器已实例化,也不会调用 onComplete 或 onCancel。

为了完全准确,如果实例化侦听器的线程之外的另一个线程正在调用 onComplete / onCancel,也可能会触发该问题。

这些情况之一应该发生吗?我正在使用 grpc-netty 版本 1.6.1。

谢谢你的帮助 !

grpc grpc-java

4
推荐指数
1
解决办法
1698
查看次数

grpc 记录器级别

我有一个应用程序(Java),它严重依赖 grpc 在不同的微服务之间进行通信。问题在于,在云环境中,调用服务通常无法到达其目标服务。为了解决我们的问题,我们希望从 grpc 获得更好的调试信息。

目前,我们从 grpc 获得非常粗略的日志信息,并且我们希望看到套接字级别的日志信息(例如“与套接字 x 交谈......”)。我们如何更改 grpc 的记录器级别?在整个系统中,我们使用slf4j进行日志记录,并且我们的 netty-logging.properties 的日志记录级别为INFO。

什么样的水平才算是好的水平呢?(我们正在考虑TRACE)我们应该以编程方式更改每个 grpc 调用的级别还是在配置文件中更改级别?(这个文件会是什么样子?)

logging slf4j netty grpc-java

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

Maven 和 java:如何从测试目录中的 protobuf 文件生成代码?

我的问题与this问题非常相似,但是针对maven和java。

我正在测试 grpc,并想将一个简单的 helloworld.proto 放入 test/proto 文件夹中。

但是该文件不会生成 java 文件(与 /src/main/proto 中的 proto 文件不同)。

所以我的问题是如何在测试文件夹中生成 proto 代码?

java protocol-buffers maven grpc grpc-java

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

Docker - java netty_tcnative 问题

我正在尝试对 4 个服务进行 dockerize,但其中一项服务出现问题。具体地,该服务实现为Spring Boot服务并使用Google Vision API。当构建图像并启动容器时,一切正常,直到到达使用 google Vision API 代码的部分。然后,在运行容器时出现以下运行时错误:

netty-tcnative unavailable (this may be normal)
java.lang.IllegalArgumentException: Failed to load any of the given libraries: [netty_tcnative_linux_x86_64, netty_tcnative_linux_x86_64_fedora, netty_tcnative_x86_64, netty_tcnative]
at io.grpc.netty.shaded.io.netty.util.internal.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:104) ~[grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.netty.shaded.io.netty.handler.ssl.OpenSsl.loadTcNative(OpenSsl.java:526) ~[grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.netty.shaded.io.netty.handler.ssl.OpenSsl.<clinit>(OpenSsl.java:93) ~[grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts.defaultSslProvider(GrpcSslContexts.java:244) [grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:171) [grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts.forClient(GrpcSslContexts.java:120) [grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder.buildTransportFactory(NettyChannelBuilder.java:385) [grpc-netty-shaded-1.18.0.jar!/:1.18.0]
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:435) [grpc-core-1.18.0.jar!/:1.18.0]
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createSingleChannel(InstantiatingGrpcChannelProvider.java:223) [gax-grpc-1.42.0.jar!/:1.42.0]
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.createChannel(InstantiatingGrpcChannelProvider.java:164) [gax-grpc-1.42.0.jar!/:1.42.0]
at com.google.api.gax.grpc.InstantiatingGrpcChannelProvider.getTransportChannel(InstantiatingGrpcChannelProvider.java:156) [gax-grpc-1.42.0.jar!/:1.42.0]
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:157) [gax-1.42.0.jar!/:1.42.0]
at com.google.cloud.vision.v1.stub.GrpcImageAnnotatorStub.create(GrpcImageAnnotatorStub.java:84) [google-cloud-vision-1.66.0.jar!/:1.66.0]
at com.google.cloud.vision.v1.stub.ImageAnnotatorStubSettings.createStub(ImageAnnotatorStubSettings.java:120) [google-cloud-vision-1.66.0.jar!/:1.66.0]
at com.google.cloud.vision.v1.ImageAnnotatorClient.<init>(ImageAnnotatorClient.java:136) [google-cloud-vision-1.66.0.jar!/:na]
at com.google.cloud.vision.v1.ImageAnnotatorClient.create(ImageAnnotatorClient.java:117) [google-cloud-vision-1.66.0.jar!/:na]
at com.google.cloud.vision.v1.ImageAnnotatorClient.create(ImageAnnotatorClient.java:108) …
Run Code Online (Sandbox Code Playgroud)

netty docker spring-boot docker-compose grpc-java

4
推荐指数
1
解决办法
4271
查看次数

如何连接到gRPC C++ InProcessChannel而不是从C++?

我正在尝试使用gRPC 作为 JNI 替代方案,其想法是在 C++ 端提供 gRPC 服务,并在 Java/Android 端连接客户端。为了获得最佳性能,我更愿意使用进程内通道(欢迎您的建议)。

我如何连接到 C++ gRPC 服务器InProcessChannel()?问题是我需要传递JavanameInProcessServerBuilder.

在 C++ gRPC 测试中(例如,此处),我找不到它的设置,这让我认为InProcessChannel只能在纯 C++ 中使用(服务器和客户端都在 C++ 中)。C++服务和Java客户端还可以吗?

附言。我能够为 Java 服务器 + Java 客户端做到这一点。

聚苯硫醚。我发现了几个类似的 QnAs,例如。在这里,但我想知道是否还有办法让它协同工作(可能与一些第三方渠道实现)。它可以通过 Unix 域套接字工作吗?

grpc grpc-java grpc-c++

4
推荐指数
1
解决办法
2082
查看次数

即使客户端断开连接,Grpc Server也会继续处理数据

我有一个服务器,该服务器为给定请求传输数据,以下是执行该功能的方法

@Override
public void getChangeFeed(ChangeFeedRequest request, StreamObserver<ChangeFeedResponse> responseObserver) {
    long queryDate = request.getFromDate();
    long offset = request.getPageNo();
    ChangeFeedResponse changeFeedResponse =  processData(responseObserver, queryDate, offset);

    while(true){
        if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
            responseObserver.onNext(changeFeedResponse);
           changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
        }else{
            break;
        }
    }
    responseObserver.onNext(changeFeedResponse);
    responseObserver.onCompleted();
}
Run Code Online (Sandbox Code Playgroud)

当客户端断开连接时,服务器仍继续处理,这可能在多个客户端获取数据时出现。需要知道如何告诉服务器停止处理

java grpc grpc-java

3
推荐指数
1
解决办法
680
查看次数

一般转发 GRPC 调用

我有一个 GRPC API,在重构之后,其中一些包被重命名。这包括package我们定义 API 的 proto 文件之一中的声明。像这样的东西:

package foo;

service BazApi {
    rpc FooEventStream(stream Ack) returns (stream FooEvent);
}
Run Code Online (Sandbox Code Playgroud)

改为

package bar;

service BazApi {
    rpc FooEventStream(stream Ack) returns (stream FooEvent);
}
Run Code Online (Sandbox Code Playgroud)

服务器端是grpc-java在顶部使用scala 和 monix 实现的。

这对于使用新 proto 文件的客户端来说一切正常,但对于构​​建在旧 proto 文件之上的旧客户端,这会导致问题:UNIMPLEMENTED: Method not found: foo.BazApi/FooEventStream.

通过 GRPC API 传递的消息的实际数据格式没有改变,只是包。

由于我们需要保持向后兼容性,我一直在寻找一种方法来让旧客户端正常工作,同时保持名称更改。

我希望ServerInterceptor使用能够检查传入呼叫的泛型来完成这项工作,看到它来自旧客户端(我们在标头中有客户端版本)并将其重定向/转发到重命名的服务。(因为只是包名发生了变化,这很容易弄清楚,例如foo.BazApi/FooEventStream-> bar.BazApi/FooEventStream

但是,似乎没有一种优雅的方法可以做到这一点。我认为可以通过ClientCall为正确的端点启动一个新端点,然后ServerCall通过委托给ClientCall.

有一个更好的方法吗?

grpc grpc-java

3
推荐指数
1
解决办法
1591
查看次数