背景
当前项目需要一个拨测系统来检测服务是否正常运行,拨测系统需要满足以下需求:
支持对接口请求结果做判断。
支持对接口的耗时做判断。
支持重试:可能在某一瞬间网络出现了延迟,导致接口请求失败,所以需要重试,连续重试N次失败才算异常。
失败告警,可配置不同的告警接收人。
通用、可配置:支持各种场景的接口协议。
图表展示(可选)。
方案
拨测系统原理上就是定时检查服务,那是否可以偷懒,拿开源的定时任务系统来改造呢。基于这种想法,在研究多个开源项目之后,选择了xxl-job(当前版本2.2.1)。
改造
1. 添加任务
改造任务界面
以上是xxl-job添加定时任务的界面,先修改jobinfo.index.ftl文件,隐藏掉跟监控无关的字段,隐藏的字段相当于采用了默认值。效果如下:
这里保留了:
任务描述。
Cron:自定义配置执行间隔。
运行模式:常规场景,通过BEAN+JobHandler即可满足, 当拨测的接口协议很复杂,无法使用通用的拨测方法时,这里可以选择GUL模式来自定义请求脚本。
JobHandler:选择拨测类别,当前仅提供了接口HTTP拨测,后续会添加其他的拨测类型,比如redis检查。
任务超时时间:可以当做接口性能检测,判断性能是否符合预期。
失败重试次数:可能在某一瞬间网络出现了延迟,导致接口请求失败,所以需要重试,连续重试N次失败才算异常。
负责人。
报警邮件:拨测失败报警,天企业微信名,多个之间用','分隔。
任务参数:输入拨测时需要的参数,比如拨测的URL。
开发接口拨测Handler
在executor项目开发处理器(xxl-job分为admin和executor两个项目,admin是管理、分发,executor执行定时任务业务逻辑),拨测URL等参数由任务参数来输入,这里选择json作为输入格式,定义了几个json字段:
url:拨测地址,必填。
method:HTTP请求Method,可选,默认是POST。
resultKeys:字符串数组格式,当接口返回值里包含了数组里的每一项时,才算拨测成功,可选。
postBody:POST包体,可选。
HTPP拨测Handler代码:
@Component
@Slf4j
public class DialTestHandler {
private WebClient webClient;
public DialTestHandler() {
webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(
// 允许重定向
HttpClient.create().followRedirect(true)
)).build();
}
/**
* @param param
* @return com.xxl.job.core.biz.model.ReturnT
* @author
* @date
*/
&