一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

3天內不再提示

探討篇(三):代碼復用的智慧 - 提升架構的效率與可維護性

京東云 ? 來源:京東物流 馮志文 ? 作者:京東物流 馮志文 ? 2024-12-27 15:58 ? 次閱讀

作者:京東物流 馮志文

前兩篇從服務粒度和服務內的分層架構角度探討,本文繼續(xù)從服務間代碼復用角度探討。

背景

在分布式架構中,代碼復用是個難題。那么如何處理代碼功能共享的問題呢?本文結合日常實踐中的案例,介紹幾種分布式架構中管理代碼復用性的技術。包括代碼復制、共享代碼庫(jar包)、共享服務、邊車服務。對于每一種技術,列出優(yōu)缺點、適合場景權衡。

本文的觀點源自我在學習與實踐過程中的深思熟慮,尚處于不斷探索和驗證的階段。希望能“拋磚引玉”,激發(fā)更多的討論與交流。讓我們共同進步,在探討與實證中尋求真知。

一、代碼復制

共享的代碼被復制到每一個服務中。這種技術在服務早期比較流行。雖然現(xiàn)在代碼復制比較少見,但它還是解決跨多個分布式服務的代碼復用的有效技術。但這種缺點很明顯,因為如果在代碼中發(fā)現(xiàn)錯誤或需要對代碼進行重構改造,需要在包含該代碼庫的所有服務變更。

這種技術在一些場景比較有用,比如服務需要的高度靜態(tài)的一次性代碼。這種類型的代碼非常適合復制,因為它是靜態(tài)的并且不包含任何錯誤。比如很多通用的業(yè)務識別邏輯就用這種方式,在不同應用代碼庫個應用中編寫。

案例1:根據(jù)sendpay標位判斷XXX代碼

public static boolean isXXX(String sendpay) {
    boolean flag = false;
    String sendpay_x = Character.toString(sendpay.charAt(x));
    String sendpay_y = Character.toString(sendpay.charAt(y));
    if (("1".equals(sendpay_y) || "2".equals(sendpay_y) || "0".equals(sendpay_y))
            && "1".equals(sendpay_x)) {
        flag = true;
    }
    return flag;
}

案例2:新功能上線DUCC開關

/**
 * XXX功能 控制開關
 */
private boolean enableLargeApplianceSendMsg = false;

public boolean isEnableLargeApplianceSendMsg() {
    return enableLargeApplianceSendMsg;
}

public void setEnableLargeApplianceSendMsg(boolean enableLargeApplianceSendMsg) {
    this.enableLargeApplianceSendMsg = enableLargeApplianceSendMsg;
    log.info("enableLargeApplianceSendMsg: {}", enableLargeApplianceSendMsg);
}

代碼復制技術
優(yōu)點 1、無代碼共享
缺點 1、代碼分散各應用中,變更起來比較復雜。 2、無法保證跨服務代碼一致性,有時候容易遺漏某個地方未修改 3、缺乏跨服務版本控制能力
適合場景 1、關聯(lián)應用較少,比如2-3個左右可以接受,如果牽扯應用較多(比如5+,具體如何確定“較多”的基準或者指標待定)則不適合,同時核心要思考是不是服務粒度拆分的太細了? 2、簡單的靜態(tài)代碼(比如公共工具類,業(yè)務邏輯通用類) 3、變更頻率較低

二、共享代碼庫

共享代碼庫是共享技術的常用技術之一。共享代碼庫是一個外部組件(比如JAVA的jar包),共享代碼庫比代碼復用更高一層級?;诠δ軇澐郑峁┹^為獨立的功能。比如目前采用了根據(jù)基礎能力和業(yè)務模塊抽象時效內核JAR包方式,詳見下圖中時效計算內核jar包。為什么要采用這種方式呢?后文會說明權衡點。

jar包引入看起來簡單,在編譯時被整合和共享。但其實也有利弊取舍和復雜性。其中最重要的是代碼庫的共享庫粒度和版本控制。

1、依賴管理和變更控制

如果粗粒度共享庫中任何類文件發(fā)生變更,都需要每個服務變更、測試、部署。這極大的增加了共享庫更改的整體測試范圍。粗粒度共享庫的變更會影響多個服務,但會減少依賴關系。

將共享庫分解為更小的基于功能的共享庫(比如拆分為 ABCDE等),這樣有利于變更控制和整體可維護性。但這會造成依賴管理的混亂。如下圖,業(yè)務根據(jù)不同業(yè)務域拆分不同 jar包,導致jar包依賴復雜。

chaijie_default.png

共享庫對少量的應用可能并不重要,但隨著服務數(shù)量增加,變更管理和依賴管理相關的問題也會增加。

建議:避免大的粗粒度的共享庫,盡可能爭取更小的、功能分區(qū)的庫,有利于變更控制而不是依賴管理。

2、版本控制策略

對于共享庫來說,版本控制需要向后兼容(后退、考慮舊版本兼容),同時也需要高度敏捷性。比如a.jar包變更升級版本為1.1,只需要1個服務上線,其他N個服務不會有任何影響。這雖然看起來版本控制很簡單,但同樣存在權衡和隱藏的復雜性。比如下次N個應用也需要上線。并且依賴管理混亂(服務ABC依賴a.jar版本1.1,服務DEF依賴a.jar版本1.0),復雜性不僅體現(xiàn)在版本變更的通知,也存在舊版本棄用的情況。

共享代碼庫技術
優(yōu)點 1、減少重復代碼 2、不受網絡影響,性能更加穩(wěn)定。對性能要求較高的場景使用該方式會有一定優(yōu)勢; 3、節(jié)省服務器硬件成本,尤其服務器QPS高,需要部署大量服務器資源的場景下。 4、支持版本變更
缺點 1、可維護性較差,依賴了該組件的服務都需要跟著一起升級,隨著時間的推移,梳理維護起來會很麻煩; 2、組件升級成本高且風險較大,成本包括了開發(fā)維護升級各個服務的成本、測試驗證的成本及運維發(fā)布的成本,需升級維護的服務越多,成本越高,對應的風險也越大。 3、容易jar包沖突 4、版本溝通可能很困難 5、依賴可能難以管理、版本棄用可能很復雜 6、如jar包過大,維護困難,并且調用方引入過多項目無用代碼
適合場景 1、無隱形依賴,更新頻率低和更新影響小的代碼,比如通用的判斷訂單、運單校驗 2、服務器資源硬件成本控制要求較為嚴格,盡量降低成本。 3、內部一些公共功能處理場景,不涉及到數(shù)據(jù)庫資源層面的連接和調用,適合組件化的方式; 4、對性能要求較高的應用

為什么時效內核需要采用jar包給下單前下單后各應用這種方式呢?結合上面的優(yōu)缺點,主要權衡核心點如下

1.應用場景相關:XX是下單前商詳結算等高并發(fā)場景,下單后訂單生產節(jié)奏控制。

2.降本:預估降低了服務器硬件成本XXX核左右

3.性能:通過JAR包的依賴的方式來較少RPC調用,提升了接口性能TP99,尤其是用戶在商詳、結算提單頁面

4.更新頻率低:由于時效內核更新頻率較低,一年1-2次左右的改動點

三、共享服務

共享服務技術通過將共享功能服務化來避免重復使用。對應上面改造,把時效內核jar包進行服務化時效內核應用,具體架構圖如下:

共享服務是分布式中常見的共享服務的方法,但也需要權衡,比如變更風險、性能、可伸縮性、容錯性。

1、變更風險

使用共享服務變更共享代碼是一把雙刃劍。 只需要共享服務部署上線,但共享服務的變更可能在運行時破壞其他服務。那必須牽扯版本控制、共享代碼庫是在編譯的時候綁定版本控制,降低更改風險。但如何在共享服務中版本化變更呢?使用API版本控制。但使用API版本控制有個問題,很多服務協(xié)議不是restful api,而是rpc或者消息mq,這樣會使得版本控制復雜。

共享服務雖然版本控制可以幫助降低這風險,但它的應用和管理更復雜。

2、性能

共享功能服務必須進行服務間調用,存在網絡延遲開銷而影響性能。

3、可伸縮性

共享服務一定要隨著調用服務的規(guī)模進行伸縮

共享服務技術
優(yōu)點 1、減少重復代碼 2、高度解耦: 每個服務都是獨立的,可以獨立開發(fā)、部署和擴展,提高了系統(tǒng)的可維護性和可擴展性。 3、快速迭代: 服務可以根據(jù)需求快速更新和迭代,更容易適應業(yè)務變化。 4、資源隔離,互不影響,對調用方隱藏內部細節(jié)。
缺點 1、增加硬件成本 2、性能受到網絡延遲影響 3、服務依賴導致 容錯性、可用性、可伸縮性、吞吐量問題 4、版本控制可能困難 5、分布式固有問題:比如一致性、分布式事務處理等
適合場景 1、適合多語言的環(huán)境 2、共享功能頻繁變化 3、不需要太多的服務器資源 4、對性能要求不高

四、邊車和ServiceMesh服務網格

"邊車服務"(Sidecar Pattern)這個術語來源于摩托車的邊車(sidecar),這是一種附加在摩托車旁邊的一輪車廂,可以搭載乘客或貨物,但它不是摩托車本身的核心部分。

邊車服務(Sidecar Pattern)在微服務架構中用于將一些與業(yè)務邏輯不直接相關的控制面(如注冊發(fā)現(xiàn)、熔斷限流、pfinder鏈路追蹤監(jiān)控、DUCC配置管理等)從應用程序中分離出來。這樣,應用程序可以專注于業(yè)務邏輯,而邊車服務則負責處理其他方面的問題。

chaijie_default.png

邊車服務的關鍵特點包括:

?復用性:由于邊車服務可以被多個主應用共享,因此一些通用的功能(如服務發(fā)現(xiàn)、斷路器、限流器等)可以在不同的服務之間重用,減少了代碼的冗余。

?隔離性:邊車為主應用提供了一個清晰的隔離層,使得主應用可以專注于業(yè)務邏輯,而不必關心其他非功能性的問題。 邊車服務是主應用程序的附屬,為主應用提供支持和增強功能。

?易于維護:邊車的引入使得對于共享功能的更新和維護變得更加簡單,因為這些功能被集中到單獨的服務中,不需要在每個應用中單獨進行修改。

?透明性:對于主應用程序來說,邊車的存在應該是透明的,主應用不需要知道邊車的具體實現(xiàn)細節(jié)。

?獨立性:邊車服務可以獨立于主應用程序更新和維護,無需修改主應用程序的代碼。

通過使用邊車模式,開發(fā)人員可以將關注點分離,使主應用程序更加簡潔,只關注業(yè)務邏輯的實現(xiàn),而將服務治理等通用性問題交給邊車服務處理。

如果每個服務都包含邊車組件,那么它就形成了服務網格。每個服務右邊的盒子都互相連接,形成一個“網格”

chaijie_default.png

服務架構是圍繞各自領域組織的,但服務治理運維耦合需要橫切這些領域

五、總結

技術最終是要服務于業(yè)務,每種技術選擇沒有絕對的好壞,各有優(yōu)缺點,適合場景。具體應該用哪一種,需要根據(jù)成本、團隊技能、系統(tǒng)的未來發(fā)展綜合考慮,目前團隊系統(tǒng)中上面幾種情況都存在。正如軟件架構定律:軟件架構中的一切都是在權衡,架構背后的原因比方法更重要。

審核編輯 黃宇

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

    關注

    1

    文章

    970

    瀏覽量

    75076
  • 代碼
    +關注

    關注

    30

    文章

    4880

    瀏覽量

    69999
  • 架構
    +關注

    關注

    1

    文章

    525

    瀏覽量

    25802
  • 復用
    +關注

    關注

    0

    文章

    7

    瀏覽量

    12064
收藏 人收藏

    評論

    相關推薦

    如何應用設計模式的思想寫出更優(yōu)質的嵌入式軟件應用程序代碼

    而言,代碼復用可移植性要求越來越高,以獲得更短的項目周期 和更高的可維護性。下面是AIOT時代嵌入式設備的常見的軟件框架。
    發(fā)表于 06-12 09:38 ?353次閱讀
    如何應用設計模式的思想寫出更優(yōu)質的嵌入式軟件應用程序<b class='flag-5'>代碼</b>

    談談幾種芯片設計增加代碼復用的方法

    很多芯片在設計之初,就已經考慮如何增加代碼復用,盡量減少工作量,降低錯誤概率。
    的頭像 發(fā)表于 09-12 09:55 ?1578次閱讀
    談談幾種芯片設計增加<b class='flag-5'>代碼</b><b class='flag-5'>復用</b><b class='flag-5'>性</b>的方法

    如何提高嵌入式代碼質量?

    嵌入式代碼的質量是至關重要的。本文將探討如何通過有效的開發(fā)方法和工具來提高嵌入式代碼的質量,以確保系統(tǒng)的可靠可維護性。 理解嵌入式系
    發(fā)表于 01-15 10:48

    15 年代碼經驗,總結出提升 10 倍效率件事!

    【譯者注】本文作者 Matt Watson 已經寫了超過 15 年的代碼,也由此總結出了提升 10 倍效率件事。Matt 表示,一個 10 倍
    發(fā)表于 10-14 17:35

    嵌入式開發(fā)程序的架構和命名規(guī)范

    總是因人而異。很多較大型的代碼寫到最后總是捂不住各種冒出來的bug,其實最大的問題是根基沒有打牢。當然,主要是程序架構的問題,架構的清晰,程序的可讀
    發(fā)表于 11-05 08:22

    嵌入式軟件開發(fā)過程之程序代碼分層

    在嵌入式軟件開發(fā)過程中,在程序架構的搭建完成之后,為了提高項目代碼的可讀可維護性等,應對程序代碼分層
    發(fā)表于 12-21 06:13

    面向可維護性的軟件體系結構設計

    面向可維護性的軟件體系結構設計_胡文生
    發(fā)表于 01-08 15:15 ?1次下載

    代碼的可重用代碼開發(fā)和確保可維護性的關鍵

      所有嵌入式軟件開發(fā)人員都應該了解庫的工作方式及其提供的好處。代碼的可重用是高效、高效的代碼開發(fā)和確保可維護性的關鍵。
    的頭像 發(fā)表于 06-30 14:58 ?1812次閱讀
    <b class='flag-5'>代碼</b>的可重用<b class='flag-5'>性</b>是<b class='flag-5'>代碼</b>開發(fā)和確保<b class='flag-5'>可維護性</b>的關鍵

    ?如何提高HPC SoC的可靠、可用可維護性級別

    在大型數(shù)據(jù)中心和超級計算機的領域,高性能計算 (HPC) 已經變得相當普遍,并且在某些情況下,在我們的日常生活中必不可少。正因為如此,可靠、可用可維護性(reliability
    的頭像 發(fā)表于 02-15 11:37 ?868次閱讀

    MVVM+RAC的基本概念和使用方式

    在iOS開發(fā)中,采用合適的架構模式能夠提高代碼可維護性和可測試。
    的頭像 發(fā)表于 06-06 14:55 ?1421次閱讀

    如何寫出易維護的嵌入式代碼怎么寫?

    面向對象的語言更接近人的思維方式,而且在很大程度上降低了代碼的復雜,同時提高了代碼的可讀可維護性,傳統(tǒng)的 C
    發(fā)表于 08-23 09:42 ?329次閱讀
    如何寫出易<b class='flag-5'>維護</b>的嵌入式<b class='flag-5'>代碼</b>怎么寫?

    javaWeb的MVC架構的原理

    可維護性、可擴展性和重用。在本文中,我們將詳細介紹JavaWeb的MVC架構的原理以及每個組件的作用。 模型(Model) 模型是JavaWeb應用程序中處理數(shù)據(jù)和業(yè)務邏輯的部分
    的頭像 發(fā)表于 12-03 11:48 ?1085次閱讀

    如何采用分區(qū)架構提升車輛的簡易

    維護和制造。 在飛速發(fā)展的汽車制造領域,正在從過去滿載 ECU 的汽車向未來以數(shù)據(jù)為中心的流線型汽車轉變。分區(qū)架構的概念正在重新定義從車輛設計到道路行駛性能、維護和制造流程等各個方面。? 汽車行業(yè)正處于變革,分區(qū)
    的頭像 發(fā)表于 07-11 15:59 ?883次閱讀

    電源濾波器的可維護性如何

    電源濾波器可維護性包括模塊化設計、易拆卸結構、耐腐蝕及散熱材料、定期清潔檢查、元件更換,維護成本低,智能化設計減少人工需求,定期性能測試監(jiān)控性能變化。
    的頭像 發(fā)表于 01-09 09:48 ?342次閱讀
    電源濾波器的<b class='flag-5'>可維護性</b>如何

    設備遠程監(jiān)控與預測維護系統(tǒng)架構設計及應用實踐

    本文探討了在工業(yè)4.0與數(shù)字化轉型背景下,設備管理系統(tǒng)從傳統(tǒng)人工巡檢向智能運維的深刻變革。文章從技術架構、實施路徑和典型應用個方面深入解析了設備遠程監(jiān)控與預測
    的頭像 發(fā)表于 04-15 10:16 ?117次閱讀
    設備遠程監(jiān)控與預測<b class='flag-5'>性</b><b class='flag-5'>維護</b>系統(tǒng)<b class='flag-5'>架構</b>設計及應用實踐