【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计

在这里插入图片描述

相信大家碰到源码时经常无从下手🙃,不知道从哪开始阅读,面对大量代码晕头转向,索性就读不下去了,又浪费了一次提升自己的机会😭。


我认为有一种方法,可以解决大家的困扰!那就是通过阅读某一次开源的【PR】,从这个入口出发去阅读源码!!


至此,我们发现自己开始从大量堆砌的源码中脱离开来😀,柳暗花明又一村。

一、前瞻

Ok,开始我们今天的PR阅读。

在这里插入图片描述

翻译过来大致意思就是添加提醒通知的功能。翻译如下:

支持提醒通知设计

  • Shenyu admin 提供警报报告 API,/alert/report用于从网关 pulgin 接收警报内容
  • 网关在警报触发时发送警报消息
  • 神宇仪表板支持管理警报接收者名称,警报类型(电子邮件,钉钉,微信…)

我们可以思考下今天的阅读线索了

  1. 什么情况下会触发该警报信息
  2. 要支持多种警报类型,贡献者的代码是怎么设计成可扩展的

二、探索

话不多说,先整体看下本次PR的整体提交,从全局看下做了哪些修改。

在这里插入图片描述

还有很多提交没有截图下来,本次提交代码量可谓巨大了,那我们就先看看最核心的功能shenyu-alert模块

先思考下,既然是告警,核心接口就是发送告警接口,可以看到AlertNotifyHandler的send接口,我们就从这个入口开始探索,看看线索1的答案。

public interface AlertNotifyHandler {/*** send alert.** @param receiver Notification configuration information* @param alert    Alarm information* @throws AlertNoticeException when send receiver error*/void send(AlertReceiverDTO receiver, AlarmContent alert) throws AlertNoticeException;/*** alert type.** @return type*/byte type();
}

通过引用来查询,发现send()方法最终的调用者是通过Controller来触发告警,很奇怪,告警不是应该内部触发吗?

@RestApi("/alert/report")
public class AlertReportController {@Autowiredprivate AlertDispatchService alertDispatchService;/*** report new alert content.** @param alarmContent AlertContentDTO* @return row int*/@PostMappingpublic ShenyuAdminResult reportAlert(@Valid @RequestBody final AlarmContent alarmContent) {alertDispatchService.dispatchAlert(alarmContent);return ShenyuAdminResult.success(ShenyuResultMessage.CREATE_SUCCESS);}}

我们重新回顾下贡献者在PR写下的注释,有提到下面这一条:

Shenyu admin 提供警报报告 API,/alert/report用于从网关 pulgin 接收警报内容

也就是说告警是通过http请求触发,同时触发对象是网关的各个pulgin插件。

那我们再看看pulgin插件什么情况下会发送告警的http请求呢。

我们直接通过全局搜索/alert/report,看看哪些地方触发该http请求。

在这里插入图片描述

再找到对应执行的代码:

public class GlobalErrorHandler implements ErrorWebExceptionHandler {private static final Logger LOG = LoggerFactory.getLogger(GlobalErrorHandler.class);/*** handler error.** @param exchange  the exchange* @param throwable the throwable* @return error result*/@Override@NonNullpublic Mono<Void> handle(@NonNull final ServerWebExchange exchange, @NonNull final Throwable throwable) {LOG.error("handle error: {} formatError:{} throwable:", exchange.getLogPrefix(), formatError(throwable, exchange.getRequest()), throwable);HttpStatus httpStatus;Object errorResult;String errorMsg = "";if (throwable instanceof IllegalArgumentException) {httpStatus = HttpStatus.BAD_REQUEST;errorResult = ShenyuResultWrap.error(exchange, httpStatus.value(), throwable.getMessage(), null);errorMsg = throwable.getMessage();} else if (throwable instanceof ResponseStatusException) {httpStatus = ((ResponseStatusException) throwable).getStatus();String errMsg = StringUtils.hasLength(((ResponseStatusException) throwable).getReason()) ? ((ResponseStatusException) throwable).getReason() : httpStatus.getReasonPhrase();errorResult = ShenyuResultWrap.error(exchange, httpStatus.value(), errMsg, null);errorMsg = errMsg;} else {httpStatus = HttpStatus.INTERNAL_SERVER_ERROR;errorResult = ShenyuResultWrap.error(exchange, httpStatus.value(), httpStatus.getReasonPhrase(), null);errorMsg = httpStatus.getReasonPhrase();}exchange.getResponse().setStatusCode(httpStatus);Map<String, String> labels = new HashMap<>(8);labels.put("global", "error");labels.put("component", "gateway");AlarmSender.alarmMediumCritical("ShenYu-Gateway-Global-Error", errorMsg, labels);return WebFluxResultUtils.result(exchange, errorResult);}}

可以看到调用者实现了Spring的ErrorWebExceptionHandler类,也就是说这个警报的实际调用者是用Spring内置的web错误处理器

到这里我们就解决了我们的阅读线索1了。

什么情况下会触发该警报信息

还没完呢,我们继续阅读线索2的探索:要支持多种警报类型,贡献者的代码是怎么设计成可扩展的

既然要可扩展,肯定有底层接口在设定规则,我们找下这个底层接口。

在这里插入图片描述

这个底层接口其实还是我们上文提到的send接口,可以看到send方法的子类实现有钉钉、邮箱通知。

两个子类实现都是实现相同的底层接口AlertNotifyHandler,只要在配置上配置哪个通知实现,ShenYu alert模块便会实例化对应的通知实现,也就能达到可扩展的目的。

@Component
final class EmailAlertNotifyStrategy implements AlertNotifyHandler { }
@Component
final class EmailAlertNotifyStrategy implements AlertNotifyHandler { }

三、总结

在阅读中,还发现了有个html文件忘记加了开源协议,我们提下PR修复下,又收获了一次开源贡献!!

PR提交戳这。

在这里插入图片描述

未完待续。。。

好了,今天的分享就到这🤔。大家能否感受到通过PR这种方式来阅读源码的乐趣呢

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

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

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

相关文章

基于Spring Boot框架的学生作业管理系统

摘 要 快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生…

从零开始学习在VUE3中使用canvas(二):fillStyle(填充样式)

一、fillStyle概念 在canvas中我们可以用fillStyle定义接下来的图像的样式&#xff0c;默认为黑色#000。 我们可以使用纯色、渐变、和纹理&#xff08;例如图片&#xff09;进行填充&#xff0c;来达到自己想要的效果。 二、代码 <template><div class"canva…

nginx 报Too many open files

nginx 异常报 Too many open files 上周时&#xff0c;nginx已经报 Too many open files 当时把 配置文件调整最大连接65535了&#xff0c;reload 重新加载nginx后不报错了。 cat /proc/14921/limits |grep "Max open file" * soft nofile 65535 * hard nof…

Softing TDX——设计模板

| 高质量的设计模板——减少开发诊断仪所需的工作量 现今&#xff0c;用户对诊断仪的界面和操作理念提出了更高的要求。一个直观的用户界面既能减少用户熟悉诊断仪的时间&#xff0c;又能减少在日常工作中进行诊断任务的时间。然而&#xff0c;创建一个精巧又独立于平台的诊断…

【黑马程序员】Python高阶

文章目录 闭包定义nonlocal关键字作用优缺点优点缺点 装饰器装饰器闭包写法 设计模式单例模式工厂模式优点代码示例 多线程基本概念threading模块 网络编程服务端开发socketsocket服务端编程 客户端开发 正则表达式正则的三个基础方法matchsearchfindAll 元字符匹配单字符匹配数…

代码随想录算法训练营第二十五天|● 216.组合总和III ● 17.电话号码的字母组合(JS写法)

216 组合总和Ⅲ 题目链接/文章讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wg411873x 方法一&#xff1a;自己写的 自己写的&#xff0c;本题和77很像&#xf…

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都被保存在整数集合里面。 另一方面&#xff0c;hashtable编码的集合对象使用字典作为底层实现&#xff0c;字典的每个键都是一个…

web部署 四 限制

案例: 1/设置其下载速度限制:1000000010m&#xff0c;10000001m&#xff0c;2分别查看下载速率是否发生变化。 2/限制连接数&#xff0c;同时下载5个文件。查看第6个是否能正常访问。使用命令符:netstat-n&#xff0c;查看活动链接&#xff0c; 正常情况下我们的下载速度 我们…

遥感深度学习:CNN-LSTM模型用于NDVI的预测(Pytorch代码深度剖析)

代码上传至Github库&#xff1a;https://github.com/ChaoQiezi/CNN-LSTM-model-is-used-to-predict-NDVI 01 前言 这是一次完整的关于时空遥感影像预测相关的深度学习项目&#xff0c;后续有时间更新后续部分。 通过这次项目&#xff0c;你可以了解&#xff1a; pytroch的模…

石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

石油炼化5G智能制造工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。在石油炼化行业&#xff0c;5G智能制造工厂数字孪生可视化平台的出现&#xff0c;为行业的数字化转型注入了新的活力。石油炼化行业作为传统工业的重要领域&#xff0c;面临着资源紧张、环境压力、安…

蓝桥杯练习题——健身大调查

在浏览器中预览 index.html 页面效果如下&#xff1a; 目标 完成 js/index.js 中的 formSubmit 函数&#xff0c;用户填写表单信息后&#xff0c;点击蓝色提交按钮&#xff0c;表单项隐藏&#xff0c;页面显示用户提交的表单信息&#xff08;在 id 为 result 的元素显示&#…

OxyPlot 导出图片

在 OxyPlot 官方文档 https://oxyplot.readthedocs.io/en/latest/export/index.html 中查看 这里用到的是导出到 PNG 文件的方法&#xff0c;不过用的 NuGet 包最新版&#xff08;2.1.0&#xff09;中&#xff0c;PngExporter 中并没有 Background 属性&#xff1a; 所以如果图…

【C语言】C语言内存函数

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是关于C语言内存函数(memcpy,memmove,memset,memcmp)的使用以及部分的模拟实现 memcpy,memmove,memset,memc…

一文搞懂“ReentrantReadWriteLock——读写锁”

文章目录 初识读写锁ReentrantReadWriteLock类结构注意事项 ReentrantReadWriteLock源码分析读写状态的设计HoldCounter 计数器读锁的获取读锁的释放写锁的获取写锁的释放 锁降级 初识读写锁 Java中的锁——ReentrantLock和synchronized都是排它锁&#xff0c;意味着这些锁在同…

docker安装配置dnsmasq

docker下载安装 参考&#xff1a;docker安装、卸载、配置、镜像 如果是低版本的额ubuntu&#xff0c;比如ubuntu16.04.7 LTS&#xff0c;为了加快下载速度&#xff0c;参考&#xff1a;Ubuntu16.04LTS安装Docker。 docker安装dnsmasq 下载dnsmasq镜像 首先镜像我们可以选择…

代码随想录 动态规划-完全背包问题

52. 携带研究材料 时间限制&#xff1a;1.000S 空间限制&#xff1a;128MB 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验…

Could not locate zlibwapi.dll. Please make sure it is in your library path!

背景 运行PaddleOCR时&#xff0c;用的CUDA11.6配的是cuDNN8.4。但是运行后却报错如下。 解决手段 去网上找到这两个文件&#xff0c;现在英伟达好像不能下载了&#xff0c;但是可以去网盘下载。然后把dll文件放入CUDA11.6文件下的bin目录&#xff0c;而lib文件放入CUDA11.6文…

基于 RisingWave 和 Kafka 构建实时网络安全解决方案

实时威胁检测可实时监控和分析数据&#xff0c;并及时对潜在的安全威胁作出识别和响应。与依赖定期扫描或回顾性分析的安全措施不同&#xff0c;实时威胁检测系统可提供即时警报&#xff0c;并启动自动响应来降低风险&#xff0c;而不会出现高延迟。 实时威胁检测有许多不同的…

英特尔生态的深度学习科研环境配置-A770为例

之前发过在Intel A770 GPU安装oneAPI的教程&#xff0c;但那个方法是用于WSL上。总所周知&#xff0c;在WSL使用显卡会有性能损失的。而当初买这台机器的时候我不在场&#xff0c;所以我这几天刚好有空把机器给重装成Ubuntu了。本篇不限于安装oneAPI&#xff0c;因为在英特尔的…

【01】htmlcssgit网络基础知识

一、html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全透明,1…