Spring Boot Actuator提供了一些Endpoint(端点),比如health、metrics、info等,同时支持我们自定义一些Endpoint。
同时,基于Spring Boot我们又可以定义一些对外可访问的Controller。那么,针对一个业务功能,如何区判断是基于Controller还是基于Endpoint进行定义呢?也就是说Spring中Controller和Endpoint的区别是什么?
首先,Endpoint可以理解为是Controller的更具体和特殊的实现。
Endpoint不依赖于视图(例如 JSP)在HTML中呈现模型数据,而是简单地将要写入的数据直接返回到响应主体中(类似于在Controller中执行@ResponseBody)。

Actuator Endpoint优点

在以下情况下Actuator Endpoint是更好的选择:

  • Endpoint旨在基于HTTP执行打印Object(Json)的高度定制化任务。
  • 将监控和管理的代码与特定于应用程序的代码分开。
  • 保持代码的清洁和高内聚。

    @Controller和@Endpoint的区别

    在Micronaut框架中,可以通过如下方式声明Controller:
    1. @Controller("/endpoint")
    2. public class DummyService {
    3. @Get
    4. @Produces(MediaType.TEXT_PLAIN)
    5. public String index() {
    6. return "Hello World!";
    7. }
    8. }
    同时,也可以使用如下方式声明Endpoint:
    1. @Endpoint("/endpoint")
    2. public class DummyService {
    3. @Get
    4. @Produces(MediaType.TEXT_PLAIN)
    5. public String index() {
    6. return "Hello World!";
    7. }
    8. }
    这两种方式是可以相互替换的,但哪个一种方式更合适呢?
    通常@Endpoint用于监控和管理(比如,调整日志级别、管理缓存、监控资源利用率等),需要被特殊对待(处理),而不应该用于应用程序功能。
    而@Controller是常规的Rest服务,应用于不属于管理和监控的应用程序端点。