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

文章目录

    • 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.mzph.cn/news/71431.shtml

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

相关文章

什么牌子的led台灯质量好?热门的Led护眼台灯推荐

led台灯有环保无污染、耗能低、长寿命等优点&#xff0c;适合用在阅读、书写、批阅等办公或学习的场所。而挑选LED台灯时&#xff0c;分散光挡板做的比较好的优先选择&#xff0c;能分散大量蓝光&#xff0c;对眼睛危害较小。下面&#xff0c;小编为大家推荐五款质量好的led护眼…

EF框架基础应用入门

文章目录 一、介绍二、EF6框架基础1. 数据模型和实体类2. 数据库上下文&#xff08;DbContext&#xff09;介绍3. 配置数据模型与数据库表的映射关系 两种方式Fluent API和数据注解Fluent API数据注解 4. 数据库迁移&#xff08;Migration&#xff09;概述a. 创建初始迁移b. 更…

Vulnhub: Masashi: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容&#xff0c;tftp服务在1337端口 sshfolder.txt内容&#xff0c…

日200亿次调用,喜马拉雅网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《API网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/微博/…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——减法原理除法原理

减法原理 正面难则反着做(“ − - −”号) 【思路】当出现“至少、至多”、“否定用语"等正面较难分类的题目&#xff0c;可以采用反面进行求解&#xff0c;注意部分反面的技巧以及“且、或"的反面用法。 除法原理 看到相同&#xff0c;定序用除法消序( “ &quo…

python批量下载csdn文章

声明&#xff1a;该爬虫只可用于提高自己学习、工作效率&#xff0c;请勿用于非法用途&#xff0c;否则后果自负 功能概述&#xff1a; 根据待爬文章url(文章id)批量保存文章到本地&#xff1b;支持将文中图片下载到本地指定文件夹&#xff1b;多线程爬取&#xff1b; 1.爬取…

插入排序——希尔排序

1、简述&#xff1a; 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”&#xff08;Diminishing Increment Sort&#xff09;&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。 希尔排…

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么&#xff1f;2、DMA介绍3、DMA 中的数据传输如何进行&#xff1f;4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式&#xff08;Burst Mode&#xff09;6.2 循环窃取模式…

无人机集群路径规划MATLAB:孔雀优化算法POA求解无人机集群三维路径规划

一、无人机模型简介 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 二、孔雀优化算法POA介绍 孔雀优化算法( Peafowl Optimization Algorithm, POA), 是由 Jingbo Wang 等于2022 年提出的一种群体智能优化算法。其灵感来源于孔雀的群体行为。 智能优化算法&am…

Nebula数据库安装

1、什么是nebula NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库&#xff0c;能够承载包含数千亿个点和数万亿条边的超大规模数据集&#xff0c;并且提供毫秒级查询。 2、利用docker-compose安装Nebula数据库 1、前提条件 主机中安装了docker主机中安装了Docke…

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【git】【IDEA】在idea中使用git

目录 一、 在IDEA中配置git 二、 获取git仓库 2.1 本次初始化仓库 2.2 从远程仓库克隆 三、 本地仓库操作 3.1 将文件加入暂存区 3.2 将暂存区的文件提交到版本库 3.3 快捷键 使用快捷键 实现加入到暂存区与提交到版本库 3.4 查看日志 Show History 四、 远程仓库操…

springboot初试elasticsearch

引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…

MySQL性能分析工具的使用

1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f;这里把思考的流程整理成下面这张图。 整个流程划分成了 观察&#xff08; Show status &#xff09; 和 行动&#xff08; Action &#xff09; 两个部分。字母 S 的部分…

2023-python-import耗时是为什么?

场景 场景&#xff1a; 树莓派4B 离线安装【arch64架构】 了 torch,sklearn等机器学习库 运行程序文件时候&#xff0c; import的时间总共花了 10s&#xff0c;无法忍受。 查阅下网站&#xff1a; import官方说辞 看蒙了&#xff0c;太多了&#xff1b; 反正就看看大概&…

手写Spring:第9章-Aware感知容器对象

文章目录 一、目标&#xff1a;Aware感知容器对象二、设计&#xff1a;Aware感知容器对象三、实现&#xff1a;Aware感知容器对象3.1 工程结构3.2 Spring感知接口类图3.3 定义标记接口和容器感知类3.3.1 定义标记接口3.3.2 对象工厂感知接口3.3.3 类加载感知接口3.3.4 对象名称…

Java“牵手”唯品会商品详情数据,唯品会商品详情API接口,唯品会API接口申请指南

唯品会平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取唯品会商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;…

大数据Flink(七十四):SQL的滑动窗口(HOP)

文章目录 SQL的滑动窗口(HOP) SQL的滑动窗口(HOP) 滑动窗口定义:滑动窗口也是将元素指定给固定长度的窗口。与滚动窗口功能一样,也有窗口大小的概念。不一样的地方在于,滑动窗口有另一个参数控制窗口计算的频率(滑动窗口滑动的步长)。因此,如果滑动的步长小于窗口大…

UNext:基于 MLP 的快速医学图像分割网络

UNext 会议分析摘要贡献方法整体框架1.Shifted MLP2.Tokenized MLP Stage 实验1.对比实验2.消融实验2.1 模块的消融实验2.2 通道数的探索 可借鉴参考 会议分析 期刊&#xff08;会议&#xff09;名&#xff1a; MICCAI 2022 会议信息&#xff1a; 属于顶会了 有代码&#xff1…

【经验分享】如何使用VSCode对比两个文件

问题&#xff1a; 当有两个不同版本的文件&#xff0c;如何使用VSCode对比两个文件 解决办法 长按ctrl选择想要对比的两个文件-----右键选择将已选项进行比较----大功告成 大功告成