0

我有 2 个 grizzly 应用程序,我想在同一服务器上的不同 URL 上并排运行。当我将我的 url 从更改localhostapi.url.local进行本地调试时,它会抛出一个java.nio.channels.UnresolvedAddressException. 为了让 java 识别另一个 URL(即 - 修改主机文件),我需要做些什么吗?还是我走错了方向?

我目前在 Windows 上,但将部署到 Linux。(如果由我决定,我会运行 Linux)

public class Main {

    public static final URI BASE_URI = getBaseURI();

    private static URI getBaseURI() {
        return UriBuilder.fromUri("http://localhost/").port(9998).build();
    }

    protected static HttpServer startServer() throws IOException {
        ResourceConfig rc = new PackagesResourceConfig("com.my.package.api.resources");
        rc.getFeatures()
            .put(JSONConfiguration.FEATURE_POJO_MAPPING, true);

        return GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
    }

    public static void main(String[] args) throws IOException {
        AnnotationConfigApplicationContext annotationCtx = new AnnotationConfigApplicationContext(Config.class);

        HttpServer httpServer = startServer();

        System.out.println(String.format("Jersey app started with WADL available at " + "%sapplication.wadl\nHit enter to stop it...", BASE_URI, BASE_URI));
        System.in.read();
        httpServer.stop();
    }
}
4

1 回答 1

1

在同一台机器上用一个 IP 地址在不同的 url 下运行两个不同的应用程序非常容易。但可能需要一些设置,具体取决于您想要做什么。

我的假设是您正在开发机器上执行此操作。这里最大的问题是两台服务器需要不同的端口号。

服务器 #1
http://localhost:8080/

服务器 #2
http://localhost:8081/


如果您想要命名实例。您必须更新主机文件以将您想要的命名实例指向本地计算机。但是,您仍然需要为每个应用程序做单独的端口。

服务器 #1 http://api.url.local:8080/

服务器 #2 http://api.url.local2:8081/

您还必须更新您的 tomcat(我假设您使用的是 tocmat)配置。在元素中,我相信您必须将“名称”属性更新为应用程序 URL 的名称。


友情提示,如果您使用相同的 IP 地址,但不同的主机名,SSL 证书将无法正常工作。通常在这种设置中,您将需要通配符或统一通信证书。


当您部署到生产环境时,我建议您使用 Apache HTTP Server 作为您的两个应用程序的代理并拥有两个单独的 IP 地址,除非您可以使用 SSL 通配符或统一通信证书。


如果您想在两个不同的 URL 下运行一个应用程序,这部分答案是针对的。

使用Apache Http Server实例代理您的应用程序,并使用mod_proxy将您的两个不同的服务器名称或 IP 地址转发到同一个 Java 实例。

不过我的建议是,只运行您的应用程序的两个实例。不要太担心资源,硬件真的很便宜,而且比担心如何为两个不同的站点运行一个实例要少得多。

于 2013-09-29T16:25:27.980 回答