1. 程式人生 > >架構設計:分散式結構下,服務部署釋出

架構設計:分散式結構下,服務部署釋出

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent) # 一、服務釋出簡介 分散式系統架構下,服務釋出是一件很麻煩的事情,特別是在構建自動釋出流程和灰度測試的策略兩個核心方面。通常情況下如果不涉及資料層面的灰度流程,服務可以灰度上線,或者滾動上線,這兩種方式很常用;如果涉及到資料灰度,則可能需要中間服務做不同版本資料之間追平,或者停機維護一次性處理好資料和上線問題,不過後面這種方式風險較大。 # 二、藍綠部署 ![](https://img2020.cnblogs.com/blog/1691717/202011/1691717-20201114151810371-1584603628.png) 新版本上線的時候,並不停掉老版本,新舊兩個版本同時執行,通常還會在負載均衡的策略上傾向於舊版本服務處理請求,這樣新版本就有一個執行的觀察期過渡期,等到新版本平穩執行一段時間後,再把請求都發到新版服務上,舊版本服務完成下線。這種方式在分散式架構下很少使用,對伺服器要求過高。 # 三、滾動釋出 ![](https://img2020.cnblogs.com/blog/1691717/202011/1691717-20201114151823736-1683058953.png) 滾動釋出可以避免藍綠部署的伺服器資源佔用問,首先發布一臺新版本服務,然後停掉一臺老版本服務,新版服務經過觀察之後,再逐步替換掉所有老版本的服務,這樣服務的環境變動比較頻繁,相對不穩定。 # 四、灰度釋出 上述兩種方式在普通業務場景下都還算好操作,分散式系統下的灰度釋出複雜程式相對高很多,基礎流程如下: ![](https://img2020.cnblogs.com/blog/1691717/202011/1691717-20201114151837615-359271335.png) 新版本上線,可能涉及分散式下多個灰度服務,因此在服務在整個鏈路上分發時,都要判斷下個請求是路由到正常服務還是灰度服務,還要對灰度服務做請求的權重控制,不能讓灰度服務處理大量的請求。 **實際策略**:在實際的分散式系統灰度釋出流程,通常會採用如下一個策略: - 配置一個灰度是否開啟的標識; - 配置一批灰度賬戶,通常內部人員; - 配置灰度服務版本標識; - 請求在鏈路執行時,判斷灰度是否開啟; - 判斷當前使用者身份是否是灰度測試賬號; - 獲取當前可以請求的服務列表; - 根據灰度服務版本選擇請求的具體服務; 這個流程非常的複雜,需要很多自定義的策略,還要熟悉分散式框架的底層API原理,要二次重寫來適配灰度策略,設計重寫原生API還容易觸發一些驚喜問題。 # 五、資料庫灰度 如果說最難處理的灰度模式是什麼,就是資料庫的版本灰度問題,通常業務對資料庫改造升級,實際都是通過停機維護來處理的,可能很多開發都經歷過,釋出停服公告,然後在指定時間內把資料全部追平或者二次搬運,再重新提供服務。但是總有些業務場景是不能停機維護的,處理灰度資料的基本策略如下: ![](https://img2020.cnblogs.com/blog/1691717/202011/1691717-20201114151851875-1624270752.png) 該模式中,除了正常的灰度流程之外,需要在灰度資料庫和正常資料中間提供一個數據調配服務,用來解決如下問題:灰度資料庫缺失資料,需要臨時從正常庫拉取,灰度版本失敗,新資料需要重新整合寫入原本正常庫;灰度版本成功,舊版資料遷移等;最終保證資料的平穩升級。 # 六、原始碼地址 ``` GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent ``` **推薦閱讀:程式設計體系整理** |序號|專案名稱|GitHub地址|GitEE地址|推薦指數| |:---|:---|:---|:---|:---| |01|Java描述設計模式,演算法,資料結構|[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent)|☆☆☆☆☆| |02|Java基礎、併發、面向物件、Web開發|[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent)|☆☆☆☆| |03|SpringCloud微服務基礎元件案例詳解|[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base)|☆☆☆| |04|SpringCloud微服務架構實戰綜合案例|[GitHub·點這裡](https://github.com/cicadasmile/husky-spring-cloud)|[GitEE·點這裡](https://gitee.com/cicadasmile/husky-spring-cloud)|☆☆☆☆☆| |05|SpringBoot框架基礎應用入門到進階|[GitHub·點這裡](https://github.com/cicadasmile/spring-boot-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-boot-base)|☆☆☆☆| |06|SpringBoot框架整合開發常用中介軟體|[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent)|☆☆☆☆☆| |07|資料管理、分散式、架構設計基礎案例|[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent)|☆☆☆☆☆| |08|大資料系列、儲存、元件、計算等框架|[GitHub·點這裡](https://github.com/cicadasmile/big-data-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/big-data-parent)|☆☆