SpEL在動(dòng)態(tài)執(zhí)行業(yè)務(wù)中的應(yīng)用

前言

相信做java后端的coder都對(duì)SpEL有所了解慷暂。

本篇blog不是詳細(xì)介紹SpEL的定義、功能和詳細(xì)的使用方法的文章命黔,是想和大家分享一下實(shí)際業(yè)務(wù)中遇到的問題和最終使用SpEL做為解決方案的思考過程呜呐。

在筆者所處的物聯(lián)網(wǎng)行業(yè)中平臺(tái)端需要對(duì)設(shè)備端上報(bào)的數(shù)據(jù)進(jìn)行監(jiān)控和告警。告警規(guī)則需要支持后臺(tái)配置悍募,可動(dòng)態(tài)配置告警指標(biāo)和告警閾值以及告警短信和郵件的消息模板蘑辑。

這個(gè)業(yè)務(wù)需要中需要?jiǎng)討B(tài)配置3個(gè)數(shù)據(jù)

  • 告警指標(biāo)
  • 告警閾值
  • 告警消息模板

1. 告警指標(biāo)

告警指標(biāo)由業(yè)務(wù)決定了其所在領(lǐng)域內(nèi)的關(guān)注點(diǎn),程序需要能夠根據(jù)配置取得對(duì)應(yīng)的值

2. 告警閾值

告警閾值決定了告警的觸發(fā)條件類似于規(guī)則引擎中規(guī)則命中和工作流引擎中的網(wǎng)關(guān)坠宴。

會(huì)遇到簡(jiǎn)單的關(guān)系運(yùn)算如 temperature > 40(溫度大于40°C觸發(fā)告警)洋魂,多條件關(guān)系運(yùn)算 temperature > 25 & humidity > 30 (溫度大于25°C并且濕度大于30%觸發(fā)告警)等業(yè)務(wù)需求。

3. 告警消息模板

產(chǎn)生了相應(yīng)的告警事件后需要將告警信息通過短信或者郵件發(fā)送出去喜鼓,根據(jù)市場(chǎng)需求平臺(tái)需要支持客戶可以按照自己的行業(yè)特性自行定義告警的內(nèi)容副砍。

基于SpEL強(qiáng)大的運(yùn)行時(shí)執(zhí)行,解決監(jiān)控告警需求

解決動(dòng)態(tài)獲取告警指標(biāo)值

SpEL 支持訪問屬性,數(shù)組,集合庄岖,可以根據(jù)一個(gè)特定的對(duì)象實(shí)例求其內(nèi)部的屬性值

比如需要獲取設(shè)備上報(bào)的電流值

DeviceStatusDTO deviceStatusDto = DeviceStatusDTO.builder()
                .ueSn("P004000000")
                .productCode("6")
                .storeId(20140L)
                .ueType(4)
                .voltage(30.0)
                .electricity(10.0)
                .temperature(40.0)
                .lastReportTime(new Date())
                .build();
                
ExpressionParser parser = new SpelExpressionParser();
Expression expTargetValue = parser.parseExpression("electricity");
// targetValue 即為deviceStatusDto對(duì)象中的electricity屬性值
Object targetValue = expTargetValue.getValue(deviceStatusDto);

解決告警閾值即告警規(guī)則的命中問題

SpEL 支持關(guān)系運(yùn)算

DeviceStatusDTO deviceStatusDto = DeviceStatusDTO.builder()
                .ueSn("P004000000")
                .productCode("6")
                .storeId(20140L)
                .ueType(4)
                .voltage(30.0)
                .electricity(10.0)
                .temperature(40.0)
                .lastReportTime(new Date())
                .build();
                
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("temperature > 55");
boolean fire = exp.getValue(deviceStatusDto, Boolean.class);
if(fire) {
    // 觸發(fā)告警邏輯
    ...
}

告警消息模板

SpEL 支持對(duì)象調(diào)用等對(duì)象操作

DeviceStatusDTO deviceStatusDto = DeviceStatusDTO.builder()
                .ueSn("P004000000")
                .productCode("6")
                .storeId(20140L)
                .ueType(4)
                .voltage(30.0)
                .electricity(10.0)
                .temperature(40.0)
                .lastReportTime(new Date())
                .build();
                
// 根據(jù)SpringEL告警模板生成告警內(nèi)容
ExpressionParser parser = new SpelExpressionParser();
Expression expAlarmDesc = parser.parseExpression("'溫度告警SN:' + ueSn + '溫度:' + temperature + '℃'");
String alarmDesc = expAlarmDesc.getValue(deviceStatusDto, String.class);

使用告警配置表存儲(chǔ)SpEL表達(dá)式滿足市場(chǎng)可自由配置化需求

CREATE TABLE `e_ue_alarm_config` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `version` int(10) NOT NULL COMMENT '版本',
  `create_time` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',
  `modify_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時(shí)間',
  `product_code` varchar(32) NOT NULL COMMENT '產(chǎn)品編碼',
  `alarm_target` varchar(255) NOT NULL COMMENT '告警指標(biāo)(SprEL表達(dá)式)',
  `alarm_condition` varchar(255) NOT NULL COMMENT '告警條件(SprEL表達(dá)式)',
  `alarm_channel` varchar(255) NOT NULL COMMENT '告警通道 郵件:E_MAIL豁翎、App推送: PUSH、短信: SMS ,多個(gè)使用隅忿,號(hào)分割',
  `alarm_receiver` varchar(255) NOT NULL COMMENT '告警接收人',
  `alarm_template` varchar(500) NOT NULL COMMENT '告警內(nèi)容模板(SprEL表達(dá)式',
  `alarm_frequency` int(10) NOT NULL COMMENT '告警頻率(告警間隔時(shí)間 單位:分鐘)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
告警規(guī)則配置示例
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末心剥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子背桐,更是在濱河造成了極大的恐慌优烧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链峭,死亡現(xiàn)場(chǎng)離奇詭異畦娄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弊仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門熙卡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人励饵,你說我怎么就攤上這事再膳。” “怎么了曲横?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵喂柒,是天一觀的道長(zhǎng)不瓶。 經(jīng)常有香客問我,道長(zhǎng)灾杰,這世上最難降的妖魔是什么蚊丐? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮艳吠,結(jié)果婚禮上麦备,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布绽昏。 她就那樣靜靜地躺著惦界,像睡著了一般汁汗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音填物,去河邊找鬼。 笑死霎终,一個(gè)胖子當(dāng)著我的面吹牛滞磺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莱褒,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼击困,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了广凸?” 一聲冷哼從身側(cè)響起阅茶,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炮障,沒想到半個(gè)月后目派,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坤候,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胁赢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了白筹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片智末。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徒河,靈堂內(nèi)的尸體忽然破棺而出系馆,到底是詐尸還是另有隱情,我是刑警寧澤顽照,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布由蘑,位于F島的核電站闽寡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尼酿。R本人自食惡果不足惜爷狈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裳擎。 院中可真熱鬧涎永,春花似錦、人聲如沸鹿响。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惶我。三九已至妈倔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間指孤,已是汗流浹背启涯。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恃轩,地道東北人结洼。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叉跛,于是被迫代替她去往敵國和親松忍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,002評(píng)論 6 13
  • 背景目前階段筷厘,我司主要監(jiān)控告警系統(tǒng)使用的是 Zabbix鸣峭,對(duì)于基礎(chǔ)設(shè)施及應(yīng)用服務(wù)狀態(tài)監(jiān)控,Zabbix 內(nèi)建或由社...
    dennyhong閱讀 11,868評(píng)論 5 21
  • 一酥艳、寫在前面 外賣業(yè)務(wù)持續(xù)高速成長(zhǎng)摊溶,業(yè)務(wù)迭代快,邏輯復(fù)雜充石,關(guān)聯(lián)服務(wù)多莫换。如何快速準(zhǔn)確識(shí)別系統(tǒng)各項(xiàng)指標(biāo)的異常,發(fā)現(xiàn)問題...
    Kungfu貓熊閱讀 3,572評(píng)論 1 97
  • //賦值表達(dá)式var x = 1let y = 2 //三元條件表達(dá)式var z = x > y ? x : y ...
    Deng_1957C閱讀 293評(píng)論 0 0
  • W:好好利用番茄時(shí)鐘骤铃,檢測(cè)記錄今天的學(xué)習(xí)軌跡 O:高效利用自己的時(shí)間拉岁,復(fù)習(xí)更有效果 O:內(nèi)心對(duì)這件事情比較排斥 P...
    高N少女閱讀 178評(píng)論 0 0