【发布时间】:2020-11-23 17:08:02
【问题描述】:
我正在尝试使用 springboot 和 apache camel 实现网关来管理多个微服务的路由 gRPC 流量。
我们的目标是将所有使用相同主机名和端口的流量公开到我们客户端的单个入口点。
我从两条路线开始,如下所述
身份验证路由
@Component
public class AuthenticationRoute extends RouteBuilder{
@Override
public void configure() throws Exception {
AuthenticationResponse fallbackResponse =
AuthenticationResponse.newBuilder().setMessage("FAILED").setStatus("ORS-400").build();
from("grpc://localhost:9090/com.erable.services.impl.AuthenticationService=authenticate")
.circuitBreaker()
.to("grpc://localhost:4041/com.erable.services.impl.AuthenticationService?method=authenticate")
.log(LoggingLevel.WARN, "FALLBACK ALERT")
.onFallback()
.process(exchange -> exchange.getIn().setBody(fallbackResponse, AuthenticationResponse.class))
.end();
}
}
EquipmentListQueryRoute
@Component
public class EquipmentListQueryRoute extends RouteBuilder{
@Override
public void configure() throws Exception {
EquipmentListResponse fallbackResponse =
EquipmentListResponse.newBuilder().setMessage("FAILED").setStatus("ORS-400").build();
from("grpc://localhost:9090/com.erable.services.impl.EquipmentService=equipmentListQuery")
.circuitBreaker()
.to("grpc://localhost:4042/com.erable.services.impl.EquipmentService?method=equipmentListQuery")
.log(LoggingLevel.WARN, "FALLBACK ALERT")
.onFallback()
.process(exchange -> exchange.getIn().setBody(fallbackResponse, EquipmentListResponse.class))
.end();
}
}
运行项目时,出现以下异常:
Caused by: java.io.IOException: Failed to bind
at io.grpc.netty.NettyServer.start(NettyServer.java:264) ~[grpc-netty-1.30.2.jar:1.30.2]
at io.grpc.internal.ServerImpl.start(ServerImpl.java:183) ~[grpc-core-1.30.2.jar:1.30.2]
at io.grpc.internal.ServerImpl.start(ServerImpl.java:90) ~[grpc-core-1.30.2.jar:1.30.2]
at org.apache.camel.component.grpc.GrpcConsumer.doStart(GrpcConsumer.java:78) ~[camel-grpc-3.6.0.jar:3.6.0]
at org.apache.camel.support.service.BaseService.start(BaseService.java:115) ~[camel-api-3.6.0.jar:3.6.0]
... 32 more
Caused by: java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method) ~[?:?]
at sun.nio.ch.Net.bind(Net.java:461) ~[?:?]
at sun.nio.ch.Net.bind(Net.java:453) ~[?:?]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227) ~[?:?]
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:134) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:550) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:506) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:491) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:248) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) ~[netty-common-4.1.52.Final.jar:4.1.52.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[netty-common-4.1.52.Final.jar:4.1.52.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) ~[netty-transport-4.1.52.Final.jar:4.1.52.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.52.Final.jar:4.1.52.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.52.Final.jar:4.1.52.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.52.Final.jar:4.1.52.Final]
at java.lang.Thread.run(Thread.java:834) ~[?:?]
这是否意味着我不能使用同一个 host:port 来公开多个 camel-gRPC 路由? 当使用 jetty 或 netty-http 或 undertow:http 来路由 rest api 时,此方案可以正常工作。
【问题讨论】:
标签: spring-boot apache-camel grpc