<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      工作十年,看到這樣的代碼,內心五味雜陳...

      0
      分享至

      Java精選面試題(微信小程序):5000+道面試題和選擇題,真實面經,簡歷模版,包含Java基礎、并發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!

      看到這樣的代碼,內心五味雜陳

      那天下午,看到了令我終生難忘的代碼,那一刻破防了......

      本文記錄那些年的 Java 代碼軼事

      ヾ(?ω?`) 故事還得從半年前數據隔離的那個事情說起......

      歷史背景

      數據隔離

      預發,灰度,線上環境共用一個數據庫。每一張表有一個 env 字段,環境不同值不同。特別說明:env 字段即環境字段。如下圖所示:


      隔離之前

      ?插曲:一開始只有 1 個核心表有 env 字段,其他表均無該字段;有一天預發環境的操作影響到客戶線上的數據。為了徹底隔離,剩余的二十幾個表均要添加上環境隔離字段。

      「當時二十幾張表已經大量生產數據,隔離需要做好兼容過渡,保障數據安全?!?/p>

      隔離改造

      其他表歷史數據很難做區分,于是新增加的字段 env 初始化 all ,表示預發線上都能訪問。以此達到歷史數據的兼容。

      每一個環境都有一個自己獨立標志;從 application.properties 中讀該字段;最終到數據庫執行的語句如下:


      隔離方案

      「最拉胯的做法:每一張表涉及到的 DO、Mapper、XML等挨個添加 env 字段。但我指定不能這么干!??!」


      具體方案:自定義 mybatis 攔截器進行統一處理。通過這個方案可以解決以下幾個問題:

      • 業務代碼不用修改,包括 DO、Mapper、XML等。只修改 mybatis 攔截的邏輯。

      • 挨個添加補充字段,工程量很多,出錯概率極高

      • 后續擴展容易

      最終落地

      在 mybatis 攔截器中, 通過改寫 SQL。新增時填充環境字段值,查詢時添加環境字段條件。真正實現改一處即可??紤]歷史數據過渡,將 env = ${當前環境} 修改成 env in (${當前環境},'all')

      具體實現邏輯如下圖所示:


      1. 其中 env 字段是從 application.properties 配置獲取,全局唯一,只要環境不同,env 值不同

      2. 借助 JSqlParser 開源工具,改寫 sql 語句,修改重新填充、查詢拼接條件即可。鏈接https://github.com/JSQLParser/JSqlParser

      思路:自定義攔截器,填充環境參數,修改 sql 語句,下面是部分代碼示例:

      @Intercepts(         {@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})} ) @Component public class EnvIsolationInterceptor implements Interceptor {     ......     @Override     publicObjectintercept(Invocation invocation) throwsThrowable {         ......         if (SqlCommandType.INSERT == sqlCommandType) {             try {                 // 重寫 sql 執行語句,填充環境參數等                 insertMethodProcess(invocation, boundSql);             } catch (Exception exception) {                 log.error("parser insert sql exception, boundSql is:" + JSON.toJSONString(boundSql), exception);                 throwexception;             }         }         returninvocation.proceed();     } }

      一氣呵成,完美上線。

      發展演變

      業務需求

      「隨著業務發展,出現了以下需求:」

      • 上下游合作,我們的 PRC 接口在匹配環境上與他們有差異,需要改造

      • 有一些環境的數據相互相共享,比如預發和灰度等

      • 開發人員的部分后面,希望在預發能糾正線上數據等


      SELECT * FROM ${tableName} WHERE bizId = ${bizId} and env in (?,'all')

      初步溝通

      這個需求的落地交給了來了快兩年的小鮮肉。在開始做之前,他也問我該怎么做;我簡單說了一些想法,比如可以跳過環境字段檢查,不拼接條件;或者拼接所有條件,這樣都能查詢;亦或者看一下能不能注解來標志特定方法,你想一想如何實現......

      (●ˇ?ˇ●)年紀大了需要給年輕人機會。

      勤勞能干

      小鮮肉,沒多久就實現了。不過有一天下午他遇到了麻煩。他填充的環境字段取出來為 null,看來很久沒找到原因,讓我幫他看看。(不久前也還教過他 Arthas 如何使用呢,這種問題應該不在話下吧)

      具體實現

      大致邏輯:在需要跳過環境條件判斷的方法前后做硬編碼處理,同環切面邏輯, 一加一刪。填充顏色部分為小鮮肉的改造邏輯。


      大概邏輯就是:將 env 字段填充所有環境。條件過濾的忽略的目的。

      SELECT * FROM ${tableName} WHERE env in ('pre','gray','online','all') AND ${其他條件}

      錯誤原因

      經過排查是因為 API 里面有多處對 threadLoal 進行處理的邏輯,方法之間存在調用。簡化舉例:A 和 B 方法都是獨立的方法, A 在調用 B 的過程,B 結束時把上下文環境字段刪除, A 在獲取時得到 null。具體如下:


      五味雜陳

      當我看到代碼的一瞬間,徹底破防了......


      「queryProject 方法里面調用 findProjectWithOutEnv, 在兩個方法中,都有填充處理 env 的代碼。」

      遍地開花

      然而,這三行代碼,隨處可見,在業務代碼中遍地開花.......

      // 1. 變量保存 oriFilterEnv String oriFilterEnv = UserHolder.getUser().getFilterEnv(); // 2. 設置值到應用上下文 UserHolder.getUser().setFilterEnv(globalConfigDTO.getAllEnv()); //....... 業務代碼 .... // 3. 結束復原 UserHolder.getUser().setFilterEnv(oriFilterEnv);


      改了個遍,很勤勞......

      靈魂開問

      「難道真的就只能這么做嗎,當然還有......」

      • 開閉原則符合了嗎

      • 改漏了應該辦呢

      • 其他人遇到跳過的檢查的場景也加這樣的代碼嗎

      • 業務代碼和功能代碼分離了嗎

      • 填充到應用上下文對象 user 合適嗎

      「大量魔法值,單行字符超500,方法長度拖幾個屏幕也都睜一眼閉一只眼了,但整這一出,還是破防......」

      內心涌動,我覺得要重構一下。

      重構一下

      困難之處

      「在 mybatis intercept 中不能直接精準地獲取到 service 層的接口調用。只能通過棧幀查詢到調用鏈。」

      問題列表

      • 盡量不要修改已有方法,保證不影響原有邏輯;

      • 盡量不要在業務方法中修改功能代碼;關注點分離;

      • 盡量最小改動,修改一處即可實現邏輯;

      • 改造后復用能力,而不是依葫蘆畫瓢地添加這種代碼

      實現分析

      用獨立的 ThreadLocal,不與當前用戶信息上下文混合使用

      注解+APO,通過注解參數解析,達到目標功能

      對于方法之間的調用或者循環調用,要考慮優化

      「同一份代碼,在多個環境運行,不管如何,一定要考慮線上數據安全性?!?/p>

      使用案例

      改造后的使用案例如下,案例說明:「project 表在預發環境校驗跳過」 。

      @SneakyThrows @GetMapping("/importSignedUserData") @InvokeChainSkipEnvRule(skipEnvList = {"pre"}, skipTableList = {"project"}) public void importSignedUserData(     ......     HttpServletRequest request,     HttpServletResponse response) {     ...... }

      「在使用的調用入口處添加注解?!?/p>

      具體實現

      1. 方法上標記注解, 注解參數定義規則

      2. 切面讀取方法上面的注解規則,并傳遞到應用上下文

      3. 攔截器從應用上下文讀取規則進行規則判斷


      注解代碼

      @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface InvokeChainSkipEnvRule {     /**      * 是否跳過環境。默認 true,不推薦設置 false      *      * @return      */     booleanisKip() defaulttrue;     /**      * 賦值則判斷規則,否則不判斷      *      * @return      */     String[]skipEnvList() default {};     /**      * 賦值則判斷規則,否則不判斷      *      * @return      */     String[]skipTableList() default {}; }

      不足之處

      1. 整個鏈路上的這個表操作都會跳過,顆粒度還是比較粗

      2. 注解只能在入口處使用,公共方法調用盡量避免

      那還要不要完善一下,還有什么沒有考慮到的點呢?拿起手機看到快12點的那一刻,我還是選擇先回家了......

      總結思考

      隔離總結

      這是一個很好參考案例:在應用中既做了數據隔離,也做了數據共享。通過自定義攔截器做數據隔離,通過自定注解切面實現數據共享。

      編碼總結

      「同樣的代碼寫兩次就應該考慮重構了」

      • 盡量修改一個地方,不要寫這種邊邊角角的代碼

      • 善用自定義注解,解決這種通用邏輯

      • 可以妥協,但是要有底線

      場景總結

      「簡單梳理,自定義注解 + AOP 的場景」


      自定義注解很靈活,應用場景廣泛,可以多多挖掘。

      反思總結

      • 如果一開始就做好技術方案或者直接使用不同的數據庫

      • 是否可以拒絕那個所謂的需求

      • 先有設計再有編碼,別瞎搞

      最后感想

      在這個只講業務結果,不講技術氛圍的環境里,突然有一些傷感;身體已經開始吃不消了,好像也過了那個對技術較真死摳的年紀;突然一想,這么做的意義又有多大呢?

      來源:https://juejin.cn/post/7294844864020430902

      公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!

      最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!

      文章有幫助的話,點在看,轉發吧!

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      總有人納悶,王健林就算只剩100億,為啥王思聰花錢還是那么大方

      總有人納悶,王健林就算只剩100億,為啥王思聰花錢還是那么大方

      小光侃娛樂
      2025-12-10 22:10:04
      瓜帥:我不想以被解雇的方式離開,我想好好結束

      瓜帥:我不想以被解雇的方式離開,我想好好結束

      懂球帝
      2025-12-20 15:09:22
      何穗忙完工作一天也不想帶娃!回家換完衣跑去看展覽,當媽后多愁

      何穗忙完工作一天也不想帶娃!回家換完衣跑去看展覽,當媽后多愁

      趕山的姑娘
      2025-12-20 21:23:24
      湘潭一村民組開會決議將“外嫁女”所得法院執行款項從其親屬頭上扣除,村支書:對決議不知情,未簽字批準

      湘潭一村民組開會決議將“外嫁女”所得法院執行款項從其親屬頭上扣除,村支書:對決議不知情,未簽字批準

      紅星新聞
      2025-12-20 00:33:11
      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      趣文說娛
      2025-12-20 18:29:20
      少一人仍不輸,47歲蘭帕德率隊1-1,狂攬48分領跑+領先米堡6分

      少一人仍不輸,47歲蘭帕德率隊1-1,狂攬48分領跑+領先米堡6分

      側身凌空斬
      2025-12-20 22:31:10
      上海迪士尼突發一幕,演出被迫中斷!網友:她還在笑,心太大了

      上海迪士尼突發一幕,演出被迫中斷!網友:她還在笑,心太大了

      環球網資訊
      2025-12-20 09:29:14
      我外交部突然發出警告,如果外媒消息屬實,中日事態將會相當嚴重

      我外交部突然發出警告,如果外媒消息屬實,中日事態將會相當嚴重

      芊芊子吟
      2025-12-20 14:07:18
      人類文明現在只有0.73級,宇宙中的7級文明有多可怕?

      人類文明現在只有0.73級,宇宙中的7級文明有多可怕?

      觀察宇宙
      2025-12-20 20:55:31
      金正恩做出重大舉動,矛頭直指高市早苗

      金正恩做出重大舉動,矛頭直指高市早苗

      回京歷史夢
      2025-12-21 02:40:04
      阿房宮遺址考古取得突破性進展

      阿房宮遺址考古取得突破性進展

      環球網資訊
      2025-12-20 15:09:09
      金毛事件大反轉!為減刑出賣白三姐,20萬轉賬記錄撕開人性遮羞布

      金毛事件大反轉!為減刑出賣白三姐,20萬轉賬記錄撕開人性遮羞布

      魔都姐姐雜談
      2025-12-20 04:48:09
      咖啡再次被關注!醫生發現:高血壓患者經常喝咖啡,或有5改善

      咖啡再次被關注!醫生發現:高血壓患者經常喝咖啡,或有5改善

      牛鍋巴小釩
      2025-12-20 16:45:23
      中央明確規定:從明年起,將對普通高中進行擴招。

      中央明確規定:從明年起,將對普通高中進行擴招。

      百態人間
      2025-12-18 05:00:04
      于東來回應高薪招聘英才:哪怕年薪2000萬都無所謂,給的不是財富,是尊重

      于東來回應高薪招聘英才:哪怕年薪2000萬都無所謂,給的不是財富,是尊重

      都市快報橙柿互動
      2025-12-20 11:30:57
      努諾:丟球過早讓一切變得困難,幾個丟球我們都可以做得更好

      努諾:丟球過早讓一切變得困難,幾個丟球我們都可以做得更好

      懂球帝
      2025-12-21 02:00:07
      王楚欽傳來壞消息:背傷診斷結果曝光!林詩棟17天打3站,不休息

      王楚欽傳來壞消息:背傷診斷結果曝光!林詩棟17天打3站,不休息

      侃球熊弟
      2025-12-20 00:15:03
      池莉:半輩子過去了,自己盡是不體面和不高貴,遍體鱗傷

      池莉:半輩子過去了,自己盡是不體面和不高貴,遍體鱗傷

      尚曦讀史
      2025-12-18 09:46:21
      市監局通報“南極磷蝦油”事件:已成立聯合調查組進駐北京同仁堂(四川)健康藥業有限公司開展調查,已對該企業立案

      市監局通報“南極磷蝦油”事件:已成立聯合調查組進駐北京同仁堂(四川)健康藥業有限公司開展調查,已對該企業立案

      極目新聞
      2025-12-20 19:28:56
      底層無貴人,社交無意義

      底層無貴人,社交無意義

      詩詞中國
      2025-12-19 20:34:22
      2025-12-21 03:40:49
      Java精選
      Java精選
      一場永遠也演不完的戲
      1764文章數 3859關注度
      往期回顧 全部

      科技要聞

      許四清:具身智能的"ChatGPT時刻"還未到來

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      體育要聞

      我開了20年大巴,現在是一名西甲主帥

      娛樂要聞

      2026央視跨年晚會陣容曝光,豪華陣仗

      財經要聞

      求解“地方財政困難”

      汽車要聞

      嵐圖推進L3量產測試 已完成11萬公里實際道路驗證

      態度原創

      教育
      親子
      手機
      公開課
      軍事航空

      教育要聞

      別逼孩子死磕高二數學了!我用3個“懶方法”,讓倒數娃沖進前20

      親子要聞

      邊牧和德牧帶娃在外面挖坑,三個小朋友加起來800個心眼子!

      手機要聞

      vivo X200T再曝,天璣 9400+芯片加持

      公開課

      李玫瑾:為什么性格比能力更重要?

      軍事要聞

      澤連斯基:前線局勢愈發艱難

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 国产精品成人一区二区不卡 | 精品人妻久久| 影视先锋av资源噜噜| 男人猛躁进女人免费播放| 少妇视频网站| 国产传媒一区| 中文字幕亚洲天堂| 牛牛视频一区二区三区| 亚洲色小说| 尹人香蕉久久99天天拍| 午夜社区| AV不卡在线| 久久久无码专区| 人妻精品视频| 免费黄色大全一区二区三区 | 久久人妻无码一区二区| 日本丰满白嫩大屁股ass| 国产av永久无码天堂影院| 自拍偷拍网| 屏南县| aa性欧美老妇人牲交免费| 四虎影成人精品a片| h动态图男女啪啪27报gif| 91视频你懂的| 亚洲色欲av| 18禁在线永久免费观看| 99久久精品免费看国产电影| 亚洲欧美色欲天天| 亚洲综合精品一区| 波多野42部无码喷潮| 精品国产一区二区三区大| 欧美福利极品| 亚洲AV综合色区无码| 欧美色aⅴ欧美综合色| 免费国产一级特黄aa大片在线| japanese边做边乳喷| 久草在线资源| 无码内射成人免费喷射| 精品人妻系列无码人妻漫画 | 精品国产一区二区三区久久女人| 亚洲av日韩av永久无码电影|