Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Jersey在微服务之间路由rest调用_Java_Rest_Jersey - Fatal编程技术网

Java 使用Jersey在微服务之间路由rest调用

Java 使用Jersey在微服务之间路由rest调用,java,rest,jersey,Java,Rest,Jersey,我目前正在从事一个项目,在该项目中,服务器端有多个微服务。客户端可以使用哪些微服务,以及它们所在的位置都会不断变化。 为了使所有这些更改远离客户端,我正在使用REST路由器。这将是一个单一的微服务,它知道其他每个微服务的位置。然后,客户机可以直接与路由器微服务通信,该微服务将请求发送到正确的端点 虽然在我看来这应该是相当直截了当的,但我遇到了各种各样的问题。由于微服务不一定位于同一主机上,路由器不能简单地转发呼叫,因为这只在同一主机内工作 我目前正试图将重定向发送回包含位置标头中正确端点URL的

我目前正在从事一个项目,在该项目中,服务器端有多个微服务。客户端可以使用哪些微服务,以及它们所在的位置都会不断变化。 为了使所有这些更改远离客户端,我正在使用REST路由器。这将是一个单一的微服务,它知道其他每个微服务的位置。然后,客户机可以直接与路由器微服务通信,该微服务将请求发送到正确的端点

虽然在我看来这应该是相当直截了当的,但我遇到了各种各样的问题。由于微服务不一定位于同一主机上,路由器不能简单地转发呼叫,因为这只在同一主机内工作

我目前正试图将重定向发送回包含位置标头中正确端点URL的客户端,从而使其正常工作。但当我通过restlet尝试这一点时,我得到的是404,而不是预期的带有location头的307

这是我的路由器代码:

@Path("/{any : .*}")
public Response forward(@Context HttpServletRequest request) {
    Response response = null;
    String requestUri = request.getRequestURI().toString();
    String actualUri = requestUri.substring(requestUri.indexOf("route") + 6);
    String endpointId = actualUri.substring(0, actualUri.indexOf('/'));
    try {
        response = redirectTo("http://localhost:8181/api/user/available");
    } catch (Throwable e) {
        e.printStackTrace();
        response = Response.serverError().status(500).build();
    }
    return response;
}

private Response redirectTo(String path) {
    try {
        URI uri = new URI(path);
        return Response.temporaryRedirect(uri).build();
    } catch (URISyntaxException e) {
        e.printStackTrace();
        return null;
    }
}
据我所知,这应该行得通。调试代码时,我可以看到创建的响应包含307HTTP状态和正确的位置头。但是在客户端测试应用程序(Chrome中的Restlet)中,我一直在使用404。当我将restlet直接指向该地址时,我确实得到了预期的结果,因此端点可用并在该地址上响应


有人能指出我哪里出了问题吗?这真的是服务器问题,还是我的客户端软件中缺少了什么?

这里推荐的方法是使用微服务注册表,如,etc跟踪您的微服务,并使用软件负载平衡器客户端,如与这些注册表通信,然后将请求路由到适当的微服务实例。在我看来,客户端重定向不是一个可伸缩的解决方案。好吧,我想我理解你的意思。但是使用类似于Eureka的东西意味着我将有一种方法让我的路由器服务决定将客户端请求转发到哪里。由于客户机是用户的web浏览器,如果我读对了Eureka,我就不能很好地将所有这些中间层服务直接公开给外部世界。接下来的问题是,如何在不同的主机上将请求从一个rest服务转发到另一个rest服务。通常用于转发的请求调度程序只支持相同的主机转发。