精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一行MD5居然讓小伙伴都回不了家!

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-07-04 11:20 ? 次閱讀

需求是什么

這里不再介紹具體的業務。簡而言之,有兩個接口(查詢、確認)對前端頁面提供服務。

查詢接口返回的數據依賴于本地數據與外部接口計算后的結果,也就是頁面展示的是數據快照。確認接口是按照頁面的展示結果請求外部接口。

考慮到用戶打開展示頁面時的數據與提交操作可能間隔很久,實際請求時結果已發生變化,而這種操作會影響業務結果。因此在提交時會進行一次 check,如果發現數據發生變化需要提示頁面進行刷新。

為了方便大家理解,我簡單的畫了個圖,畢竟上面太啰嗦了。

查詢接口:

3100c474-19aa-11ee-962d-dac502259ad0.png

確認接口:

3110d616-19aa-11ee-962d-dac502259ad0.png

雖然這個圖有點草率,但是相信看到這里的小伙伴(默認都是聰明的)都對需求了然于胸了。

我怎么搞得

掰扯了半天,我們的主角 MD5 還沒有出場,別著急,馬上就來了。

你也可以想想,這個場景和 MD5 是怎么扯上關系的呢?

可以看出,這里需要前端將查詢接口的返回值重新組裝作為確認接口的入參。而后端需要再次走數據聚合的邏輯與前端傳過來的業務值進行比較,如果不匹配則提示頁面需要刷新。

一切看起來都順理成章,那么小編遇到了什么問題呢?

簡單來說有兩點:

  • 前端同學表示值不好傳,因為這個頁面比較復雜,具體原因小編也沒深究,可能是被糊弄了。
  • 后端同學(也就是小編)發現,這樣查詢接口和確認接口耦合很嚴重,如果確認接口需要新的入參,那么就需要改動查詢接口。隨著查詢接口邏輯越來越復雜,確認接口的一個入參就需要一層一層的傳過來。很不友好。

呵呵,機智的小編靈機一動,便想到了了MD5,看看百度百科怎么說:

MD5 信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個 128 位(16 字節)的散列值(hash value),用于確保信息傳輸完整一致。

一圖勝千言:

315f7abe-19aa-11ee-962d-dac502259ad0.png

在工程,它差不多就是這么用。

String md5= Md5Utils.get(String source);

可能有聰明的小伙伴會說了,這是散列函數存在哈希碰撞,不同的字符串也有可能生成相同的哈希值。

是的沒錯,但是在小編的業務場景中,這種出現的概率微乎其微,忽略不計,解釋權歸小編所有。

那么具體怎么做的呢,還是看圖說話.

改造后的查詢接口:

316e064c-19aa-11ee-962d-dac502259ad0.png

改造后的確認接口:

318ed354-19aa-11ee-962d-dac502259ad0.png

我們需要對查詢接口返回的業務集關鍵屬性進行組合哈希,這樣可以生成數據快照值。確認接口無需再傳入業務集合,只需要傳入數據快照值,后端進行對比即可知道是否發生變更。

一切都是那么的美好,接下來就到了動人心魄的編碼環節。話不多說,小編的項目中引入了hutool包,什么你不知道糊涂包?

31abc0a4-19aa-11ee-962d-dac502259ad0.png

真不錯,果然是效率擔當,一行代碼就搞定了。

/**
*生成數據哈希
*/
privateStringgenerateSnapShotHash(AcceptListQueryWrapResultDTOwrapResultDTO){
StringBuilderbuilder=newStringBuilder();
for(AcceptListQueryResultDTOitem:wrapResultDTO.getAllList()){
builder.append(item.getQuotationId()).append(item.getOperateType()).append(item.getPriceTypeCN());
}
returnMD5.create().digestHex16(builder.toString());
}

請各位看官記住這行代碼:

MD5.create().digestHex16(builder.toString());

畢竟它就是糊弄你點進來的罪魁禍首。

出了什么事

當小編開發完以后,開心的部署在了測試環境。和前端聯調的時候,發現第一次請求總是超時 ???

一想可能是mock平臺的問題,畢竟三方的查詢接口還沒開發完成,就不以為然。請注意,只是第一次超時。同樣的請求參數第二次光速返回。呵呵,你說不是環境的問題,小編自己都不大信呢。

友方的接口開發完了,小編期待的換上了對方的接口。結果現實給了小編一記左勾拳,還是第一次超時。這不科學?于是小編對自身產生了懷疑?難道不是環境的問題?

于是連忙在本地測試了一下,居然是光速返回。作為自信的人一定不是代碼的問題,那么這個鍋往哪里甩呢?又臭又硬的小編狠狠的思考了一分鐘,又將鍋甩給了業務網關(統一接收HTTP請求)肯定是它的毛病,畢竟測試環境的網關出問題很常見。

于是開開心心的準備上預發了。上了預發絕對沒問題!!!小編信誓旦旦的對QA說道。

上帝為你關上一扇門的同時也會為你關上一扇窗,預發環境第一次還是超時!!!小編覺得很慚愧對不起一起上線的小伙伴,畢竟大家都準備十點下機了。

小編陷入了沉思中。。。

怎么修好的

排查了預發環境的接口,友方的杰夫接口TP99只有幾毫秒,網關也沒有問題,也許是數據庫的原因,排查發現也沒有問題。頓時,小編又迷茫了。

山重水復疑無路柳暗花明又一村,機智的小編想到了國內知名廠商開源的一款java診斷工具Arthas,利用它可以查看方法詳細耗時。點我查看 主動打開另一扇窗。

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

  • 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
  • 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
  • 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
  • 是否有一個全局視角來查看系統的運行狀況?
  • 有什么辦法可以監控到 JVM 的實時運行狀態?
  • 怎么快速定位應用的熱點,生成火焰圖?
  • 怎樣直接從 JVM 內查找某個類的實例?

由于預發環境還是比較麻煩,于是小編在測試環境準備好了arthas環境。

下面簡單介紹下使用步驟:

  • 下載全量包 arthas-bin.zip
  • 解壓
  • chmod -777 arthas-boot.jar
  • 啟動 sudo -u admin -EH java -jar /home/export/App/arthas-boot.jar

當看到圖標出現時,即啟動成功。具體使用方法可以查看官網,此處不再贅述。

我們使用trace命令查看方法耗時,同時在頁面請求該查詢接口。

trace --skipJDKMethod false com.jd.universal.inquiry.service.protocol.jsf.AcceptListWebErpServiceImpl queryList

31fed596-19aa-11ee-962d-dac502259ad0.png

可以看到這行生成數據快照的方法,耗時占整個接口的99.57%,緊接著我們繼續監控generateSnapShotHash方法:

trace --skipJDKMethod false com.jd.universal.inquiry.service.protocol.jsf.AcceptListWebErpServiceImpl generateSnapShotHash

321e76c6-19aa-11ee-962d-dac502259ad0.png

可以看到方法的耗時都集中在

[99.99% 36562.318173ms ] cn.hutool.crypto.digest.MD5:create() #103

接著再次頁面點擊請求操作,出現以下情況:

3251a14a-19aa-11ee-962d-dac502259ad0.png

可以看到后面多次請求 cn.hutool.crypto.digest.MD5:create()方法耗時僅不到一毫秒。和我們之前遇到的狀況一致。此時已確定是這行MD5導致的第一次加載很慢。

雖然原因找到了,但是還是得看下為什么這行代碼只有在第一次時這么慢,于是我們進入該方法看看它到底搞什么幺蛾子。

可以看到初始化方法如下:

326a5b0e-19aa-11ee-962d-dac502259ad0.png

由于現象是程序第一次運行很慢,后續很快,根據小編多年的寫/修BUG經驗懷疑是這段初始化中存在靜態加載。

32971748-19aa-11ee-962d-dac502259ad0.png

MessageDigest是JDK自帶的類,為應用程序提供摘要算法的,這里我們關注點就落在了上面的一行。我們點進去看一下:

果然我們看到了他在嘗試加載BouncyCastle庫,我們來看一下這個庫的介紹:

BouncyCastle(輕量級密碼術包)是一種用于 Java 平臺的開放源碼的輕量級密碼術包;Bouncycstle 包含了大量的密碼算法,其支持橢圓曲線密碼算法,并提供 JCE 1.2.1 的實現。

32a6343a-19aa-11ee-962d-dac502259ad0.png

所以問題的答案就呼之欲出了,隨著源碼的深入,我們看到:

privatevoidsetup()
{
loadAlgorithms(DIGEST_PACKAGE,DIGESTS);

loadAlgorithms(SYMMETRIC_PACKAGE,SYMMETRIC_GENERIC);

loadAlgorithms(SYMMETRIC_PACKAGE,SYMMETRIC_MACS);

loadAlgorithms(SYMMETRIC_PACKAGE,SYMMETRIC_CIPHERS);

loadAlgorithms(ASYMMETRIC_PACKAGE,ASYMMETRIC_GENERIC);

loadAlgorithms(ASYMMETRIC_PACKAGE,ASYMMETRIC_CIPHERS);

loadAlgorithms(KEYSTORE_PACKAGE,KEYSTORES);

loadAlgorithms(SECURE_RANDOM_PACKAGE,SECURE_RANDOMS);

loadPQCKeys();//sowecanhandlecertificatescontainingthem.
//省略。。。
}

正是由于這些算法實現的加載,導致MD5.create()第一次調用時耗時超過數十秒。

好了,既然找到了問題。那么改動起來就很簡單了,小編嘗試尋找了糊涂包中提供的方法,發現并沒有入參可以關閉該三方加密包的初始化。于是換用了Google提供的MD5的實現。重新打包,部署,一次成功,完美。

后語

QA同學在測試環境測出了這個問題,而自信的本人不屑一顧,堅持自己愚昧的觀點,先認為是Mock的問題,接著又說是網關的問題。由于我的盲目自信,導致上線到很晚,表示非常的慚愧。總結失敗的原因:

32d84f10-19aa-11ee-962d-dac502259ad0.png
  • 合理評估使用第三方包
  • 測試環境遇到的問題盡力去追,不要盲目下結論
  • 要聽QA的話


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6909

    瀏覽量

    88850
  • md5
    md5
    +關注

    關注

    0

    文章

    28

    瀏覽量

    20859
  • Check
    +關注

    關注

    0

    文章

    4

    瀏覽量

    7549

原文標題:震驚,一行MD5居然讓小伙伴都回不了家!!!

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【安全算法之MD5MD5摘要運算的C語言源碼實現

    【安全算法之MD5MD5摘要運算的C語言源碼實現
    的頭像 發表于 09-12 16:32 ?3547次閱讀
    【安全算法之<b class='flag-5'>MD5</b>】<b class='flag-5'>MD5</b>摘要運算的C語言源碼實現

    不知道有沒有用PADS 9.5的小伙伴,我安裝了破解不了喔。

    不知道有沒有用PADS 9.5的小伙伴,我安裝了破解不了喔。求解
    發表于 12-19 23:07

    植物小伙伴

    互聯網上通知我的手機。植物小伙伴基站的設計。左上:內部框架結構。中間:側板連接到框架結構。右上角:LED照明燈試驗基地。LED燈的底部被蓋上了層半透明的丙烯酸。這允許光散射在丙烯酸和散射光在基地。基站
    發表于 09-16 17:14

    【云智易申請】辦公桌上的智能小伙伴

    申請理由:我的項目“辦公桌上的智能小伙伴”已入圍2015中國硬件大賽,其中重要技術Wifi的接入是關鍵,想通過貴公司的開發板學習下。項目描述:1.本產品是基于建立智能辦工桌的思路進行研發的
    發表于 08-15 01:10

    【MiCOKit申請】辦公桌上的智能小伙伴

    申請理由:我的項目“辦公桌上的智能小伙伴”已入圍2015中國硬件大賽,其中重要技術Wifi的接入是關鍵,想通過貴公司的開發板學習下.項目描述:1.本產品是基于建立智能辦工桌的思路進行研發的
    發表于 08-19 09:59

    MD5計算hex文件的過程是什么

    大家好, 是否可以在SPC工作室中計算Hex文件或elf的MD5校驗和,如果是,請告訴我計算MD5的過程。 提前致謝, ---謝謝&amp;問候,Mujeeb以上來自于谷歌翻譯以下為原文 Hi
    發表于 02-13 08:35

    C#教程之MD5加密

    C#教程之MD5加密,很好的C#資料,快來學習吧。
    發表于 04-20 15:27 ?14次下載

    labview md5加密算法.llb

    md5加密算法 md5加密算法 md5加密算法 md5加密算法
    發表于 05-25 14:25 ?111次下載

    md5算法原理與實現

    MD5為計算機安全領域廣泛使用的種散列函數,用以提供消息的完整性保護。用于確保信息傳輸完整致。是計算機廣泛使用的雜湊算法之,主流編程語言普遍已有
    發表于 12-28 08:42 ?7109次閱讀
    <b class='flag-5'>md5</b>算法原理與實現

    MD5算法硬件加速模型

    針對MD5軟件實現方法存在占用資源大、安全性差等缺點,提出了基于NetMagic平臺的MD5硬件加速模型設計方案,并基于ModelSim和NetMagic平臺對提出的非流水線與流水線硬件加速模型進行
    發表于 01-12 16:45 ?0次下載
    <b class='flag-5'>MD5</b>算法硬件加速模型

    md5算法可逆嗎_MD5值是什么

    MD5不可逆的原因是由于它是種散列函數(也叫哈希函數,哈希函數又稱散列函數,雜湊函數,他是個單向密碼體制,即從明文到密文的不可逆映射,只有加密過程沒有解密過程,哈希函數可以將任意長度的輸入經過
    的頭像 發表于 11-16 15:30 ?1.3w次閱讀

    md5是什么_md5怎么用

    MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),種被廣泛使用的密碼散列函數,可以產生出個128位(16字節)的散列值(hash value),
    的頭像 發表于 11-16 15:42 ?1.2w次閱讀

    md5校驗失敗怎么解決

    英雄聯盟更新包md5校驗失敗怎么辦?將給大家介紹兩種解決問題的方法,都是可以完美的解決更新包md5校驗失敗問題。第種不行就換第二種;第二種不行換第三種。
    的頭像 發表于 11-16 15:50 ?3.9w次閱讀

    Linux獲取文件MD5碼命令md5sum詳解

    md5sum 用于計算和校驗文件的MD5值。
    的頭像 發表于 10-27 11:20 ?3319次閱讀
    Linux獲取文件<b class='flag-5'>MD5</b>碼命令<b class='flag-5'>md5</b>sum詳解

    Linux中文件MD5校驗方法

    由于生成的md5信息中,每個md5值后都緊跟著對應的文件的路徑(可能是相對路徑),于是將生成的md5保存到某個文件中,以后可以使用該文件來檢查md5值對應文件內容是否發生了修改。
    發表于 04-22 12:40 ?615次閱讀