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

news2024/11/18 3:41:18

文章目录

    • 1. 关系缘由
    • 2. Actuator简介及简单使用
    • 3. Endpoint和Actuator的关系
    • 4. Endpoint和HasFeatures的关系
    • 5. Endpoint和HasFeatures原理解析
      • 5.1 Endpoint的实现原理
      • 5.2 HasFeatures的实现原理
    • 6. 个人闲谈

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结合,提供一个开关,系统启动时直接打印引入的功能特性,这样或许可以提升一定的独立性和便利性,使用面更广。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/984114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2进阶篇学习笔记

文章目录 Vue2进阶学习笔记前言1、Vue脚手架学习1.1 Vue脚手架概述1.2 Vue脚手架安装1.3 常用属性1.4 插件 2、组件基本概述3、非单文件组件3.1 非单文件组件的基本使用3.2 组件的嵌套 4、单文件组件4.1 快速体验4.2 Todo案例 5、浏览器本地存储6、组件的自定义事件6.1 使用自定…

伦敦银线性回归分析

在金融市场中&#xff0c;商品的价格一段时间内总是会围绕着一条线性回归趋势线&#xff0c;在两侧波动并沿着这条趋势线方向发展。当价格在波动过程中偏离趋势线距离太大了&#xff0c;就会再次向趋势线靠拢。 波浪理论认为商品的价格走势都是波浪式发展的&#xff0c;无论处于…

入门力扣自学笔记280 C++ (题目编号:1123)(二分查找)(多看看)

2594. 修车的最少时间 题目&#xff1a; 给你一个整数数组 ranks &#xff0c;表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。 同时给你一个整数 cars &#xff0c;表示总共需要修理的汽车数目。 请你返…

Python IDLE使用方法详解(包含常用快捷键)

在安装 Python后&#xff0c;会自动安装一个 IDLE&#xff0c;它是一个 Python Shell (可以在打开的 IDLE 窗口的标题栏上看到&#xff09;&#xff0c;程序开发人员可以利用 Python Shell 与 Python 交互。 本节将以 Windows7 系统中的 IDLE 为例&#xff0c;详细介绍如何使用…

React Hook之useContext

1. 什么是useContext React官方解释&#xff1a;useContext 是一个 React Hook&#xff0c;可以让你读取和订阅组件中的 context&#xff08;React官方文档地址&#xff09;。 通俗的讲&#xff0c;useContext的作用就是&#xff1a;实现组件间的状态共享&#xff0c;主要应用场…

ESP32-C3的存储器类型

本文主要参考ESP-IDF编程指南&#xff0c;一点小记录。 ESP32-C3的存储器有&#xff1a; ESP-IDF 区分了指令总线&#xff08;IRAM、IROM、RTC FAST memory&#xff09;和数据总线 (DRAM、DROM)。 内部SRAM的一部分是指令RAM(IRAM)。那为什么要把指令放在RAM中&#xff0c;就是…

工厂车间安灯呼叫系统实现生产过程的可视化管理

工厂生产管理中生产效率低下导致现场管理困难。生产线问题无法及时处理和解决&#xff0c;导致在制品堆积严重。此外&#xff0c;对加工进度的掌握和生产现场状态的监控也存在困难&#xff0c;可控性差。设备故障无法及时处理&#xff0c;造成等待浪费&#xff0c;进一步降低了…

程序员告别996,这款开发工具火了

一、前言 如果一个概念能在科技圈火起来&#xff0c;它往往兼具字面简明和内涵丰富的特征&#xff0c;并具有某种重塑产业格局的潜力。 低代码&#xff08;Low Code&#xff09;就是这样一个典型。顾名思义&#xff0c;低代码是指少用代码&#xff0c;甚至不用代码&#xff0c;…

API安全学习 - crAPI漏洞靶场与API测试思路

crAPI漏洞靶场与解题思路 1. 前置基础1.1 认识crAPI1.2 环境搭建1.3 API的分类与鉴别 2. 漏洞验证2.1 失效的对象级别授权挑战1&#xff1a;访问其它用户车辆的详细信息挑战2&#xff1a;访问其它用户的机械报告 2.2 失效的用户身份验证挑战3&#xff1a;重置其它用户的密码 2.…

Vue3实战06-CompositionAPI+<script setup>好在哪?

Vue 3 的Composition API <script setup>这种最新的代码组织方式。

java八股文面试[数据库]——分库分表

什么是分库分表 简单来说&#xff0c;就是指通过某种特定的条件&#xff0c;将我们存放在同一个数据库中的数据分散存放到多个数据库&#xff08;主机&#xff09;上面&#xff0c;以达到分散单台设备负载的效果。 分库分表解决的问题 分库分表的目的是为了解决由于数据量过大…

Delft3D模型教程

详情点击公众号链接&#xff1a;基于Delft3D模型水体流动、污染物对流扩散、质点运移、溢油漂移及地表水环境报告编制教程 Delft3D计算网格构建 Delft3D水动力数值模拟 Delft3D污染物对流扩散数值模拟 一&#xff0c;Delft3D软件及建模原理和步骤 1.1地表水数值模拟常用软件、…

Cmake入门(一文读懂)

目录 1、Cmake简介2、安装CMake3、单目录简单实例3.1、CMakeLists.txt3.2、构建bulid内部构建外部构建 3.3、运行C语言程序 4、多目录文件简单实例4.1、根目录CMakeLists.txt4.2、源文件目录4.3、utils.h4.4、创建build 5、链接外部库文件6、注意 1、Cmake简介 CMake是一个强大…

Centos7离线安装ALISQL5.6.32-8

由于公司设备对数据需要大量的读取和查询&#xff0c;开始使用的mysql8&#xff0c;但是未优化的mysql插入和查询及其缓慢&#xff0c;因此我与同事分开研究&#xff0c;优化方案。我负责寻找可替代高效的数据库&#xff0c;然后问同学&#xff0c;发现alisql性能不错&#xff…

微信小程序开发---事件的绑定

目录 一、事件的概念 二、小程序中常用的事件 三、事件对象的属性列表 四、bindtap的语法格式 &#xff08;1&#xff09;绑定tap触摸事件 &#xff08;2&#xff09;编写处理函数 五、在事件处理函数中为data中的数据赋值 六、事件传参 七、bindinput的语法格式 八、…

微服务框架:一招实现降本、提质、增效办公!

应用什么样的软件平台&#xff0c;可以帮助企业朋友提高办公协作效率&#xff1f;传统的办公方式已经无法满足日益增长的业务需求了&#xff0c;借助低代码技术平台和微服务框架&#xff0c;可以让繁琐的办公轻松化&#xff0c;更高效、快捷、便利地满足客户的办公需求。 在众多…

分布式光伏消纳的微电网群共享储能配置策略研究——Matlab代码复现

目录 摘要&#xff1a; 研究背景&#xff1a; 共享储能参与微能源网新能源消纳模式&#xff1a; 共享储能电站容量功率配置原则&#xff1a; Matlab算例运行结果&#xff1a; ​编辑 Matalb代码数据分享&#xff1a; 摘要&#xff1a; 共享储能是可再生能源实现经济消纳…

Undefined symbols for architecture arm64

解决问题之前&#xff0c;先了解清晰涉及到的知识点&#xff1a; iOS支持的指令集包含&#xff1a;armv6、armv7、armv7s、arm64&#xff0c;在项目TARGETS---->Build Settings--->Architecturs 可以修改对应的指令集&#xff0c;目前Standard Architectures(arm64, arm…

【数据分享】2006-2021年我国省份级别的道路、桥梁、管线建设相关指标(10多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

GNSS融合策略

文章目录 一、背景二、松耦合融合策略1. 信息有效性判断2. 坐标系对齐3. 观测方程a.杆臂补偿b.速度融合c.位置融合d. 航向yaw融合e.观测性分析1&#xff09;状态表示在VIO坐标系下的观测性分析2&#xff09;状态表示在GPS ENU坐标系下的观测性分析 一、背景 前面介绍了GNSS的定…