Spring中Endpoint、HasFeatures、NamedFeature和Actuator的关系及实现原理

1. 关系缘由

我们经常可以在Springboot中看到@Endpoint注解,被该注解标注的类里面一般都会有@XXXOperation注解,也可以在Springcloud中看到带有Endpoint字样的实现类和带有Features等字样的实现类,初次看到总会觉得很疑惑,完全不知道这些类的作用以及相关的框架,但却很常见。这次我们便来捋一下各种带有EndpointHasFeaturesNamedFeature这些类具体的作用以及和Actuator的关系。

2. Actuator简介及简单使用

Actuator是基于Springboot体系开发的,其作用在于实时的监控程序,获取程序的运行数据,如获取健康检查、指标收集、程序bean运行情况及配置属性等信息。因此Actuator的作用便是对外暴露获取程序信息的HTTP接口,可以对Actuator进行扩展,从而实现实时监控的目的。下面是Actuator的简介图:

Actuator简介图

想要引入Actuator也非常简单,只需要配置以下maven配置即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>${springboot对应的版本}</version>
</dependency>

引入后配置需要加载哪些监听信息:

management:
  endpoints:
    web:
      exposure:
        include: '*'

上面的配置意为开放所有的HTTP接口,调用/actuator接口即可查看具体有哪些接口开放,至于Actuator有哪些接口、作用是什么及调用路径是什么这里便不一一介绍了。

3. Endpoint和Actuator的关系

前面说了Actuator的主要作用便是开放HTTP接口供开发者查询程序的运行状态,而支持哪些HTTP接口便是由Endpoint来决定的。Endpoint一般指的是Springboot@Endpoint注解,而被该注解标注的类名称一般都会带有Endpoint的字样,该注解源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Endpoint {

	/** Endpoint的唯一名称,该属性为开放的HTTP接口路径名称 */
	String id() default "";

	/** 是否默认打开,设置为false则需要手动配置打开 */
	boolean enableByDefault() default true;

}

所以我们可以把@Endpoint的功能近似理解成SpringMVC中的@RequestMapping注解,其仅仅是用来标注类,并定义HTTP接口的路径。所以当我们看到某个类被@Endpoint标注了,我们就能知道这是Actuator开放出去用来监听程序信息的HTTP接口。

那现在又有个问题,看@Endpoint的代码我们可知这个注解只能标注在类上,那我开放出去的这个HTTP接口被调用了会具体应该调用哪个方法?这就涉及到另外一些必须搭配使用的三个注解@ReadOperation@WriteOperation@DeleteOperation

@Endpoint一般都会前面三个注解当中的一个进行搭配使用,@Endpoint用来定义HTTP接口的路径,而@XXXOperation注解则用来定义接收请求的调用方法。搭配使用就做到了Actuator对开发者开放监听系统层面HTTP接口的能力。其关系图如下:

简单关系描述图

至此,Actuator@Endpoint@ReadOperation@WriteOperation@DeleteOperation四个注解的关系便讲到这里。

4. Endpoint和HasFeatures的关系

如果要说EndpointHasFeatures的关系,我们就需要先知道SpringcloudActuator的关系。Actuator是基于Springboot开发的,而Springcloud则是在Springboot的基础上扩展了微服务相关的框架和功能,因此Springcloud天然的支持使用Actuator

Springcloud是面向于微服务的,因此注定了框架会十分的庞杂,想要不仔细看系统从而精确的掌握某个微服务使用的技术栈是不现实的问题。因此Springcloud就需要一个机制来让开发者可以快速的了解程序使用的技术栈及其版本,而天然支持的Actuator则是不二之选。

Springcloud使用Actuator管理对外暴露的HTTP接口,在此基础上又开发了一套由HasFeaturesNamedFeatureFeature所组成的功能注册机制,需要对接进来的框架只需要往Spring容器中注册HasFeatures对象,Springcloud便可以使用Actuator暴露的接口返回程序具体使用了哪些框架。示意图如下:

示意图

所以HasFeaturesNamedFeatureFeatures这一套是Springcloud开放给其它框架用来注册自身的机制,再使用@Endpoint注解结合Actuator对外暴露HTTP接口,最终使开发者可以快速了解程序所使用的框架。

5. Endpoint和HasFeatures原理解析

对于@EndpointHasFeatures的原理解析我们分为两个大阶段:

  1. 解析@Endpoint的实现原理,这部分是基于Springboot实现的;
  2. @Endpoint实现原理基础上再去分析HasFeatures的原理,这部分是Springcloud新增的特性。

5.1 Endpoint的实现原理

先分析Actuator原本最基础的@Endpoint注解实现原理,我们也把这个实现原理分为4部分:

  1. 搜索并创建@Endpoint注解的bean对象;
  2. 处理bean对象中被@XXXOperation注解的方法,并将其解析成WebOperation对象;
  3. 将获取到的Endpoint对象信息注册为Servlet的HTTP接口;
  4. 调用时解析HTTP请求并调用到WebOperation对象中完成方法的调用与返回。

实现原理

5.2 HasFeatures的实现原理

HasFeaturesSpringcloud引入的新机制,其实现也非常简单,只需要各个框架使用HasFeatures封装框架的核心类并注册到Spring容器即可。Springcloud会从Spring容器中获取所有的HasFeatures类并传递到FeaturesEndpoint,调用HTTP接口时便转成Features对象返回注册的功能特性。总的来说可以总结成三步:

  1. 框架使用HasFeatures封装核心类并注册到Spring容器中;
  2. Spring容器中获取所有的HasFeatures并传递到FeaturesEndpointbean中;
  3. 调用HTTP接口时将HasFeatures转成Features对象并返回。

下图将以Feign框架为例:

Feign使用HasFeatures机制

6. 个人闲谈

这套实现单独拎出来分析确实是比较简单的,只要对Spring容器和Servlet的注册实现机制稍微有所了解,就可以把整个来龙去脉理的比较清楚,因此便不对源码进行过多的分析了。

Springcloud框架提供出了HasFeatures功能特性注册机制,确实是一种非常好的思路,可以让开发者通过调用一次HTTP接口便可以得知系统所引入的功能特性。但这种基于Actuator的机制还是不够便利,并且而不是所有的人都需要使用Actuator来对程序进行监控,有一定规模的公司都有自己的监控系统,Actuator反倒是有点鸡肋了。

因此个人认为,Springcloud除了可以将HasFeatures对接进Actuator的规范和实现方式,还可以把HasFeatures机制和Logger结合,提供一个开关,系统启动时直接打印引入的功能特性,这样或许可以提升一定的独立性和便利性,使用面更广。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值