Spring openshift 中的引导/VertX 调用超时

Spring Boot / VertX call timeout in openshift

我正在尝试从 spring 引导服务调用 vertx 服务,并且这两个服务都部署在 openshift 中;但得到了这个例外:

2020-04-28 03:25:12.556 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://vertx-service:8080/": Connection timed out (Connection timed out); nested exception is java.net.ConnectException: Connection timed out (Connection timed out)] with root cause java.net.ConnectException: Connection timed out (Connection timed out) ...

这是用于从 spring 启动应用程序调用服务的代码:

RestTemplate template = new RestTemplate();
String url = "http://vertx-service:8080/"; // I'm using discovery pattern here
String response = template.getForEntity(url, String.class).getBody());

这是 vertx 应用程序的代码:

public class SimpleWebVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        Router router = Router.router(vertx);

        router.get("/").handler(this::handleGet);

        router.route().handler(BodyHandler.create());
        vertx.createHttpServer().requestHandler(router::accept).listen(8080);
    }

    private void handleGet(RoutingContext routingContext) {
        routingContext.vertx().<String>executeBlocking(future -> {
            String response;
            CompletableFuture<String> cf = CompletableFuture.supplyAsync(
                    () -> {
                        String res = "Hello from VertX! Server name: "
                        + System.getenv().getOrDefault("HOSTNAME", "unknown");
                        return res;
                    });
            try {
                response = cf.get();
            } catch (InterruptedException | ExecutionException e) {
                response = e.getMessage();
            }
            future.complete(response);
        }, false, result -> {
            routingContext.response()
                    .putHeader("Content-Type", "text/plain")
                    .end(result.result());
        });
    }
}

附加信息:还开发了一个 api-gateway 服务,使用 swagger 调用服务并从 spring 引导服务获得成功,但从 vertx 服务获得响应(回退)。

使用的版本: Spring引导 2.2、Vertx 3.3、Minishift 3.11

你有没有试过

String url = "http://vertx-service/"; 

您的 url 不需要端口 8080。假设 vertx-service 是部署在 Openshift 上的另一个服务对象的名称。还要查看vertx-service的pod详情,是否在容器中暴露了端口。

在 openshift 中,服务名称充当容器映像的所有 pod 实例的负载均衡器。