春季启动执行器:自定义端点
#java #spring #springboot #monitoring

在延续到有关春季执行器的博客系列中,在这篇文章中,让我们深入了解更多的自定义,我们可以使用春季执行器进行。

毫无疑问,默认情况下,弹簧执行器公开了一组更广泛的预定端点,可以访问这些端点,以收集有关您应用程序的健康,指标,配置等的信息。但是,在某些情况下,您可能需要创建自定义执行器端点以扩展应用程序的监视和管理功能。

这里有一些好处和场景,自定义端点很有用:

  • 管理任务:您可以使用自定义端点在应用程序上执行管理任务。例如,可以通过自定义端点触发特定的维护例程,清除缓存或重新加载配置。
  • 自定义健康检查:执行器提供默认的健康检查端点,在上一篇文章中,我们深入介绍了您的健康终点。但是,您的应用程序可能具有特定的健康检查,这些检查超出了内置检查的范围。自定义健康检查端点允许您实施和公开这些支票。
  • 安全性和访问控制:通过创建自定义端点,您可以对谁可以访问特定的监视和管理信息进行精细的控制。这使您可以限制对敏感端点的访问,以确保只有授权的用户或系统才能与它们进行交互。
  • 第三方集成:如果您的应用程序依赖于外部服务或API,则可以创建自定义端点以监视这些集成的健康和状态。这对于快速识别外部依赖性问题特别有用。
  • 复杂的聚合:默认执行器端点提供了基本指标,但是在某些情况下,您可能需要执行复杂的聚合和计算以获得有意义的见解。

构建自定义端点

现在,让我们尝试构建自己的自定义HTTP执行器端点。

@EndPoint

@endpoint 注释是弹簧执行器的核心组成部分。用@endpoint注释注释您的课程并提供id字段(强制性)作为自定义值,此类现在将表示您的自定义端点。

@Component
@Endpoint(id="custom")
public class CustomActuatorEndpoint {
    ...
}

不要忘记通过定义@component noation。

这将使可供服务的执行端点以下:http://your-example-web-app:2121/actuator/custom。不要定义操作添加此自定义端点的定义。

端点操作

春季启动执行器端点主要支持3个基本操作,以与自定义端点进行交互。您可以通过这些注释来定义方法并注释它们。

  • @readoperation: @readoperation用于处理HTTP获取请求。它用于从执行器端点检索信息。通常,此操作用于暴露各种指标,健康信息,配置和其他仅阅读数据。

  • @writeOperation:此操作类型用于处理HTTP POST请求以修改具有副作用的应用程序或执行副作用的状态。

  • @deleteoperation:所述,@deleteoperation用于处理HTTP删除请求,以从应用程序中删除或删除资源。当您想提供用于删除资源或执行特定清理任务的API时,它可能会有所帮助。

始终建议使用弹簧安全性保护执行器端点,同时暴露敏感信息或执行以改变应用程序的状态/配置的写入/删除操作。

它很安静,类似于使用get/post/delete映射定义端点。

示例自定义端点

足够的理论ðü,让我们编写一个自定义执行器端点来管理您的应用程序发行说明。

这就是您的ReleaseNote数据对象的样子

public class ReleaseNote {
    private int version;
    private LocalDateTime date;
    private String changeLogData;
    // Constructors
    // Getters/Setters
}

现在,让我们编写使用ReleaseNotesDataRepository来管理ReleaseNote对象的持久性的ReleaseNoteEndpoint类。

@Component
@Endpoint(id="releaseNotes")
public class ReleaseNotesEndpoint {

    @Autowired
    private ReleaseNotesDataRepository releaseNotesDataRepository;

    @ReadOperation
    public List<ReleaseNote> getReleaseNotes() {
        return releaseNotesDataRepository.getReleaseNoteList();
    }

    @WriteOperation
    public ReleaseNote addReleaseNote(String version, String changeLogData) {
        ReleaseNote releaseNote = new ReleaseNote(version, LocalDateTime.now(), changeLogData);
        return releaseNotesDataRepository.addReleaseNote(releaseNote);
    }

    @DeleteOperation
    public void deleteReleaseNote(@Selector String version) {
        releaseNotesDataRepository.deleteReleaseNote(version);
    }
}

弹簧执行器带有 @Selector 注释,用作@Endpoint方法的参数,以指示端点的路径参数

让我们玩新的闪亮执行器端点来管理发行说明。

添加新发行说明

$ curl --location --request POST 'http://localhost:2121/actuator/releaseNotes' \
--header 'Content-Type: application/json' \
--data '{
    "version": "1.0",
    "changeLogData": "changeLog"
}' -i

# Response
HTTP/1.1 200 
...
{"version":"1.0","date":"2023-08-05T15:01:37.456528","changeLogData":"v1.0 changeLog"}

列出所有发行笔记

curl --location --request GET 'http://localhost:2121/actuator/releaseNotes' -i

# Response
HTTP/1.1 200 
...
[{"version":"1.0","date":"2023-08-05T15:01:37.456528","changeLogData":"v1.0 changeLog"}]

删除发行说明

curl --location --request DELETE 'http://localhost:2121/actuator/releaseNotes/1.0' -i

# Response
HTTP/1.1 204 

最后一句话

将自定义执行器端点纳入您的春季启动应用程序确实有助于满足您的自定义需求。这些量身定制的端点使您的启动应用程序有能力提取特定的见解,制定管理任务并动态调整配置。很想听听您的经历和想法!