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.rhkb.cn/news/129969.html

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

相关文章

Mysql binlog的三种模式statement,row,mixed详解,以及无主键造成复制延时的测试

2.1 Statement 模式的概念 Statement 是基于语句的复制模式。 Statement 模式将数据库中执行的修改操作记录为 SQL 语句&#xff0c;再从数据库上执行相同的 SQL 语句来实现数据同步。 2.2 Statement 模式的优点 Statement 模式的优点是简单明了&#xff0c;易于理解和实现。…

多线程的创建

一、基本概念 1 cpu CPU的中文名称是中央处理器&#xff0c;是进行逻辑运算用的&#xff0c;主要由运算器、控制器、寄存器三部分组成&#xff0c;从字面意思看就是运算就是起着运算的作用&#xff0c;控制器就是负责发出cpu每条指令所需要的信息&#xff0c;寄存器就是保存运…

双系统时间问题、虚拟机扩展空间问题

文献阅读计划&#xff1a; 首先要用ChatGPT查文献&#xff0c;用关键字查询&#xff0c;然后去搜索 add cyun 9.8 但是我发现好难搜啊&#xff0c;或者说相关的关键词搜不出来东西啊。不过师兄倒是搜的挺多的&#xff0c;这一点要再去好好学习一下 双系统时间问题&#xff1a…

LeetCode 50题:实现Pow(x,n)

题目 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.26…

iPhone苹果手机来电收到消息闪光灯闪烁通知提醒功能怎么开启?

iPhone苹果手机来电收到消息闪光灯闪烁通知提醒功能怎么开启&#xff1f; 1、打开iPhone苹果手机上的「设置」&#xff1b; 2、在苹果iPhone手机设置内找到并点击打开「辅助功能」&#xff1b; 3、在苹果iPhone手机辅助功能内找到并点击打开「音频/视觉」&#xff1b; 4、在苹…

9月11日作业

思维导图 代码 #include <iostream> #include<string.h>using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

js中如何实现字符串去重?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set 数据结构⭐ 使用循环遍历⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感…

RJ45水晶头网线顺序出错排查

线序 网线水晶头RJ45常用的线序标准ANSI / TIA-568定义了T568A与T568B两种线序&#xff0c;一般使用T568B&#xff0c;水晶头8个孔对应的8条线颜色如下图&#xff1a; 那1至8的编号&#xff0c;是从水晶头哪一面为参考呢&#xff0c;如下图&#xff0c;是水晶头金手指一面&am…

基于51单片机+DS1302时钟模块+4位数码管显示

一、DS1302时钟模块简介 二、绘制Proteus 仿真电路图 三、编写51单片机代码 #include "DS1302.h"// 位定义 sbit DS1302_DATA P3^3; sbit SCLK P3^2; sbit RST P3^1;// 向DS1302写一个字节 void DS1302_Write_Byte(unsigned char addrOrData) {unsigned char i;f…

docker安装xxl-job连接数据库时显示无法连接问题

背景&#xff1a; 在项目中需要定时任务调度&#xff0c;需要在docker容器中安装xxl-job 遇到的问题 部署成功后&#xff0c;可以访问xxl-job登录界面&#xff0c;点登录没反应&#xff0c;但过一段时间就弹出数据库拒绝连接&#xff0c;说MyBatis连接用户失败 原因&#xf…

【AIGC专题】Stable Diffusion 从入门到企业级实战0601

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第六部分Prompt专题篇《Stable Diffusion Prompt 专题》第01节 《Stable Diffusion Prompt 通用画风操作实战》。本部分内容&#xff0c;位于整个Stable Diffusion生态体系的位置如下图黄色部分所示&#xff1a;…

C++ Day4

目录 仿照string类&#xff0c;完成myString 类 思维导图 仿照string类&#xff0c;完成myString 类 #include <iostream> #include<cstring>using namespace std;class myString {private:char *str; //记录c风格的字符串int size; //记录…

Mysql数据库之常用SQL语句及事务学习总结

数据库介绍 几个常见的缩写&#xff1a; DB&#xff1a;数据库。全称&#xff1a;DataBase。DBMS&#xff1a;数据库管理系统。全称&#xff1a;DataBase Management System。DBS&#xff1a;数据库系统。全称&#xff1a;DataBase System。DBA&#xff1a;数据库管理员。全称…

Mysql join用法详解

本篇文章旨在详细讲解Mysql 中join的用法&#xff0c;并附上例题。 一. left join 首先附上图 这个查询语句最根本的是要找出A表中所有的行&#xff0c; 所以如图所示&#xff0c;A表整个被涂蓝 A与B交叉的那部分可以视为ON后所跟的条件 重点是&#xff1a; 如果A表中有一条…

基于springboot2+mybatis-plus+jsp增删改查

概述 编写简单增删改查&#xff0c;理解之后可以自己试着扩展&#xff0c;相信你也可以&#xff0c;加油&#xff0c;我自己懂了的用注释记在下面方便理解 详细 一、需求&#xff08;要做什么&#xff09; 基于现今最流行的技术实现增删改查demo&#xff0c; 便于初学者上手…

[学习笔记]PageRank算法

参考资料&#xff1a;改变世界的谷歌PageRank算法 pagerank算法用于计算节点重要度 思想 如果网页被更多的入度(被引用)&#xff0c;则网页更重要。 被重要网站引用比被普通网站引用更加凸显重要性。 所以考虑一个网站是否重要&#xff0c;需要看引用它的网站是否重要&#…

从零开始搭建Apache服务器并使用内网穿透技术实现公网访问

Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpo…

Vue之scope属性

简介&#xff1a; 在使用Vue脚手架进行开发时&#xff0c;cli编译的时候本质上处理的是一个个文本文件&#xff0c;也就是字符串。每一个组件&#xff0c;即.Vue文件都是一个文本文件&#xff0c;里面包含着模板、组件对象实例以及style样式。组件化开发时&#xff0c;难免会出…

便捷查询中通快递,详细物流信息轻松获取

在如今快节奏的生活中&#xff0c;快递已成为人们生活中不可或缺的一部分。然而&#xff0c;快递查询却常常让人头疼&#xff0c;因为需要分别在不同的快递公司官网上进行查询&#xff0c;耗费时间和精力。为了解决这个问题&#xff0c;固乔科技推出了一款便捷的快递查询助手&a…