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