【问题标题】:Using Apache Camel for routing gRPC traffic (using the same port per route)使用 Apache Camel 路由 gRPC 流量(每条路由使用相同的端口)
【发布时间】:2020-11-23 17:08:02
【问题描述】:

我正在尝试使用 springbootapache 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 路由? 当使用 jettynetty-httpundertow:http 来路由 rest api 时,此方案可以正常工作。

【问题讨论】:

    标签: spring-boot apache-camel grpc


    【解决方案1】:

    此选项当前未实现

    创建了一个 JIRA 问题来跟踪此功能 https://issues.apache.org/jira/browse/CAMEL-15883

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多