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. 更…

ElementUI浅尝辄止20:Pagination 分页

分页组件常见于管理系统的列表查询页面&#xff0c;数据量巨大时需要分页的操作。 当数据量过多时&#xff0c;使用分页分解数据。 1.如何使用&#xff1f; /*设置layout&#xff0c;表示需要显示的内容&#xff0c;用逗号分隔&#xff0c;布局元素会依次显示。prev表示上一页…

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.爬取…

关于 Nginx 的哪些事

关于 Nginx 的哪些事 1、Nginx 主要功能2、Nginx 的常用命令2.1、启动Nginx2.2、停止 Nginx2.3、重新加载Nginx 配置2.4、检查Nginx配置文件2.5、指定配置文件2.6、检查Nginx版本2.7、显示Nginx帮助信息 3、Nginx 配置文件 nginx.conf3.1、Nginx 配置文件&#xff08;nginx.con…

NLP:生成熟悉NLP开源工具,如NLTK、 HanLP等,并搜寻、下载和熟悉PKU、 CoreNLP, LTP MSR, AS CITYI 等语料库。

目录 一、NLTK 二、HanLP 三、PKU 四、CoreNLP 五、LTP 六、MSR 一、NLTK NLTK&#xff08;Natural Language Toolkit&#xff09;是Python的一个开源自然语言处理库。它提供了大量已经预处理好的文本数据和语料库&#xff0c;以及一些常用的文本处理算法和NLP工具。例如&…

插入排序——希尔排序

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…

2023年度AWS SAP直冲云霄训练营学习分享

AWS在公有云市场一直处于行业领先地位&#xff0c;其培训认证体系也是非常的完善的。而且经常在国内组织一些技术论坛&#xff0c;技术分享&#xff0c;公开课&#xff0c;训练营等技术活动。 AWS训练营适合希望学习和考取AWS助理级架构师/专家级架构师&#xff08;AWS SAA/AW…

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…

Scikit-learn:全面概述

引言&#xff1a; 在机器学习领域&#xff0c;Python已经成为一种重要的编程语言&#xff0c;这得益于其简洁、多功能和丰富的库。在这些库中&#xff0c;Scikit-learn作为其中最受欢迎和强大的之一&#xff0c;脱颖而出。它提供了各种工具、算法和功能&#xff0c;使用户能够…

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; 反正就看看大概&…