淘寶權益玩法平臺的Serverless化實踐

db242d5378cb50ac5869d7ab98af9553.gif

通過對權益玩法平臺現有業務應用的Serverless化改造,權益團隊在雙十一期間完美地支撐了業務需求,在研發效率、運維保障等方面都體現出了很高的價值和收益。

66ec61034b16b665e6cb305af329129a.png

項目背景

淘寶權益平臺是負責淘寶權益營銷的核心團隊,團隊除了負責拉菲權益平臺外,也越來越多地承接營銷IP和輕互動營銷等需求,這類需求除了內容上非常多樣外、交付上也是又多又急,對技術的挑戰性非常大。有別于平臺型應用,營銷IP類需求對業務模型和架構的要求相對不高,但是對開發產研的效率要求非常高,所以我們急需一套可靠的產研體系去支撐營銷IP和輕互動的需求。

權益玩法平臺就是在這樣的背景下誕生的,其設計目標是通過對營銷和玩法通用能力的沉淀和復用,構建出一整套營銷玩法能力體系,來降低業務需求的開發成本,提升業務的交付效率。

5e178e8808148ff1cea0faa75e3f4e2c.png

17eef2e8aad7d8399d8da74f8325e54c.png

基于Ring容器化的嘗試

為了實現既定的設計目標,權益玩法平臺一開始設計了基于Ring容器化能力的方案,Ring是由我們團隊自研開發的JVM容器化框架,支持對業務能力進行動態加載,其核心特點是JVM熱部署和機器按需部署。Ring框架由一個宿主應用和多個業務容器組成,宿主應用提供整體的基礎能力和共享能力,不同業務擴展由各自的容器(farjar載體)實現,通過控制不同的宿主應用分組掛載不同的業務jar包實現業務的隔離效果。借助Ring框架的熱部署能力,可以實現秒級部署能力,效率上有極大的優勢。

基于機器分組的業務隔離能力:

5058eaab050152cbb80c2849f7257eb5.png

基于基座應用和容器應用的產研隔離和熱部署機制:

  1. 平臺開發同學負責基座應用基礎服務和共享服務的開發和運維

  2. 業務開發同學專注于業務邏輯開發,基于熱加載能力部署到基座應用

fabb2facabdaf87f4e5ed0bd7089e448.png


???權益玩法平臺基于Ring的業務形態

權益玩法平臺在Ring的支持下,在同一應用內,實現了對核心業務的獨立部署和對非核心業務混部方案,既滿足了核心業務的穩定性要求,又節省了整體業務的維護成本和資源成本。

3556d59639001a137320b5de7642bf23.png

???Ring架構的優點

效率高:

  1. 由平臺提供中間件和通用服務支持,降低了業務開發成本;

  2. 支持熱部署發布,開發和交付效率高;

隔離性好:

  1. 基于機器分組的強隔離能力保障業務和流量隔離;

???Ring架構的不足
  1. Ring框架本身是為業務擴展設計的,但權益玩法平臺多個業務間并非擴展關系,所以來說Ring并不是最佳的使用場景,使用上也存在系統權限、產研角色等一定的局限性;

  2. 為支持熱部署,Ring框架在應用底層框架上做了很多的改造和定制,除了潛在的內存泄漏等風險外,這些需要業務開發時進行感知的特殊邏輯,也無形中提高了開發和運維的門檻和成本;

???小結

基于Ring架構的權益玩法平臺應用已經能很好的支持業務發展,但同時也存在一些的不足和問題。為更好的支持業務發展,我們也在不斷探索更好的架構和產研模式。也在這個過程中,剛好遇到Serverless的大范圍推廣,在經過調研和比較之后,我們決定擁抱Serverless重構我們的產研體系。

3f61baab2715307774636e00cf016a90.png

初識Serverless

Serverless是個相對比較廣義的概念,從不同的角度可以有不同的解釋。從我的粗淺的理解來說,Serverless可以簡單認為是一種將應用與基礎設施進行分離的架構理念,通過指導軟件架構和職責分工,使開發者更聚焦在業務邏輯,從而減少對基礎設施的關注,其核心要素是架構分層和產研分工:

4db026519b626dcf64b7500d9aa01827.png

從計算機發展的角度看,分層一直是永恒的話題,操作系統分層、網絡分層、文件系統分層,分層讓更多的底層實現得以屏蔽,讓上層使用者只需要通過簡單的API即可使用計算機復雜的能力,在這一過程中,分層變得越來越多、分工也變得越來越細,除了操作系統層面的分層,我們也看到了云服務提供了計算資源的分層,中間件提供了基礎服務的分層,Serverless更進一步提供了業務運行時的分層。有了Serverless,業務開發者不用再關心中間件、機器資源、jvm容器,只需要把業務代碼寫好,剩下的都交給Serverless。

2725c218f6b0d3bd0ec3c52927018411.png

3c0ac621e91f23035e4b3f70e1c7a67e.jpeg

Serverless的設計目標

  1. 免運維:應用的運維工作將由Serverless的服務提供方負責,普通業務開發人員不用再關注機器部署、擴縮容等運維的事情;

  2. 更低成本:借助彈性能力,Serverless會根據應用負載動態進行擴縮容以滿足業務的實際需求,避免了資源的浪費情況;

  3. 快速交付:從普通應用發布要重啟整個jvm容器、中間件相比,Serverless發布粒度可以控制在單純業務代碼維度(業務函數),可以獲得極致的發布效率體驗;

  4. 統一架構:所有的基礎能力都由Serverless基座負責,所以JDK的升級、中間件升級、通用二方包版本維護等不再需要推動每個業務去升級,只需要由專人通過Serverless基座即可完成業務無感升級;

f0e9aff35e8999f6a081f217a181d4ab.png

1fe5dfdcf815b561c3ebd7e5557c1677.jpeg

Serverless應用解構

相較于傳統應用,Serverless應用對于我們認知中的研發體系挑戰還是比較大的,Serverless的整個設計和運作體系都和傳統應用發生了很大的變化,這對于技術研發同學來說,了解這其中的原理和思路是必不可少的。所以我試圖從一個傳統應用出發,通過逐步解構整個過程,粗淺的介紹下Serverless是怎么實現和運作的:

3dcd2c7522acce9e34797c02df5cd422.png

第一層. 普通應用:

我們一般的普通應用都由Pandora容器(隔離容器)加載,其中包括了中間件和業務自己的spring容器

第二層. 業務邏輯拆解

我們日常開發的代碼中,除了業務本身的代碼,肯定也包括很多通用的代碼邏輯,比如對商品、人群等服務的封裝和調用,這些大多數應用都會用到的邏輯,我們卻一直在多個應用間不斷地重復編寫這些代碼。

第三層. 業務容器分層

通過區分業務代碼和通用代碼,我們可以進一步對業務的Spring容器進行拆分,區分成通用Spring容器和業務Spring容器,進而就分別控制不同業務容器的加載和銷毀。

第四層. Serverless化

通過將業務能力和通用能力分層之后,就可以進一步形成以基座應用和業務應用為概念的獨立產品和部署體系,從功能、產研和運維體系上進行了徹底的隔離和分工。

5a95a57598a5239f0c9c5e48976981d5.jpeg

Serverless的產研和交付形式

Serverless對于業務最大的影響就是對原有產研體系的革命,一方面出現了專門的分工人員專職負責Serverless基座的開發和運維角色,另一方面,普通的業務開發不再需要關注機器容器、jvm和中間件等服務,更專注于業務需求實現和交付:

傳統應用交付形式:研發負責整個Docker容器內的所有東西

645e3d3799b1f91cbd831043497ea8a1.png

Serverless的全新產研分工:職責分工,專業的人做自己最專業的事情

0456ab0c53389d457df663d279ad4786.png

Serverless的全新應用交付形式:分層獨立交付

1c623cdbfc63ec74a75dbb9ecca36a99.png

f0f4e4fde8b513d47ebe6f6562e43d32.jpeg

Serverless全新部署體驗

除了能力分層和產研分工,Serverless帶來的還有一個重點特性就是飛一般的部署速度。以往可能需要五~十分鐘才能完成的部署,Serverless縮短到了一分鐘以內,真正讓日常的開發體驗朝著所寫即所得更進一步。

要了解Serverless部署快在哪里,我們要從普通的應用部署流程說起,看看我們平時的部署都慢在哪里:

2da2bb08a3e6e3526b54b1b74241f015.png

上面是我們一個普通應用第一次新部署和更新部署的核心節點,鏡像構建、中間件及基礎服務啟動都是耗費了大量時間,而且為了保障服務不中斷,我們還要考慮分批部署,將原本已經很長的部署時長Double了一下。

為了解決部署耗時的問題,Serverless設計了一套更高效和敏捷的部署體系,其中通過多種機制加速了我們的整個部署流程:

  1. 免業務鏡像構建:

在Serverless體系下,每次業務交付的只剩下業務代碼,已無感知Docker容器,自然也就沒了鏡像構建的必要,鏡像的管理統一交由Serverless基座負責,而且基座內也只會包含中間件和通用業務功能等不頻繁更新的內容,業務的變更內容將通過獨立的fatjar形式動態加載到運行容器中。

  1. 緩存服務容器:

在鏡像標準化的前提下,鏡像的加載和啟動就不用再依賴于業務本身的變更發布,在業務發布使用之前,機器就可以提前把Docker、JVM、中間件、Spring容器、通用服務等加載和啟動起來,并統一緩存到容器緩存池中,業務真正使用的時候只需要拉取已初始完成的容器加載業務代碼,并完成流量切換就可以提供服務。

  1. 滾動發布:

在普通情況下,為了保證服務不中斷,我們至少需要提供兩臺服務機器,發布的時候還需要分兩批平滑發布,除了部署很耗時,測試和調試也是很麻煩。有了Serverless,在預發環境等測試環境我們就可以只部署一臺機器,發布的時候,Serverless會從緩存容器中拉起一臺新的容器進行加載,在完成快速啟動后,進行流量切換就完成了平滑部署,真正讓部署起飛。

通過總結以上幾個核心的機制,Serverless讓一個環境的新部署和更新部署變更非常簡單和高效:

76e93d371d73a1eb4565e1c6b4e1764f.png

729ab64c2c9f41f63c75aa411db6bbf9.jpeg

Serverless插件-通用能力下沉的利器

在Serverless基座中,除了中間件等基礎能力外,更重要的是要承載業務通用能力下沉的重任。一方面,每個業務應用基本都會涉及到需要去對接商品、賬號、人群等二方服務,其中有些服務會存在文檔不全面、依賴臃腫、協議不規范等問題,極大影響了業務開發的質量和效率;另一方面,業務自身也有很多需要復用的業務邏輯,如何快速共享和接入、統一升級和維護也是大家一直來苦惱的問題。對于業務來說,非常需要那么一個解決方案,既能簡單可靠成本低,又能滿足以下所有的能力復用訴求:

  1. 類隔離機制:

不同二方依賴和模塊間通過類隔離來解決模塊間類沖突問題,同時解耦單模塊升級對其他模塊的影響來保障穩定性;

  1. 可控類導出機制:

類隔離機制解決了不同模塊之間的類沖突問題,但業務通用模塊的存在核心還是給上層頁面提供服務,模塊和業務之間不可避免需要通信機制(如進程間通信常用到的socket通信),這就需要可控的類導出機制,控制只導出必要的接口類或者API接口等方式,既要實現通信能力,又要避免了通信模塊和業務代碼之間的類沖突問題和依賴升級問題;

  1. 生命周期管理機制:

如果共享的業務模塊涉及到更復雜的邏輯,就會出現一個模塊內不同功能在何時啟動和初始化的問題。尤其是在Serverless存在容器緩存機制的情況下,就必然需要生命周期管理機制來控制不同邏輯的初始化和銷毀動作,比如在容器緩存時初始化無副作用的邏輯,而在真正使用時再把有其余的功能進行初始化,以滿足不同業務的多樣化訴求;

  1. 統一升級維護能力:

類似于二方包這樣的共享方案,統一升級維護一直是個大難題,聯系人幫忙升級也是常事,所以在Serverless體系下,這也是必然要考慮和解決的問題;

Serverless插件就是給這些問題提出的一個完美解決方案:

c14f7869b7b6ac603a9edd9eccad680f.png

  1. 繼承自Pandora的優秀類隔離機制:每個插件獨享自己的ClassLoader,多個插件之間依賴互不影響,可以獨立升級和切換而不影響其他插件和業務本身;

  2. 多粒度的類導出能力:可以將類的導出控制在最小粒度,在提供服務的前提下將對業務應用的影響控制在最低水平,也最大幅度降低了插件的修改升級對業務潛在的影響和風險;

  3. 完善的生命周期管理:滿足不同插件在不同階段執行自定義邏輯的需求,豐富了Serverless插件的使用場景和想象空間;

  4. 統一的管理和運維能力:借助Serverless的統一基座服務,Serverless插件將由基座維護者統一進行維護,插件的升級等問題都將真正做到業務無感,所有業務應用都可以享受到最新最全的插件帶來的業務效率大提升。

d01cc92f4f94766bdca15e8fe060162a.png

Serverless的優勢小結

通過對Serverless的初步了解和研究,我們也總結出了Serverless的幾個核心優勢,這些優勢也成了我們決定全面擁抱Serverless的關鍵:

高效的產研效率:

  1. 深度集成公司產研體系,應用管理和運維成本都非常低;

  2. 業務開發無需感知和管理中間件和Docker等邏輯,業務開發成本明顯降低;

  3. 基于滾動發布和容器緩存機制,實現了比肩于熱部署的發布效率;

完善的隔離和插件機制:

  1. 完善的類隔離和導出機制,在二方包隔離、插件隔離、沖突規避等方面可以發揮很大的作用;

  2. 通過插件機制,可以方便地實現業務代碼的共享和復用,實現業務能力的有效沉淀

  3. 開放的插件生命周期擴展能力,給業務提供了非常大的創造和想象空間;

運維成本低:

  1. 統一維護的Docker、中間件、JDK、依賴包等能力,讓應用的基礎升級維護變得簡單;

  2. 基于彈性和緩存機器資源池能力的快速動態擴縮容能力,將會降低業務的維護成本;

3d0337b635a95b88b486c9650b2582fc.jpeg

權益玩法平臺的Serverless實現

權益玩法平臺在經歷了以Ring為基礎的運行模式之后,我們開始了全面擁抱Serverless的腳步:

683ff272b721d943b19bbd7d5b8ae453.png

  1. 創建了統一的權益玩法平臺基座,有權益團隊統一維護升級,服務于所有的權益玩法平臺Serverless應用集;

  2. 針對常用的賬號、商品、人群等二方服務,統一通過Serverless插件進行了封裝,業務應用可以開箱即用;

  3. 針對中間件、日志等服務則進行了二次插件封裝,以降低業務的上手成本和使用成本;

同時基于業務擴展型的業務應用,我們通過平臺能力下沉、業務擴展Serverless接入的方式來滿足平臺管控和業務隔離的雙向需求:

60e8f41def7d01e6a8c8d8f7d89c7ea2.png

5ec0b9c68164e15574f5441023d0c9f7.jpeg

成果和收益

通過對權益玩法平臺現有業務應用的Serverless化改造,權益團隊在雙十一期間完美地支撐了業務需求,在研發效率、運維保障等方面都體現出了很高的價值和收益:

  1. 得益于簡化的業務研發流程和豐富的插件支持、業務的部署和交付周期相比于之前減少30%,開發成本大幅降低,業務開發效率提升顯著;

  2. 得益于部署流程優化、容器緩存機制和滾動部署加速,部署時長減少80%,極大縮短了需求交付周期;

b69ed3af0001b62ae9f61cfe3de3194a.jpeg

成果和收益

  1. Serverless作為公認的未來軟件產研體系方向之一,我們也必將持續推進現有業務的Serverless改造,也期望Serverless能給我們的業務技術帶來更多的創新力和想象力;

  2. Serverless作為最新的產研體系,也必然存在著各種問題和挑戰,作為使用Serverless的業務之一,我們也是見證了Serverless從初期問題頻出到最終完美表現雙十一的過程,也期待Serverless能進一步升級優化,提供更強大的能力,助力業務發展。

8c28da832099b90644f19042c00a3d6b.jpeg

團隊介紹

我們是大淘寶技術權益營銷技術團隊,是一支以權益優惠為核心的專業營銷團隊。我們肩負著支撐天貓淘寶雙11、618、雙十二等大促和各類權益營銷活動的使命,是全集團權益營銷策略執行和用戶優惠觸達的主陣地。團隊構建了以權益平臺為核心、權益玩法和互動相結合的完善權益營銷技術體系,實現百萬級的業務峰值流量支撐和億級規模的權益發放能力,為業務打造出覆蓋幾億消費者、千萬商家的全方位營銷解決方案,不斷支撐業務創新的持續發展,成就更高的商業價值。

¤?拓展閱讀?¤

3DXR技術?|?終端技術?|?音視頻技術

服務端技術?|?技術質量?|?數據算法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214441.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1.cloud-微服務架構編碼構建

1.微服務cloud整體聚合父工程 1.1 New Project 1.2 Maven選版本 1.3 字符編碼 1.4 注解生效激活 主要為lombok中的Data 1.5 java編譯版本選8 1.6 File Type過濾 *.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;v…

Nginx配置文件的基本用法

Nginx簡介 1.1概述 Nginx是一個高性能的HTTP和反向代理服務器。 是一款輕量級的高性能的web服務器/反向代理服務器/電子郵件(IMAP/POP3)代理服務器 單臺物理服務器可支持30 000~50 000個并發請求。 1.2Nginx和Apache的優缺點 &#xff…

mybatis數據輸出-insert操作時獲取自增列的值給對應的屬性賦值

jdbc-修改 水果庫存系統的 BaseDao 的 executeUpdate 方法支持返回自增列-CSDN博客 1、建庫建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSE…

王炸升級!PartyRock 10分鐘構建 AI 應用

前言 一年一度的亞馬遜云科技的 re:Invent 可謂是全球云計算、科技圈的狂歡,每次都能帶來一些最前沿的方向標,這次也不例外。在看完一些 keynote 和介紹之后,我也去親自體驗了一些最近發布的內容。其中讓我感受最深刻的無疑是 PartyRock 了。…

基于SSM的健身房預約系統設計與實現

末尾獲取源碼 開發語言:Java Java開發工具:JDK1.8 后端框架:SSM 前端:Vue 數據庫:MySQL5.7和Navicat管理工具結合 服務器:Tomcat8.5 開發軟件:IDEA / Eclipse 是否Maven項目:是 目錄…

網絡安全攻擊預警/態勢預測算法匯總

總結: 網絡安全攻擊預警/態勢預測算法眾多,主要包括: 基于統計學的算法:協方差矩陣、馬爾可夫模型等; 基于機器學習的算法:貝葉斯網絡、聚類算法、支持向量機SVM、遺傳算法、層次分析法AHP、決策樹等&am…

每日一道算法題 1

借鑒文章:Java-敏感字段加密 - 嗶哩嗶哩 題目描述 給定一個由多個命令字組成的命令字符串; 1、字符串長度小于等于127字節,只包含大小寫字母,數字,下劃線和偶數個雙引號 2、命令字之間以一個或多個下劃線_進行分割…

Proxmark3 Easy救磚-20231209

事情是這樣的,在淘寶買了個PM3,拿到手后刷固件的,一不小心刷成磚頭了,現象就是四個燈全亮,插上電腦USB不識別。問商家他也不太懂,也是個半吊子技術,遠程給我刷機搞了半天也沒有搞定,…

微表情檢測(三)----基于光流特征的微表情檢測

Micro-expression spotting based on optical flow features 基于光流特征的微表情檢測 Abstract 本文提出了一種高精度和可解釋性的自動微表情檢測方法。首先,我們設計了基于鼻尖位置的圖像對齊方法,以消除由頭部晃動引起的全局位移。其次&#xff0…

C語言中的一維數組與二維數組

目錄 一維數組數組的創建初始化使用在內存中的存儲 二維數組創建初始化使用在內存中的存儲 數組越界 一維數組 數組的創建 數組是一組相同類型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面這個數組能否成功創建? int count…

Linux上編譯和測試V8引擎源碼

介紹 V8引擎是一款高性能的JavaScript引擎,廣泛應用于Chrome瀏覽器和Node.js等項目中。在本篇博客中,我們將介紹如何在Linux系統上使用depot_tools工具編譯和測試V8引擎源碼。 步驟一:安裝depot_tools depot_tools是一個用于Chromium開發…

學習IO的第七天

作業&#xff1a;使用消息隊列完成兩個進程間的相互通信 #include <head.h>struct msgbuf {long mtype; //消息類型char mtext[1024]; //正文大小 };#define SIZE (sizeof(struct msgbuf)-sizeof(long))int main(int argc, const char *argv[]) {//1.創…

打印一個整數的每一位和求階乘(遞歸和非遞歸的C語言實現)

文章目錄 打印一個整數的每一位思考遞歸非遞歸 求階乘遞歸非遞歸證明0的階乘為1 寫代碼中遇到的VS輸出窗口提示信息為什么VS平臺32位和64位的long都是4字節&#xff1f;%zu是什么格式說明符VS下_int128為什么用不了 打印一個整數的每一位 思考 負數和0都是整數&#xff0c;我…

DevEco Studio將編輯器整體文本改為簡體中文

我們打開編輯器 隨便進入一個項目 這里 我們左上角目錄 選擇 File下面菜單中的 Settings… 打開配置界面 然后在設置窗口左側導航欄中 選擇 Plugins 插件 然后上方導航欄中 選擇 Installed 參考下圖 然后 找到這個Chinese(Simplified) Chinese是什么應該不用我多說吧 我們把…

區塊鏈擴容問題研究【06】

1.Plasma&#xff1a;Plasma 是一種基于以太坊區塊鏈的 Layer2 擴容方案&#xff0c;它通過建立一個分層結構的區塊鏈網絡&#xff0c;將大量的交易放到子鏈上進行處理&#xff0c;從而提高了以太坊的吞吐量。Plasma 還可以通過智能合約實現跨鏈交易&#xff0c;使得不同的區塊…

Python面經【8】- Python設計模式專題-上卷

Python面經【8】- Python設計模式專題-上卷 一、接口二、單例模式(1) 方法一&#xff1a;使用模塊(2) 方法二&#xff1a; 裝飾器實現【手撕 理解】&#xff08;單下劃線 閉包 裝飾器 類方法&#xff09;(3) 方法三&#xff1a;基于__new__方法【new和init 】 設計模式是一…

簡單的 u-popup 彈出框

uniapp中的popup組件可以用于彈出簡單的提示框、操作框、菜單等。它可以通過position屬性控制彈出框的位置&#xff0c;不同的position值會使得彈出框呈現不同的彈出形式 目錄 一、實現思路 二、實現步驟 ①view部分展示 ②JavaScript 內容 ③css中樣式展示 三、效果展示 …

Linux系統---基于Pipe實現一個簡單Client-Server system

顧得泉&#xff1a;個人主頁 個人專欄&#xff1a;《Linux操作系統》 《C/C》 《LeedCode刷題》 鍵盤敲爛&#xff0c;年薪百萬&#xff01; 一、題目要求 Server是一個服務器進程&#xff0c;只能進行整數平方運算。Client要計算一個整數的平方的平方的平方&#xff0c;即…

聊聊 Jetpack Compose 原理 -- 穿透刺客 CompositionLocal

Compose 官方說明一直很簡潔&#xff1a;CompositionLocal 是通過組合隱式向下傳遞數據的工具。 我們先來看一段代碼&#xff1a; class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setCo…

datav-輪播排名-對數據進行處理

前言 對于大屏需求我們排名數據輪播也是經常需要用到的需求&#xff0c;datav也是給我們提供了 不是說我們自己不能寫&#xff0c;而是提供好的輪子比我們自己 寫的&#xff0c;更全面&#xff0c;更周到&#xff0c; 沒有特殊需求的話&#xff0c;使用datav配置一下完成這個…