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

Mat*_*kas 3 java servlets dropwizard

我正在使用现代 Dropwizard (0.9.1),它默认将您的资源映射到面向公众的端口 8080,然后将特殊的 Admin Servlet 映射到不同的端口(默认为 8081)。而不必在端口8081管理员控制台,我想这一切映射到路径/admin,使所有管理资源是路径(在公开访问8080/admin/healthcheck8080/admin/metrics等等)。我一直在梳理 Dropwizard 和 Jetty 的文档,但似乎无法弄清楚这一点。

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

server:
  adminContextPath: /admin
  applicationConnectors:
    - type: http
      port: 8080
  adminConnectors:
    - type: http
      port: 8080
Run Code Online (Sandbox Code Playgroud)

在应用程序入口点run方法中,我可以像这样访问“管理上下文”,但我不确定如何对对象执行此操作:

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

想法?

Dan*_*Fox 5

我刚刚遇到了同样的问题(也在 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/*");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我将pathSpecfrom更改/*/admin/*以便我仍然可以访问我的正常应用程序资源(例如MyResource)。

现在,健康检查应通过访问:http://localhost:8000/your-application/admin/healthcheck。(请注意,整个 admin servlet 现在出现applicationContextPath在您的 server.yml 中定义的中,而不是 admin 中)。