我使用的是现代Dropwizard(0.9.1),它默认将您的资源映射到面向公众的端口8080,然后将特殊的Admin Servlet映射到不同的端口(默认为8081)。我希望将所有管理资源都映射到路径/admin
,而不是在端口8081上设置管理面板,以便所有管理资源都可以在该路径上公开访问(8080/admin/healthcheck
,8080/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");
思想?
答案 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
中,而不是管理员。)