阿里技術人的第一節課,都上些什麼?

從源碼到上線數據庫

事情可不簡單tomcat

什麼叫程序?或者說,什麼叫軟件?這裏面好像有歧義。有時候指的是源代碼,有時候指的是安裝包或者安裝光盤,好比「我下載了一個軟件」 。有時指的是已經安裝好隨時能夠運行的程序,好比「手機上新裝了一個應用」 。還有的時候指的是正在運行中的,正在提供服務的程序,好比一個網站。安全

這些不一樣的含義反映了一件事:單純的源代碼,還不能提供服務,不能爲用戶帶來價值。只有源代碼被構建打包,而且被部署運行起來,才能爲用戶帶來價值。服務器

那麼,如何才能部署運行起來,爲用戶提供服務呢?這很麻煩嗎?——是的,這很麻煩。網絡

想象一下,若是你是一個初創企業的CTO。天上突然掉餡兒餅,掉下來五個Git庫,源代碼已經寫好,並且一點兒毛病都沒有。每一個Git庫能編譯成一個war包。你須要把每一個war包部署到100臺服務器上,總共須要500臺服務器。另外,隨着用戶的使用,會不斷追加新功能,產生新版本,須要更新服務器上的軟件版本。架構

假定你不是在阿里巴巴,假定也沒有阿里雲,假定你只是有不少錢能夠僱到合適的人,你想一想一共有多少事情要作?less

先要買或者租機房,再買服務器,風火水電都要搞穩妥。更要接好網絡,每臺機器要裝好操做系統的合適版本。不止是操做系統,還有相關基礎軟件、路由、數據庫、監控系統、日誌收集系統以及中間件等都是必須的。哦,域名還忘了申請了……運維

這些搞定以後,才能安裝那些war包。這麼多臺,確定不能一臺一臺操做,累死了,得有個批量操做的方法。可這方法怎麼弄呢?另外,考慮到未來要更新軟件版本,因此這還不是一次能搞定的事情,那更是得批量操做了。更新版本的時候,還有個麻煩事,不能一會兒都停機啊,那不就要出事故了。因此得分批來。好比,先更新20%的機器,再更新20%,如此一共五批弄完。工具

往細節看,其中更新某一臺機器,其實都是個挺複雜的過程。首先下載新的war包到這臺機器,而後開始替換過程。先得把流量切走,切流量前,還得先把監控報警關上。流量切走了,就能夠中止當前war包的運行。而後用新的war包代替舊的war包,啓動試試看。若是經過了一些基本的自動檢測,說明新war包大致上能運行,因而就開始切流量回來,最後把監控報警恢復。性能

忒麻煩!!

還好有工具幫忙

怎麼辦?——用趁手的工具啊!正是爲了提升你們的工做效率,讓你們可以集中精力在具體業務自己的研發上,阿里巴巴集團多年以來建設了一整套基礎設施。

在交付層和運維層,都有大量的基礎設施。但這些,你們可能感覺不深。對於一個應用來說,它最關心的事情,基本都是經過Aone暴露出來的。Aone也就是最上層研發層的主要工具。

注:本文說起的阿里內部產品叫Aone,Aone於2017年正式對外開放,改名爲雲效。

回到前面討論的場景,把完美的源代碼發佈上線這個過程,那麼大致步驟應該是:

第一步,把運行環境初始化好。這一步目前同窗們基本能夠在Aone上一站式完成了,就是在Aone上註冊一個新應用,而後根據嚮導指引,把上線任務一項一項配下來。固然還有些內容好比數據庫還須要訪問其餘系統申請配置,未來咱們努力作成一站式配置好。

第二步,根據源碼構建出壓縮包(基本就是把war包壓縮一下),而後把壓縮包部署到各目標服務器上。這一步,能夠在Aone上一鍵完成。未來更新版本也同樣。點一下按鈕,全部事情都作完。這就是用Aone的好處。

clipboard.png

阿里巴巴相關術語

爲了使用Aone,咱們得了解一些Aone的關鍵概念。實際上是在阿里巴巴開發時,你們一開始約定俗成的概念,後來固化在Aone上。咱們一個一個來看:

應用:Git庫裏裝的是源代碼,這是程序的一種形態。那麼運行中的程序叫什麼呢?在阿里巴巴,咱們管它叫「應用」。通常來講,一個Git庫,構建生成一個包,產生一個應用,在若干臺服務器/虛擬機/容器中運行,在測試、線上環境中運行。通常應用跟Git庫是一比一的關係,不過也有各類特殊狀況,好比一個Git庫裏有多個應用。因此,咱們確實須要應用這個概念。另外,應用不只包括了應用主包(一般是war包打成tgz包),也包括了運行所需環境的配置,好比tomcat版本等。

二方包:三方包,指的是來自阿里巴巴外部的,開源或商業的包,好比jar包、rpm包等。而二方包,則是指來自阿里巴巴內部的,一般是其餘團隊的包。也就是說,一個團隊研發出這個二方包,公佈出來,供各團隊使用。固然,也可能就是供團隊本身使用。反正,只要是來自阿里內部的,上傳到Nexus或Yum這樣的包的倉庫的,就都算二方包。

產品/產品線/產品樹:應用是從部署運維的角度看運行中的程序。產品是從使用者的角度看運行中的程序。一般產品由一到多個應用組成。產品進而構成產品線,這樣一級一級地上去,造成了一棵樹,叫產品樹。產品樹的根節點,就是阿里巴巴。產品樹的第一級展開,是各個BU。

變動:在外面的世界,如今變動一般是指線上運行環境的變化,好比更新了軟件版本,好比擴容、縮容等運維操做。在阿里巴巴,變動也有這個含義。可是在阿里巴巴,變動還有一個含義,軟件研發過程當中的含義。一般咱們把一條feature分支就對應到一個變動。因而也常管這條feature分支叫變動分支。從這個角度看集成,就是把若干變動攢到一塊兒,經過各類質量檢測後,部署上線。

發佈:發佈,release,這個詞經常是指軟件版本公佈出來供使用。但在阿里巴巴,這個詞不只對應於部署到線上環境,即便是部署到測試環境,也叫發佈。換句話說,發佈基本上就是部署的代名詞。好比每一個變動以爲本身OK了,就點一下變動詳情頁面上的「提交待發布」這個鈕,標記一下。而後,在集成測試環境(也就是平常環境)對應的流程階段的詳情頁面,就能看見這個變動。再選中它,而後點擊「提交發布」這個鈕,就與其餘變動分支一塊兒合併到發佈分支,並部署到測試環境啦。

技術發展趨勢

發佈部署方面,在阿里巴巴,時下最重要的變革固然是Docker化。

那麼這一波浪潮以後,下一波浪潮會是什麼呢?有多是Serverless架構。這方面的文章也不少,你們能夠翻翻看。

提升質量的多種方法

剛纔咱們給的是一個天上掉餡兒餅的例子,突然間獲得了完美的源代碼,而後考慮構建並部署上線。現實世界中哪兒有這樣的好事兒啊。代碼裏面確定有bug。那麼,怎麼可以有效率地把問題找出來,繼而修復好?具體有哪些方法?

按四個象限梳理

爲方便梳理,咱們劃一個橫軸,一個縱軸,而後按照獲得的四個象限,梳理各類質量保證方法。這裏所說的橫軸,在最左邊,是源代碼。在最右邊,是運行中的程序。這裏所說的縱軸,在最上邊,是自動化,在最下邊,是人工。

clipboard.png

先看左半部分。左下角,人工的對源代碼的檢測。這主要對應的是代碼評審。咱們在代碼服務這門課上介紹的。此外,安全評審有時也有人工介入。

左上角,自動對源代碼的檢測。代碼規約的自動檢查工具,就落在這裏。事實上,還有很多工具也落在這裏,論品牌,有Sonar、PMD等。論方法,有圈複雜度等。全部這些自動檢測,被稱之爲Staticprogram analysis 或 Static code analysis,靜態程序分析/靜態代碼分析。

這方面,在阿里巴巴有工具支持,對應的是Aone的實驗室這個功能。能夠經過實驗室,接入各類靜態程序分析工具和方法。實驗室的前身是CISE。如今CISE也仍然是實驗室背後的引擎。因此有時候聽別人說CISE的時候,你就知道其實指的就是實驗室啦。

再來看右半部分。右上角,是自動的對運行中的程序的檢測。這也就是常說的自動測試啦。在阿里巴巴,也是主要由Aone的實驗室來向你們提供相應服務。這包括單元測試/集成測試;接口測試/Web UI測試;功能測試/性能測試,等等。

右下角,是人工測試。雖然說是人工測試,工具也一樣能夠提供支持,主要是管理測試用例。相應的工具是Aone中的測試用例管理。

測試環境隔離技術

不管是自動測試仍是人工測試,只要是須要先把應用部署到測試環境,那就跟測試環境的管理有關係了。測試環境的管理,咱們專門講一講測試環境隔離技術。

想象一下,你開發了一個feature,也就是一個變動。爲了讓它比較靠譜再送去集成,你須要對它進行測試。單元測試固然好,但這是不夠的。須要儘量模擬真實環境進行測試。那麼問題來了,如何儘量模擬真實環境?好比,爲每一個淘系的工程師另搭一個淘寶測試用?這費用咱真花不起……

怎麼解決這個問題?阿里巴巴用了一個聰明的方法,測試環境隔離。讓你們共享一個測試環境,但又彷彿每一個人都是獨佔它的,互相不干擾。

具體說來,假定搭起一套測試環境,須要1000臺機器,分別運行應用ABCDE……。這個環境咱們稱做平常測試環境。每一個應用的版本,咱們姑且稱之爲A0、B0、C0、D0、E0……

如今假定甲這名同窗在開發A這個應用的一個變動,在開發過程當中,如今產生的應用版本是A1。因而把A1部署到單獨一臺機器上,並用一些神奇的技術(經過中間件等)與剛纔說的平常測試環境連通。因而,在甲這名同窗看來,他所面對的系統是A一、B0、C0、D0、E0…… 並且彷彿他獨佔了這個系統。

相似地,若是乙這名同窗爲了一個feature,在開發A和B分別拉出變動分支,產生A二、B2。那麼A二、B2將分別被部署到單獨的機器上,而後它們一塊兒與平常測試環境連通。因而,在乙這名同窗看來,他所面對的系統是A二、B二、C0、D0、E0…… 從乙的角度看,他彷彿獨佔了整個測試系統。甲和乙在測試時,不會互相干擾。

有了這樣的解決方案,就同時達到了兩個目標:儘可能模擬真實的環境;用不高的代價。

關於測試環境隔離技術,這裏只是簡單介紹下原理。

clipboard.png

阿里巴巴相關術語

項目環境:就是前面說的,測試一個feature所需的測試環境。可能對應一個應用上的一個變動,也有可能對應多個應用。項目環境使用了上面講的測試環境隔離技術,背後接的一整套測試環境,是平常環境。

平常環境:就是集成測試環境。把各個變動攢在一塊兒,而後部署到這裏,看是否是能work。

預發環境:這個環境比平常環境更接近真實環境。事實上,從網絡隔離的角度,它不是在測試網,而是在生產網。它所鏈接的數據庫,也一般就是線上運行使用的數據庫。通常來講,是先在平常環境測試,經過了再到預發環境測一下。

正式環境:正式環境就是生產運行的真實環境,向廣大用戶提供服務。

流水線

所謂流水線,通俗地講就是把不一樣的工做按必定順序串起來。爲何要串起來呢?

首先,有些工做天生就是有前後順序的。若是想部署,總得先構建吧。因此構建-部署,就是自然的工做順序。若是每次都是先點個按鈕作構建,等構建結束後再點個按鈕作部署,好像有點兒笨,不如點一個按鈕,把這兩件事按順序都作了。

其次,爲保證質量,咱們想往流程裏面加規則和卡點。好比,必須經過代碼評審和安全評審,才容許合併代碼。這些質量保證性的工做,還有可能有不一樣的順序和頻率。典型的單元測試和靜態程序分析應該早作,頻繁地作。而整個鏈路的測試,比較費勁,頻率能夠相對低些。所以,這些工做也是流水線中的環節,而且可能以不一樣頻率執行。不一樣頻率這個事兒,就是持續交付這個流行詞兒中所說的不一樣stage(階段)不一樣頻率。

clipboard.png

Aone提供了把不一樣的工做串接的能力,也就是流水線的能力。在分支模式下,每一個環境,好比平常、預發、正式,分別對應一條流水線。在Git Flow和自由模式下,你甚至能夠把全部工做內容,從代碼提交到最後正式發佈,作到一個流水線裏。看着代碼過一道道「關口」,而後發佈上線,仍是很爽的。

結語

以上,概要地介紹了從源代碼到上線的基本的構建部署過程,講解了各類質量保證方法及其工具支持,講解了流水線把流程做業鏈接起來自動運轉。這些能力合在一塊兒,就實現了對持續交付的一整套工具支持方案。固然,若是你問DevOps的工具支持方案,我也會說,以上幾部分,構成了DevOps的工具支持方案…… 名字是次要的,關鍵是幫上廣大研發同窗的忙,高效且穩妥的開發和發佈。

clipboard.png

這節課只是概要介紹。有須要的童鞋可使用Aone的對外版本雲效,體驗一位阿里技術人工做的一天。

本文做者:董越

閱讀原文

本文來自雲棲社區合做夥伴「阿里技術」,如需轉載請聯繫原做者」。

相關文章
相關標籤/搜索