搜索整个某度的技术论坛,说到endpoint全部是千篇一律,而且都是停留在springboot1.0+的基础上介绍,而且全部是一样的文章,一点新意也没有,springboot2.0已经出来有一段时间了,我们有必要知道在springboot2.0+中怎么自定义一个Endpoint。闲话不说,直蹦主题。

Spring中Controller和Endpoint的区别

依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>

核心注解

Endpoint

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Endpoint {
  5. /**
  6. * The id of the endpoint (must follow {@link EndpointId} rules).
  7. * @return the id
  8. * @see EndpointId
  9. */
  10. String id() default "";
  11. /**
  12. * If the endpoint should be enabled or disabled by default.
  13. * @return {@code true} if the endpoint is enabled by default
  14. */
  15. boolean enableByDefault() default true;
  16. }

WebEndpoint

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Endpoint
  5. @FilteredEndpoint(WebEndpointFilter.class)
  6. public @interface WebEndpoint {
  7. /**
  8. * The id of the endpoint.
  9. * @return the id
  10. */
  11. @AliasFor(annotation = Endpoint.class)
  12. String id();
  13. /**
  14. * If the endpoint should be enabled or disabled by default.
  15. * @return {@code true} if the endpoint is enabled by default
  16. */
  17. @AliasFor(annotation = Endpoint.class)
  18. boolean enableByDefault() default true;
  19. }

JmxEndpoint

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Endpoint
  5. @FilteredEndpoint(JmxEndpointFilter.class)
  6. public @interface JmxEndpoint {
  7. /**
  8. * The id of the endpoint.
  9. * @return the id
  10. */
  11. @AliasFor(annotation = Endpoint.class)
  12. String id() default "";
  13. /**
  14. * If the endpoint should be enabled or disabled by default.
  15. * @return {@code true} if the endpoint is enabled by default
  16. */
  17. @AliasFor(annotation = Endpoint.class)
  18. boolean enableByDefault() default true;
  19. }

翻看上面的几个注解很清楚的知道Endpoint 是基础注解而且这些注解只能标注在类上面,类比Endpoint相当于Spring中的ComponentWebEndpointJmxEndpoint相当于Endpoint的派生类。下面通过一个表格介绍这几个注解的区别。

注解 描述 类比
@Endpoint 该注解的类可以通过http查看也可以通过jmx查看,他是在两个地方注册 相当于springmvc中的RestController和JMX中MBean的集合
@JmxEndpoint 该注解的类开放的是JMX接口 相当于JMX中的MBean
@WebEndpoint 该注解的类开饭的是http接口 相当于mvc当中的RestController

读操作ReadOperation

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ReadOperation {
  5. /**
  6. * The media type of the result of the operation.
  7. * @return the media type
  8. */
  9. String[] produces() default {};
  10. }

写操作 WriteOperation

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface WriteOperation {
  5. /**
  6. * The media type of the result of the operation.
  7. * @return the media type
  8. */
  9. String[] produces() default {};
  10. }

删除操作DeleteOperation

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface DeleteOperation {
  5. /**
  6. * The media type of the result of the operation.
  7. * @return the media type
  8. */
  9. String[] produces() default {};
  10. }

从注解中可以看到,这些标注的是方法注解顾名思义这些是关于操作方面的注解,同样下面通过一个表格来解释一下。

描述 描述 类比
@WriteOperation http-POST请求 相当于mvc中的@PostMapping
@ReadOperation http- GET请求 相当于mvc中的@GetMapping
@DeleteOpretation http- DELETE请求 相当于mvc中的@DeleteMapping

代码实战

我们知道Spring中的注解扫描是依靠Component注解,但是我们上面的注解Endpoint并不是注解 Component的派生。所以如果想要使用Endpoint类我们可以通过注解Bean 实例化(当然也可以使用Component交给spring管理)。下面通过代码在操作Endpoint,WebEndpoint , JmxEndpoint注解操作。

配置config配置类

  1. @Configuration
  2. public class EndPointConfig {
  3. /**
  4. * 定义webEnpoint
  5. */
  6. @Bean
  7. public WebEndpointCustom webEndpointCustom() {
  8. WebEndpointCustom webEndpointCustom = new WebEndpointCustom();
  9. return webEndpointCustom;
  10. }
  11. /**
  12. * 定义jmxEndpoint
  13. */
  14. @Bean
  15. public JmxEndpointCustom jmxEndpointCustom() {
  16. JmxEndpointCustom jmxEndpointCustom = new JmxEndpointCustom();
  17. return jmxEndpointCustom;
  18. }
  19. /**
  20. * 定义基础的Endpoint
  21. * @return
  22. */
  23. @Bean
  24. public EndpointCustom endpointCustom() {
  25. EndpointCustom endpointCustom = new EndpointCustom();
  26. return endpointCustom;
  27. }
  28. }

编写基础Endpoint

  1. @Endpoint(id = "endpointCustom")
  2. public class EndpointCustom {
  3. @ReadOperation
  4. public String endpointCustomRead(String content) {
  5. return "你请求的内容: " + content;
  6. }
  7. @WriteOperation
  8. public String endpointCustomWrite(String content) {
  9. return "你写的内容: " + content;
  10. }
  11. @DeleteOperation
  12. public String endpointCustomDelete(String content) {
  13. return "你删除的内容: " + content;
  14. }
  15. }

测试

  1. curl -X GET http://localhost:8080/actuator/endpointCustom?content=endpointGet
  2. 你请求的内容: endpointGet
  3. curl -X POST http://localhost:8080/actuator/endpointCustom?content=endpointPost
  4. 你写的内容: endpointPost
  5. curl -X DELETE http://localhost:8080/actuator/endpointCustom?content=endpointDELETE
  6. 你删除的内容:endpointDELETE

WebEndpoint JmxEndpoint 和Endpoint使用相同,在此就不在赘述,只是WebEndpoint 只会通过Http访问,而JmxEndpoint是通过JMX查看而已。