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 实例的负载均衡器。
我正在尝试从 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 实例的负载均衡器。