是否应该在生产中禁用弹簧启动/云执行器?

Posted

技术标签:

【中文标题】是否应该在生产中禁用弹簧启动/云执行器?【英文标题】:Should spring boot/cloud actuator be disabled in production? 【发布时间】:2020-10-21 11:42:26 【问题描述】:

Spring Boot/Cloud Actuator 提供了良好的健康检查指标。但在生产中,我不希望最终用户看到这些指标并获得对应用程序的任何见解。

那么在生产中应该如何处理呢?我应该在生产中删除/禁用执行器还是有更好的方法来处理这个问题。

【问题讨论】:

您可以保护执行器或使用管理端口而不将其暴露给用户 “你可以保护执行器” - 你的意思是可以使用 spring security 来不允许用户访问任何执行器端点?? “使用管理端口而不向用户公开” - 你能详细说明如何做到这一点吗? docs.spring.io/spring-boot/docs/current/reference/html/… 【参考方案1】:

这基本上取决于您的要求。 首先,执行器不仅仅是健康检查

即使我们只讨论运行状况检查,在“编排”环境(如 kubernetes)中,您仍可能公开运行状况检查以实施 liveness 探测(即 kubernetes 将保持您的 pod 正常运行,只要健康检查返回 200 OK http 代码)。

你说

我不是最终用户看到这些指标并获得对应用程序的任何见解。

最终用户确实从不使用执行器,但它并不打算由最终用户使用,而是由开发人员和您环境中的各种集成使用。

这是可用于生产的执行器功能的另一个示例,即指标。如果您在部署中有 prometheus,则可以将其配置为抓取所有暴露 /prometheus 端点的 pod,这也是执行器的一个功能。

话虽如此,您可能只想公开部分端点,并可能使用某种身份验证技术保护它们,但这是另一回事。

执行器支持的端点的完整列表是可用的Here。此外,您始终可以创建自定义端点并决定是否要在生产中公开它们。

【讨论】:

【参考方案2】:

您可以启用/禁用执行器端点作为扇入/扇出样式。在很多情况下您需要某个端点但不是全部。例如,k8s 可以使用health 端点来进行 rediness/liveness 探测。指标需要很多次等等。

您可以包含端点,然后将显示确切的列表:

management.endpoints.web.exposure.include: env,health,info,metrics,loggers,prometheus

你也可以默认全部禁用:

management.endpoints.enabled-by-default: false

单独控制:

management.endpoint.shutdown.enabled: false

禁用列出的:

management.endpoints.web.exposure.exclude: health

你可以结合之前的 props(参见文档中的优先级),当然你可以保护执行器端点,所以不是每个人都可以访问它们。

Actuator documentation上有详细文档

【讨论】:

【参考方案3】:

您可以进行如下配置:

management:
  health:
    defaults:
      enabled: false
  endpoint:
    health:
      enabled: false

更多信息在这里:

https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-health-indicators

【讨论】:

以上是关于是否应该在生产中禁用弹簧启动/云执行器?的主要内容,如果未能解决你的问题,请参考以下文章

systemd-自定义启动服务报错-你在生产中遇到过什么印象深刻的错误?

在生产中禁用 graphiql

Tailwind CSS Nuxt 禁用清除选项在生产中引发错误

在生产中禁用 displayName

Rabbitmq celeryd celerybeat 没有在生产中作为守护进程执行任务

节点:在生产中使用非LTS版本的节点是否很糟糕?