如何将Dropwizard管理servlet映射到面向公共端口的路由(8080)

时间:2015-12-03 21:03:39

标签: java servlets dropwizard

我使用的是现代Dropwizard(0.9.1),它默认将您的资源映射到面向公众的端口8080,然后将特殊的Admin Servlet映射到不同的端口(默认为8081)。我希望将所有管理资源都映射到路径/admin,而不是在端口8081上设置管理面板,以便所有管理资源都可以在该路径上公开访问(8080/admin/healthcheck8080/admin/metrics等)。我一直在为Dropwizard和Jetty的文档进行梳理,但似乎无法解决这个问题。

我将此添加到配置文件中,尝试将普通应用和管理应用映射到同一端口,但在应用启动时导致错误:

server:
  adminContextPath: /admin
  applicationConnectors:
    - type: http
      port: 8080
  adminConnectors:
    - type: http
      port: 8080

在应用程序入口点run方法中,我可以访问" admin上下文"像这样,但是我不知道究竟是用对象做了什么:

MutableServletContextHandler mut = environment.getAdminContext();
// get something from mut object?
environment.servlets().addServlet("admin", mut).addMapping("/admin");

思想?

1 个答案:

答案 0 :(得分:4)

我刚刚遇到同样的问题(也在Dropwizard 0.9.1上),我想我已经解决了它:

public class YourApplication extends Application<YourConfiguration> {

    // ...

    @Override
    public void run(YourConfiguration configuration, Environment environment) throws Exception {
        environment.jersey().register(new MyResource());

        environment.getApplicationContext().setAttribute(
                MetricsServlet.METRICS_REGISTRY,
                environment.metrics());
        environment.getApplicationContext().setAttribute(
                HealthCheckServlet.HEALTH_CHECK_REGISTRY,
                environment.healthChecks());
        environment.getApplicationContext().addServlet(
                new NonblockingServletHolder(new AdminServlet()), "/admin/*");
    }
}

我通过查看dropwizard如何在AbstractServletFactory class中设置管理servlet来发现这一点。

我将pathSpec/*更改为/admin/*,以便我仍然可以访问我的常规应用资源(例如MyResource)。

现在,应通过以下方式访问健康检查:http://localhost:8000/your-application/admin/healthcheck。 (请注意,整个admin servlet现在显示在server.yml中定义的 applicationContextPath 中,而不是管理员。)