1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        我在阿里做中后臺開發(fā)

        共 6239字,需瀏覽 13分鐘

         ·

        2020-08-12 23:18

        作者信息:趙吉彤,花名牧?xí)?/span>

        阿里云智能-銷售管理部前端工程師,負責(zé)前端基礎(chǔ)設(shè)施建設(shè)。


        開發(fā)全流程在線化近些年來熱度不斷攀升,比如 AWS 在 C9 的實踐、開源屆比較出名的 TheiaJS,到后起之秀 code-server、行業(yè)佼佼者 VS Online 等。我個人以及我們團隊對于開發(fā)流程在線化也做了較為深入的探索實踐,從開始的懵懂迷茫到現(xiàn)在的目標(biāo)清晰。



        從 WebIDE 講起




        整個集團對于 WebIDE 的建設(shè)可以說起步較晚,當(dāng)業(yè)界有了 Theia-IDE 的完整解決方案、coding.net 自己 CloudStudio 的商業(yè)模式,我們還在內(nèi)部建設(shè)階段。但好的方面,我們基于 IDE 技術(shù)領(lǐng)域及相關(guān)工具平臺在近期如雨后春筍般涌現(xiàn):***Studio、***IDE、K*** 以及更廣義的可視化搭建設(shè)計器等。

        我們團隊在 18 年調(diào)研過后決定基于 D*******s 的 ***Studio 來進行上層封裝滿足業(yè)務(wù)需求,后面由于種種原因不再適合放棄了。

        19 年中,基于開源的 code-server 和云原生 Kubernetes 的加持,我們自己打造了一款 YunIDE,由于需要花費大量的精力去調(diào)度運維 IDE 底層,這對于一個業(yè)務(wù)團隊來說也是很難變現(xiàn)的,在第一版本迭代完成之后也選擇遷移了。

        code-server
        https://github.com/cdr/code-server

        最后我們基于 ****IDE 并結(jié)合 XCloud 平臺、Dawn 工具、云查詢,打造了更加垂直易用的在線開發(fā)工具,打通了整個 I2P(Init to Publish)在線開發(fā)流程,對特定場景化及外包同學(xué)開發(fā)提效起到了關(guān)鍵性作用。

        Dawn 工具
        https://github.com/alibaba/dawn



        自建的過程與挑戰(zhàn)




        基本上 WebIDE 由三部分構(gòu)成:


        • Client: 客戶端也是最重要的端,將代碼編輯等本地功能移植到瀏覽器中。
        • Server: 服務(wù)端也是控制端,包括管理數(shù)據(jù)交互及資源調(diào)度。
        • Container Pool: 運行時,用戶代碼真正運行的容器環(huán)境。


        三者之間最典型的架構(gòu)如下圖所示:


        code-server 在很大程度上解決了 Client 端的問題,其本身基于 VSCode 二次開發(fā),在體驗及一些編輯器基礎(chǔ)性問題上,我們不再去花時間重構(gòu),將重點精力放在 Server 端和 Container Pool。


        服務(wù)端設(shè)計



        YunIDE 從一開始就是面向云上設(shè)計的,所以在真正討論架構(gòu)的時候,更多的話語權(quán)在于使用云上基礎(chǔ)設(shè)施 & 業(yè)界開源工具,所以在用戶權(quán)限體系、容器資源調(diào)度、代碼文件持久化方式等問題上,都與彈內(nèi)的大部分 WebIDE 實踐有所區(qū)別,一張早期的架構(gòu)大圖:


        截止 YunIDE 第一個版本迭代,整個服務(wù)端開發(fā)對我個人而言挑戰(zhàn)還是蠻多的,尤其是「資源調(diào)度 & 編排」這部分,需要對容器、Kubernetes 有足夠深入的理解,對云資源、網(wǎng)絡(luò)環(huán)境、集團現(xiàn)有基礎(chǔ)設(shè)施中間件有一定的了解和經(jīng)驗。WebIDE 資源調(diào)度本身就是一個追求極限的過程(誰不想自己的 IDE 冷啟動快一些呢),一丁點知識上的盲區(qū)都會帶來雪崩版的負面影響。


        編輯器 & IPC



        編輯器端我們最大化的沿用了 Coder/VSCode 的實現(xiàn),也就是這個原因,YunIDE 在最初的體感上要比 TheiaIDE 更舒服更接地氣,而且通過對 VSCode 擴展體系的繼承,可以獲得幾乎無限的想象空間。
        我們擴展的功能也通過 vscode extensions 來實現(xiàn),區(qū)別于三方擴展,內(nèi)建的插件無法被移除。

        IPC 這一層除了 code-server 所做的工作,YunIDE 在 HTTP 應(yīng)用層對 socket IPC 做了代理和 Hack,做了相應(yīng)的鑒權(quán)與應(yīng)用層適配。



        關(guān)鍵性問題



        資源利用率:資源的合理編排以及最大化利用永遠是我們追求的目標(biāo),在弱編輯場景(只編碼不調(diào)試預(yù)覽)如何在保證隔離性的基礎(chǔ)上共享資源:
        保證高可用性:縮短運行時生命周期,同時也要保證用戶代碼文件不丟失。最理想的狀況是按 socket 連接數(shù)來動態(tài)的配置運行時容器,但技術(shù)上目前實現(xiàn)成本過高,只能以「小時/天」計算銷毀周期。通過 NFS 掛載用戶工作空間,用戶數(shù)據(jù)不依賴運行時條件,做到數(shù)據(jù)可恢復(fù)。

        啟動速度優(yōu)化:


        • 完全冷啟動:未知鏡像的情況很難優(yōu)化,但垂直場景下可以做到 1 分鐘內(nèi)。
        • 預(yù)置容器池 + Container Buffer:體驗很好,但造成一定的浪費。



        插件生態(tài):VSCode 官方插件體系已經(jīng)足夠完善,但也還有精進的余地,而且在集團前后端技術(shù)百花齊放的大背景下,界面的可定制性不夠強等缺陷就凸顯出來了(基于 TheiaIDE 的方案則更加靈活),vsc 官方插件市場是公開使用的,但由于協(xié)議等問題不能被直接使用。

        自此而終,自建 WebIDE 的路上有過太多機遇與挑戰(zhàn),也有了相當(dāng)程度的技術(shù)沉淀,逐漸的我們考慮快速將業(yè)務(wù)場景落地到集團基礎(chǔ)設(shè)施,也就有了后面基于 ****IDE 的 I2P 全流程在線化戰(zhàn)役。


        全流程在線化戰(zhàn)役




        基于集團現(xiàn)有基礎(chǔ)設(shè)施如 ****IDE/K***** 等可以很快構(gòu)建垂直場景的在線開發(fā)環(huán)境,后面主要分享下我們的相關(guān)經(jīng)驗沉淀與提效成果。


        環(huán)境定制



        跟幾乎所有 WebIDE 的環(huán)境準(zhǔn)備一樣,開發(fā)運行時開箱即用通過構(gòu)建相應(yīng)的 image 來實現(xiàn)。由于我們團隊在前端基礎(chǔ)建設(shè)上有了很多沉淀,比如 Dawn 腳手架、云查詢、XCloud 等,在定制環(huán)境時要求變得更加苛刻。

        通過在 Web 端前置云查詢的 QTOKEN 授權(quán)體系,我們可以在 WebIDE 的終端環(huán)境拿到用戶身份,甚至可以通過用戶身份調(diào)用很多需要權(quán)限校驗的接口。這極大的拓展了我們的可操作性,舉個例子,通過用戶身份可以很容易實現(xiàn)構(gòu)建發(fā)布管控、日常錯誤收集、問題精準(zhǔn)答疑等等:


        同時鏡像中集成了團隊公共賬號的一些公共權(quán)限,很多弱權(quán)限行為都通過統(tǒng)一公共賬號管理和維護,比如:GitGroup 授權(quán)、npm package 發(fā)布、迭代關(guān)聯(lián)工作項等等。


        插件開發(fā)



        基于 ****IDE 封裝的 IDE SDK 進行深度的 UI & 功能定制,如下圖所示,封裝了常用 dawn/命令行 操作:



        在點擊預(yù)覽的時候我們做了很多優(yōu)化處理:


        • 由于插件運行在瀏覽器端,所以點擊「預(yù)覽」時通過 socket 向容器端發(fā)送指令查詢當(dāng)前可用端口。
        • 排除 ****IDE 及插件自身使用的端口,排除外部不可訪問的(0.0.0.0),排除非 Node 進程開放的端口,剩下的基本上是我們的目標(biāo)端口,實際使用下來體驗也是比較好的。
        • 通過內(nèi)置的規(guī)則(倉庫、人員信息、項目信息)來判斷實際預(yù)覽需要用到的域名,感謝 ****IDE 團隊的支持,目前我們可以在三個域名下進行預(yù)覽開發(fā)。



        對接 ****IDE 的過程中,前端項目的有效預(yù)覽問題我們這邊算是做了些小小的貢獻,推動了通過「泛域名解析」來完整的模擬本地預(yù)覽體驗。

        本地方案:


        • 啟動 dev server
        • 綁定 hosts local.foo.aliyun.com 來獲取官網(wǎng)登陸狀態(tài)聯(lián)調(diào)接口
        • 打開瀏覽器



        WebIDE 方案 1:


        • 容器運行時啟動 dev server
        • 綁定 hosts local.foo.aliyun.com 到容器的 IP



        WebIDE 方案 2:


        • 容器運行時啟動 dev server
        • 提供統(tǒng)一的域名 preview.ide.alibaba-inc.com 并通過 pathname 區(qū)分不同空間



        WebIDE 方案 3:


        • 容器運行時啟動 dev server
        • 提供可變的泛域名來隔離不同空間 [uniqueId]-[port].id*****io.aliyun.com



        方案 1 可以有效解決問題,但非常麻煩,需要用戶手動綁定 Hosts 而且每次容器 IP 改變后都需要重新綁定,從產(chǎn)品的角度來說這個方案很不成熟,但也不失為一種降級方案。

        方案 2 不能解決前端開發(fā)的問題,無法處理 HTML 中資源引入方式的多樣性問題,比如 src="/index.js" 和 src="index.js" 行為就會不一致,很容易導(dǎo)致資源無法正常加載、頁面無法正常預(yù)覽。

        方案 3 比較完美的解決了上述幾個問題,但擴展性有所限制,每次新增一個業(yè)務(wù)域就要多申請一個泛域名。

        最終,項目預(yù)覽的效果如下圖:



        項目初始化



        既然是 I2P 戰(zhàn)役,自然少不了重中之重的 init 環(huán)節(jié),本來在本地是很簡單一行命令的事,在云端卻不簡單。


        • 最開始的刀耕火種時代,我們自己維護了測試環(huán)境的 K8S 集群,使用 Jobs 來完成 init 操作。
        • 后面由于太麻煩,遷移到了 ECI
        • 最后由于 ECI 沒有走「鏡像預(yù)熱」,導(dǎo)致初始化時間太長(1-3 min),又從 ECI 遷移到了其他編排系統(tǒng)。



         ECI
        https://www.aliyun.com/product/eci

        最終,這套 I2P 的成功實踐也被復(fù)用到了其他 BU、其他團隊,幫助其他業(yè)務(wù)場景快速實現(xiàn)「全流程在線化」。


        場景化落地




        從懵懂到篤定的過程中,我們搞清了這件事:找到你垂直的場景并發(fā)光發(fā)熱。我們避免把 WebIDE 設(shè)想成一個大而全的系統(tǒng),而是一個小而美的工具。下面是我們已經(jīng)扎根的領(lǐng)域:


        • XCloud VC 組件開發(fā):中后臺低代碼物料
        • 鴻蒙 ACE/國際站 組件開發(fā):營銷搭建物料
        • Dawn 工程服務(wù)于外包同學(xué)及其他快速開發(fā)場景
        • 云查詢 FaaS:Serverless 場景快速項目開發(fā)



        Dawn 工程
        https://github.com/alibaba/dawn

        每個不同領(lǐng)域在鏡像、插件等層面做不同的兼容,整體入口收斂到 XCloud,最終完成 WebIDE 的場景化落地,同時也收到了許多肯定的贊許:



        戰(zhàn)疫情,我們在行動



        受疫情影響,很多同學(xué)不能正常復(fù)工,WebIDE 對于解決外包同學(xué)的開發(fā)環(huán)境問題顯得尤為重要,我們也非常重視,積極改善功能、維持穩(wěn)定、隨時答疑,外包同學(xué)不再擔(dān)心電腦安裝各種環(huán)境的問題,從之前「幾乎一整天都在裝環(huán)境」到現(xiàn)在「打開瀏覽器 WebIDE 就能開發(fā)上線」,真正做到了「開箱即用」。

        下圖展示了從 XCloud 進入開發(fā)項目的過程:

        推薦閱讀:

        代碼優(yōu)化實戰(zhàn):我又優(yōu)化了一百個if else!
        阿里內(nèi)部員工,排查Java問題常用的工具單
        優(yōu)秀的 Java 項目,代碼都是如何分層的?

        點擊閱讀原文,領(lǐng)取2020Java電子書資料(持續(xù)更新

        瀏覽 60
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            美女日比 | 看又黄又爽视频网站 | 玩三p少妇被弄得高潮不断 | 日本性视频网站 | 国产精品高潮呻吟久久av无 | 老女人做爰全过程免费的视频播放 | 中国航空少妇一级毛片 | 三上悠亚上司中文字幕 | 国产欧美第一页 | 婷婷深爱网 |