标签: grpc-java

如何为 Java / Kotlin / Android 中的所有请求设置 gRPC 客户端超时

我正在尝试开始在 Android 上使用 grpc。

我找到了如何为单个请求设置超时(截止日期)。

有没有办法为所有请求设置超时?我真的不想在每个请求之前设定截止日期

android grpc grpc-java

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

如何在 Kubernetes 集群中使用 grpc-java 让 GRPC 的重试机制发挥作用?

我一直在尝试让 GRPC 的负载平衡在部署到 Kubernetes 集群的 Java 应用程序中工作,但并没有取得太大成功。似乎没有太多关于此的文档,但从在线示例中我可以看到,我现在应该能够在设置 ManagedChannel 时使用 '.defaultLoadBalancingPolicy("round_robin")' (在更高版本的 GRPC Java lib 中) 。

更具体地说,我使用的是 GRPC Java 库的 1.34.1 版本。我创建了两个 Spring Boot (v2.3.4) 应用程序,一个名为 grpc-sender,另一个名为 grpc-receiver。

grpc-sender 充当 GRPC 客户端,并将 (Netty) ManagedChannel 定义为:

@Bean
public ManagedChannel greetingServiceManagedChannel() {
  String host = "grpc-receiver";
  int port = 6565;
  return NettyChannelBuilder.forAddress(host, port)
      .defaultLoadBalancingPolicy("round_robin")
      .usePlaintext().build();
}
Run Code Online (Sandbox Code Playgroud)

然后grpc-receiver充当GRPC服务器:

Server server = ServerBuilder.forPort(6565)
        .addService(new GreetingServiceImpl()).build();
Run Code Online (Sandbox Code Playgroud)

我正在将这些应用程序部署到 Kubernetes 集群(暂时在 minikube 本地运行),并且我为 grpc-receiver 应用程序创建了一个 Service 作为无头服务,这样就可以实现 GRPC 负载均衡。

为了测试失败的请求,我做了两件事:

  • 在执行测试运行期间杀死 grpc-receiver pod 之一 - 例如,当我请求 grpc-sender …

java kubernetes grpc grpc-java

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

如何摆脱 grpc api 中对 CallCredentials2 的调用

我正在为一个类项目编写一些代码,该项目将作业发送到 GCP 中的 dataproc 集群。我最近遇到了一个奇怪的错误,但我无法理解它。错误如下:

Exception in thread "Thread-5" java.lang.NoClassDefFoundError: io/grpc/CallCredentials2
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at com.google.api.gax.grpc.GrpcCallContext.withCredentials(GrpcCallContext.java:160)
at com.google.api.gax.grpc.GrpcCallContext.withCredentials(GrpcCallContext.java:67)
at com.google.api.gax.rpc.ClientContext.create(ClientContext.java:210)
at com.google.cloud.dataproc.v1.stub.GrpcJobControllerStub.create(GrpcJobControllerStub.java:130)
at com.google.cloud.dataproc.v1.stub.JobControllerStubSettings.createStub(JobControllerStubSettings.java:215)
at com.google.cloud.dataproc.v1.JobControllerClient.<init>(JobControllerClient.java:139)
at com.google.cloud.dataproc.v1.JobControllerClient.create(JobControllerClient.java:120)
at com.shayr.searchEngineGUI.searchEngineGUI.constructInvertedIndices(searchEngineGUI.java:509)
at com.shayr.searchEngineGUI.searchEngineGUI.access$0(searchEngineGUI.java:501)
at com.shayr.searchEngineGUI.searchEngineGUI$2.run(searchEngineGUI.java:474)
Caused by: java.lang.ClassNotFoundException: io.grpc.CallCredentials2
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 22 more
Run Code Online (Sandbox Code Playgroud)

我的代码中触发此问题的行是:

JobControllerClient jobControllerClient = JobControllerClient.create(jobControllerSettings);
Run Code Online (Sandbox Code Playgroud)

我最初尝试查找有关 CallCredentials2 的更多信息,以找出导致问题的原因,但我找不到太多任何内容,除了该类是对 …

google-cloud-platform grpc google-cloud-dataproc grpc-java

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

在Java中将gRPC服务绑定到localhost

我有一个gRPC服务,我只想绑定到localhost地址.但是,我没有看到在Java中这样做的方法.相反,它将绑定到所有地址.

以下是我现在创建服务的方法:

server = ServerBuilder.forPort(config.port())
                      .addService(new GRPCServiceImpl(serviceParams))
                      .build()
                      .start();
LOG.info("Server started, listening on " + config.port());
Run Code Online (Sandbox Code Playgroud)

ServerBuilderServer上似乎没有公开允许指定地址或网络接口的API .而C++ API具有AddListentingPort.

那么在Java中是否有一种方法来限制服务侦听哪个IP或接口?

java grpc grpc-java

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

无法使用 scala 构建 gRPC ManagedChannel

我尝试创建一个 gRPC 客户端。为了

val channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build
Run Code Online (Sandbox Code Playgroud)

我收到这个编译时错误

Error:(18, 87) value build is not a member of ?0
    val channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build
Run Code Online (Sandbox Code Playgroud)

gRPC 是为 Java 构建的。我的项目是多模块 Maven 项目,其中 protobuf 文件和生成的代码位于单独的模块中。

java scala maven grpc grpc-java

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

来自 gRPC StreamObserver 的“桥接”Reactor 的 Flux

我想从gRPC StreamObserver创建Reactor Flux。只要 StreamObserver 没有本地实现相应的接口(参见例如这个问题),就需要这样做。

我想出的内容大致如下:

final StreamObserver<ProtoResponse>[] streamObserverArray = new  StreamObserver[1];
Flux<Response> myFlux Flux.create(sink -> streamObserverArray[0] = new StreamObserver<ProtoResponse>() {
        @Override
        public void onNext(ProtoResponse value) {
            final Response response = convertFromProto(value);
            sink.next(response);
        }

        @Override
        public void onError(Throwable throwable) {
            sink.error(throwable);
        }

        @Override
        public void onCompleted() {
            sink.complete();
        }
    });
myFlux
    .doOnError(throwable -> {/* actual logic in here */}) //
    .doOnComplete(() -> {/* actual logic in here */}) //
    .doOnCancel(() -> {/* actual logic …
Run Code Online (Sandbox Code Playgroud)

java project-reactor grpc grpc-java

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

gRPC-Java ssl服务器端认证证书生成

我一直在尝试使用 ssl 为简单的 Java gRPC 应用程序设置服务器端身份验证。我使用 certstrap 生成密钥和证书,如下所示:

# Create CA
$ certstrap init --common-name "GRPC"
# Create cert for host using DNS name
$ certstrap request-cert --common-name sdl10236.labs.teradata.com
$ certstrap sign server.com --CA "GRPC"
# gives the following files:
$ GRPC.crl  GRPC.crt  GRPC.key  server.crt  server.csr  server.key
Run Code Online (Sandbox Code Playgroud)

我有以下 java 代码,是我从他们的 hello world 示例和一些单元测试中拼凑而成的,因为我找不到如何执行此操作的完整示例。

private SslProvider sslProvider = SslProvider.OPENSSL;

...

this.clientContextBuilder = GrpcSslContexts.configure(SslContextBuilder.forClient(), this.sslProvider);
try {
    this.serverCertFile = this.loadCert("server.crt");
    this.serverPrivateKeyFile = this.loadCert("server.key");
    this.serverTrustedCaCerts = new X509Certificate[]{this.loadX509Cert("GRPC.crt")};
} catch (IOException ex) { …
Run Code Online (Sandbox Code Playgroud)

openssl grpc grpc-java

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

grpc 流式传输可以持续多长时间

假设我想使用 Grpc 服务器流或双向流。

考虑到它在下面使用 http/2,流可以持续多长时间有任何限制吗?

如果是这样,它可以用来代替消息总线,这样流就可以打开并随心所欲地存活吗?

grpc grpc-java

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

grpc 调用时间减少开销

我在 Java 应用程序中使用 gRPC(非阻塞存根),并且两个函数调用之间的响应时间约为 5-8 毫秒。我想减少它。你有什么建议?有可能吗?

grpc grpc-java

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

如何从 grpc Context.current() 访问属性?

是否可以从 rpc 方法定义访问 grpc 调用的上下文属性?

我写了一个类似于这个的服务器拦截器

@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, final Metadata requestHeaders, ServerCallHandler<ReqT, RespT> next) {

   Context.Key<String> USER = Context.key("USER");
 
  Context ctx = Context.current().withValue(USER, "chandan");
  return Contexts.interceptCall(ctx, call, requestHeaders, next);
}
Run Code Online (Sandbox Code Playgroud)

在服务实现中,我正在尝试类似的东西

Context.Key<String> key = Context.key("USER");
String value = key.get(Context.current())
Run Code Online (Sandbox Code Playgroud)

每次值为空。但是在调试中的IntelliJ我可以在看到那些值context.current().keyValueEntries作为

CompressedIndex(bitmap=100001000000000000000000000000 Leaf(key=USER value=chandan) Leaf(key=opencensus-trace-span-key value=BlankSpan) )
Run Code Online (Sandbox Code Playgroud)

我如何访问上下文属性/正确的方法是什么?

protocol-buffers grpc grpc-java protobuf-java

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