我正在尝试开始在 Android 上使用 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 负载均衡。
为了测试失败的请求,我做了两件事:
我正在为一个类项目编写一些代码,该项目将作业发送到 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 的更多信息,以找出导致问题的原因,但我找不到太多任何内容,除了该类是对 …
我有一个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)
在ServerBuilder或Server上似乎没有公开允许指定地址或网络接口的API .而C++ API具有AddListentingPort.
那么在Java中是否有一种方法来限制服务侦听哪个IP或接口?
我尝试创建一个 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 文件和生成的代码位于单独的模块中。
我想从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) 我一直在尝试使用 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) 假设我想使用 Grpc 服务器流或双向流。
考虑到它在下面使用 http/2,流可以持续多长时间有任何限制吗?
如果是这样,它可以用来代替消息总线,这样流就可以打开并随心所欲地存活吗?
我在 Java 应用程序中使用 gRPC(非阻塞存根),并且两个函数调用之间的响应时间约为 5-8 毫秒。我想减少它。你有什么建议?有可能吗?
是否可以从 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)
我如何访问上下文属性/正确的方法是什么?