我和Docker有一个微服务架构。每个微服务都是一个服务器和一个客户端。我正在尝试在它们上实现交互式查询。我想用纯文本进行交流。
服务器代码:
Server server = ServerBuilder.forPort(6666)
.addService((BindableService) this)
.build();
server.start();
客户代码:
// Call the external instance
final ManagedChannel channel = ManagedChannelBuilder
.forAddress(hostStoreInfo.getHost(), hostStoreInfo.getPort())
.usePlaintext()
.build();
final InteractiveQueryApiGrpc.InteractiveQueryApiBlockingStub stub = InteractiveQueryApiGrpc.newBlockingStub(channel);
kafkaComplexMessage = stub.getOrder(request);
channel.shutdown();
每个码头集装箱都是这样启动的:
docker run -p 8080:6666 -p 7070:6666 --env SERVER_PORT=8080 --network mynetwork mymicroservice:latest
当在本地状态存储中找不到数据时,我尝试远程访问正确的状态存储。但是,我收到以下错误消息:
io.grpc.StatusRuntimeException: INTERNAL: http2 exception
(...)
Caused by: io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception: First received frame was not SETTINGS. Hex dump for first 5 bytes: 485454502f
当然,每个容器都有一个不同的端口,但是我记录了所有内容,并调用了正确的IP和端口。我的印象是,服务器正在以纯文本形式使用TSL和client运行,在我的情况下,我不知道如何降低服务器的级别/禁用安全性。
发布于 2021-12-10 19:16:11
您可能在客户机和服务器之间有一个HTTP/1代理。
看看这条错误消息:
头5个字节的
十六进制转储: 485454502f
0x485454502f
是ASCII中的"HTTP/“。因此,客户端正在与HTTP/1服务器对话。gRPC明文假定HTTP/2 (“从HTTP/2规范开始HTTP/2”),不进行HTTP/1→HTTP/2升级。
最简单的解决方案是,如果代理支持具有先验知识的HTTP/2,只需配置它。如果没有,您可能需要切换到TCP代理模式,或者交换到另一个代理。
发布于 2021-12-13 10:52:49
实际上,我是在调用正确的IP,但由于我在码头的经验不足,端口错了。
我认为docker run -p 8080:6666 (...)
将允许Docker容器向其他Docker容器公开端口,但事实并非如此。这只用于向主机公开端口。
对于希望实现Kafka Interactve查询的Spring用户:
您可以获得码头集装箱的IP如下所示:
@Value("${spring.cloud.client.ip-address}")
而端口只是在服务器启动时使用的端口:
Server server = ServerBuilder.forPort(grpcServerPort)
.addService((BindableService) this)
.build();
https://stackoverflow.com/questions/70302242
复制相似问题