我们正计划将我们现有的服务迁移到 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 中实现自定义对象键映射?
是否可以这样说 - java gRPC 服务器线程即使在 DEADLINE 时间之后仍然会运行。但是,自从超过截止时间以来,gRPC 服务器只会停止/阻止该线程进行任何后续 gRPC 调用吗?
如果上述说法正确,那么有没有办法停止/阻止线程进行任何 Redis/DB 调用以及超过 DEADLINE 时间的线程?或者一旦超过 DEADLINE 时间,立即中断线程?
我应该在 grpc 服务器处理的每个调用的开始和结束时执行一些代码。
我使用 ServerCall.Listener:
侦听器由注册到我的服务器的拦截器实例化。
但有一个问题:有时,即使侦听器已实例化,也不会调用 onComplete 或 onCancel。
为了完全准确,如果实例化侦听器的线程之外的另一个线程正在调用 onComplete / onCancel,也可能会触发该问题。
这些情况之一应该发生吗?我正在使用 grpc-netty 版本 1.6.1。
谢谢你的帮助 !
我有一个应用程序(Java),它严重依赖 grpc 在不同的微服务之间进行通信。问题在于,在云环境中,调用服务通常无法到达其目标服务。为了解决我们的问题,我们希望从 grpc 获得更好的调试信息。
目前,我们从 grpc 获得非常粗略的日志信息,并且我们希望看到套接字级别的日志信息(例如“与套接字 x 交谈......”)。我们如何更改 grpc 的记录器级别?在整个系统中,我们使用slf4j进行日志记录,并且我们的 netty-logging.properties 的日志记录级别为INFO。
什么样的水平才算是好的水平呢?(我们正在考虑TRACE)我们应该以编程方式更改每个 grpc 调用的级别还是在配置文件中更改级别?(这个文件会是什么样子?)
我的问题与this问题非常相似,但是针对maven和java。
我正在测试 grpc,并想将一个简单的 helloworld.proto 放入 test/proto 文件夹中。
但是该文件不会生成 java 文件(与 /src/main/proto 中的 proto 文件不同)。
所以我的问题是如何在测试文件夹中生成 proto 代码?
我正在尝试对 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) 我正在尝试使用gRPC 作为 JNI 替代方案,其想法是在 C++ 端提供 gRPC 服务,并在 Java/Android 端连接客户端。为了获得最佳性能,我更愿意使用进程内通道(欢迎您的建议)。
我如何连接到 C++ gRPC 服务器InProcessChannel()?问题是我需要传递Javaname的InProcessServerBuilder.
在 C++ gRPC 测试中(例如,此处),我找不到它的设置,这让我认为InProcessChannel只能在纯 C++ 中使用(服务器和客户端都在 C++ 中)。C++服务和Java客户端还可以吗?
附言。我能够为 Java 服务器 + Java 客户端做到这一点。
聚苯硫醚。我发现了几个类似的 QnAs,例如。在这里,但我想知道是否还有办法让它协同工作(可能与一些第三方渠道实现)。它可以通过 Unix 域套接字工作吗?
我有一个服务器,该服务器为给定请求传输数据,以下是执行该功能的方法
@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)
当客户端断开连接时,服务器仍继续处理,这可能在多个客户端获取数据时出现。需要知道如何告诉服务器停止处理
我有一个 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.
有一个更好的方法吗?