SpringBoot Actuator端点的实现原理【概括整理】

 

SpringBoot Actuator端点的实现原理【概括整理】

版本:spring-boot-actuator-2.2.6.RELEASE


概括起来,SpringBoot Actuator的实现原理如下

 

1,Endpoint Bean

 

@Endpoint标注的class是一个bean,是SpringBoot Actuator功能的具体的实现。 比如/actuator/beans端点对应的实现类是BeansEndpoint.class

 

2,注入Endpoint Bean到IOC容器。

 

如何把BeansEndpoint.class注入IOC容器呢,是通过配置类EndpointAutoConfiguration,比如BeansEndpoint.class对应的自动配置类是BeansEndpointAutoConfiguration

 

3,根据Endpoint Bean创建HandlerMapping,并注入HandlerMapping集合。

 

OK,功能实现了,如何暴露端口给第三方呢?注入HandlerMapping即可。 如何把EndpointHandlerMapping注入SpringBoot的HandlerMapping呢,
具体的处理类是AbstractWebMvcEndpointHandlerMapping,initHandlerMethods方法会把所有标注有@Endpoint注解的class,封装成符合规范的结构,注入到HandlerMapping集合。
 

 

4,处理端点请求

 

处理请求的具体实现AbstractWebMvcEndpointHandlerMapping.OperationHandler。

最后要注意的是,SpringBoot Actuator不存在controller,而是通过@Endpoint注解的class来处理Endpoint端点请求的。  @Endpoint注解的class相当于我们的controller


SpringBoot Actuator端点请求的具体处理类:OperationHandler

private final class OperationHandler {
    private final AbstractWebMvcEndpointHandlerMapping.ServletWebOperation operation;

    OperationHandler(AbstractWebMvcEndpointHandlerMapping.ServletWebOperation operation) {
        this.operation = operation;
    }

    @ResponseBody
    Object handle(HttpServletRequest request, @RequestBody(required = false) Map<String, String> body) {
        return this.operation.handle(request, body);
    }

    public String toString() {
        return this.operation.toString();
    }
}

 

SpringBoot Actuator端点请求封装的HandlerMapping的json数据结构如下

 

{
  "handler": "Actuator web endpoint 'env'",
  "predicate": "{GET /actuator/env, produces [application/vnd.spring-boot.actuator.v3+json || application/vnd.spring-boot.actuator.v2+json || application/json]}",
  "details": {
    "handlerMethod": {
      "className": "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler",
      "name": "handle",
      "descriptor": "(Ljavax/servlet/http/HttpServletRequest;Ljava/util/Map;)Ljava/lang/Object;"
    },
    "requestMappingConditions": {
      "consumes": [],
      "headers": [],
      "methods": [
        "GET"
      ],
      "params": [],
      "patterns": [
        "/actuator/env"
      ],
      "produces": [
        {
          "mediaType": "application/vnd.spring-boot.actuator.v3+json",
          "negated": false
        },
        {
          "mediaType": "application/vnd.spring-boot.actuator.v2+json",
          "negated": false
        },
        {
          "mediaType": "application/json",
          "negated": false
        }
      ]
    }
  }
}

 

 

我们正常的controller接口封装的HandlerMapping的结构是这样的,可以对比一下异同

{
  "handler": "com.cr949.auto.docs.controller.CommonController#commonResponseSimpleObjectTest(JavaBaisicTypeDto)",
  "predicate": "{GET /cr949/interface/common/commonResponseSimpleObjectTest}",
  "details": {
    "handlerMethod": {
      "className": "com.cr949.auto.docs.controller.CommonController",
      "name": "commonResponseSimpleObjectTest",
      "descriptor": "(Lcom/cr949/auto/docs/dto/swagger2/JavaBaisicTypeDto;)Lcom/cr949/auto/docs/dto/CommonResponse;"
    },
    "requestMappingConditions": {
      "consumes": [],
      "headers": [],
      "methods": [
        "GET"
      ],
      "params": [],
      "patterns": [
        "/cr949/interface/common/commonResponseSimpleObjectTest"
      ],
      "produces": []
    }
  }
}

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值