軟件交付周期(SDLC,Software Development Life Cycle)越來(lái)越短,應(yīng)用程序規(guī)模越來(lái)越大咪鲜,DevOps致力于支持軟件的持續(xù)構(gòu)建和交付
SDLC已發(fā)展為通過(guò)若干流程飞几、工具、方法以實(shí)現(xiàn)快速交付
軟件交付的挑戰(zhàn)
瀑布模型和實(shí)物交付
串行由上而下刽脖,一般不返回上階段,交付周期一般較長(zhǎng),如軟盤\CD-ROM
敏捷模型和電子交付
增量借嗽、迭代、敏捷模型转培,可多次交付(更利于更新和打補(bǔ)抖竦肌),如exe程序
基礎(chǔ)設(shè)施(如服務(wù)器和網(wǎng)絡(luò))是靜態(tài)的浸须,需事先設(shè)置好惨寿,一般SDLA不涉及影響基礎(chǔ)設(shè)施
云端的軟件交付
軟件程序從二進(jìn)制變?yōu)樵诰€服務(wù)
虛擬化技術(shù)和軟件定義網(wǎng)絡(luò)(SDN)使服務(wù)器更動(dòng)態(tài)化
如Amazon Web Service(AWS)、Google Cloud Platform(GCP)這種云服務(wù)删窒,可輕松創(chuàng)建和管理動(dòng)態(tài)基礎(chǔ)設(shè)施
基礎(chǔ)設(shè)施被納入SDLC范圍裂垦,成為重要組件之一,程序被安裝和運(yùn)行在服務(wù)器上肌索,不再是客戶的PC機(jī)上
軟件和服務(wù)交付周期縮短
持續(xù)集成
為了更高質(zhì)量的快速交付蕉拢,開(kāi)發(fā)者和QA開(kāi)始采用一些自動(dòng)化技術(shù)
CI continuous integration,CI包含一系列工具的組合诚亚,如版本控制系統(tǒng)version control systems VCS晕换、構(gòu)建服務(wù)器、自動(dòng)化測(cè)試工具
VCS幫助開(kāi)發(fā)在中心服務(wù)器上維護(hù)程序源代碼
CI幫助開(kāi)發(fā)者和QA提升代碼質(zhì)量站宗,縮短程序歸檔或模塊打包周期届巩,CI足以應(yīng)對(duì)電子交付
持續(xù)交付
CI加上自動(dòng)化部署是服務(wù)器上應(yīng)用程序向用戶提供服務(wù)的過(guò)程
如何將軟件交付服務(wù)器?如何關(guān)閉份乒、替換恕汇、回滾已有程序腕唧?如系統(tǒng)庫(kù)也更新,如何升級(jí)瘾英?如何修改操作系統(tǒng)的用戶和組設(shè)置枣接?
基礎(chǔ)設(shè)施包含服務(wù)器和網(wǎng)絡(luò),上述取決于開(kāi)發(fā)缺谴、QA但惶、預(yù)發(fā)布、生產(chǎn)等環(huán)境湿蛔,每個(gè)環(huán)境都有不同的服務(wù)器配置和IP地址
CD continuous delivery膀曾,是CI工具、配置管理阳啥、編排工具的組合添谊,可實(shí)現(xiàn)上述問(wèn)題
配置管理
幫助配置操作系統(tǒng),包括用戶察迟、用戶組斩狱、系統(tǒng)庫(kù),可管理多臺(tái)服務(wù)器扎瓶,以便更換服務(wù)器時(shí)與所需狀態(tài)或配置保持一致所踊;支持將應(yīng)用程序部署或安裝到服務(wù)器中;配置管理支持自動(dòng)或手動(dòng)更新程序
基礎(chǔ)設(shè)施即代碼
配置管理工具不僅支持操作系統(tǒng)或虛擬機(jī)概荷,還支持云基礎(chǔ)設(shè)施秕岛,在云端創(chuàng)建并配置網(wǎng)絡(luò)、存儲(chǔ)和虛擬機(jī)误证,通過(guò)配置文件自動(dòng)化設(shè)置云基礎(chǔ)設(shè)施
配置管理比標(biāo)準(zhǔn)操作過(guò)程SOP有優(yōu)勢(shì)瓣蛀,復(fù)制環(huán)境也容易
編排
也是配置管理工具的一種,在配置和分配云資源時(shí)雷厂,更智能和動(dòng)態(tài)
編排工具可管理多個(gè)服務(wù)器和網(wǎng)絡(luò)資源惋增,當(dāng)管理員要增加應(yīng)用程序?qū)嵗龝r(shí),編排工具可確定可用服務(wù)器改鲫,自動(dòng)部署和配置應(yīng)用程序和網(wǎng)絡(luò)
編排工具超出SDLC范圍诈皿,但在擴(kuò)展應(yīng)用程序和重構(gòu)基礎(chǔ)設(shè)施資源時(shí)有助于持續(xù)交付
微服務(wù)趨勢(shì)
模塊化編程
每個(gè)模塊獨(dú)立且可重用,可由不同開(kāi)發(fā)團(tuán)隊(duì)維護(hù)
當(dāng)實(shí)現(xiàn)應(yīng)用程序時(shí)像棘,應(yīng)用程序只需初始化稽亏,并使用這些模塊來(lái)構(gòu)建更大的應(yīng)用程序
模塊化編程可提高軟件開(kāi)發(fā)速度,減少重復(fù)造輪子
包管理
Java或輕量級(jí)編程語(yǔ)言都有自己的模塊或包管理工具
java-Maven缕题、python-pip截歉、ruby-rubyGems、JavaScript-npm
包管理工具允許將模塊或軟件包注冊(cè)到集中式或私有存儲(chǔ)庫(kù)烟零,并下載必要的軟件包
MVC設(shè)計(jì)模型
不斷添加新功能和邏輯時(shí)瘪松,應(yīng)用程序需要更多的模塊咸作、包、框架組合宵睦,尤其是服務(wù)器端應(yīng)用程序
常需要連接數(shù)據(jù)庫(kù)如RDBMS记罚、身份驗(yàn)證服務(wù)器如LDAP,通過(guò)具有適當(dāng)?shù)脑O(shè)計(jì)的HTML將結(jié)果返回用戶
因此需要軟件設(shè)計(jì)模型壳嚎,以便應(yīng)用程序中使用一組模塊開(kāi)發(fā)應(yīng)用程序
MVC模型視圖和控制器桐智,一種流行的程序設(shè)計(jì)模型,定義了三個(gè)層次:
視圖層:負(fù)責(zé)用戶界面UI烟馅、輸入輸出I/O
模型層:負(fù)責(zé)數(shù)據(jù)查詢和持久化说庭,如加載和存儲(chǔ)數(shù)據(jù)到數(shù)據(jù)庫(kù)
控制層:負(fù)責(zé)視圖和模型之間的業(yè)務(wù)邏輯
簡(jiǎn)化MVC的框架:Struts、SpringMVC郑趁、Ruby on Rails刊驴、Django
單體架構(gòu)應(yīng)用程序
MVC定義了每層的邊界,但源代碼model穿撮、表示代碼view、業(yè)務(wù)邏輯controller都存在統(tǒng)一VCS存儲(chǔ)庫(kù)中痪欲,雖然應(yīng)用程序體積變大悦穿,會(huì)變得更慢,被稱為單體架構(gòu)monolithic业踢,包括構(gòu)建巨型exe\war程序的代碼
當(dāng)添加或修改其中一個(gè)模塊時(shí)栗柒,會(huì)影響很多代碼,導(dǎo)致沒(méi)人愿意維護(hù)這些代碼
遠(yuǎn)程過(guò)程調(diào)用
Sun RPC remote procedure call 遠(yuǎn)程過(guò)程調(diào)用知举,允許遠(yuǎn)程使用模塊瞬沦,有利于將應(yīng)用程序劃分為多個(gè)進(jìn)程(程序)單個(gè)程序可以有單獨(dú)的源代碼存儲(chǔ)庫(kù)
如RPC實(shí)現(xiàn)的NFS network file system網(wǎng)絡(luò)文件系統(tǒng),NFS客戶端和服務(wù)器之間的CPU和操作系統(tǒng)版本是互相獨(dú)立的
如RPC風(fēng)格的編程語(yǔ)言雇锡,unix逛钻、c語(yǔ)言有rpcgen工具生成樁代碼負(fù)責(zé)網(wǎng)絡(luò)通信、Java有類似RMI remote method invocationRMI編譯器生成連接遠(yuǎn)程java進(jìn)程的樁代碼锰提,以調(diào)用方法并獲得結(jié)果曙痘、Object C有分布式對(duì)象,.Net有遠(yuǎn)程處理功能
遠(yuǎn)程過(guò)程調(diào)用立肘,用于客戶端\服務(wù)器模型結(jié)構(gòu)边坤,不是分布式架構(gòu),出于安全角度谅年,不建議在公共網(wǎng)絡(luò)上使用
SOAP(HTTP/SSL)作為數(shù)據(jù)傳輸?shù)腤eb服務(wù)茧痒,使用XML作為數(shù)據(jù)表示和服務(wù)定義Web服務(wù)描述語(yǔ)言(Web Services Description Language,WSDL),然后使用通過(guò)描述、發(fā)現(xiàn)和集成(Universal Description融蹂、Discovery旺订、Integration弄企,UDDI)作為服務(wù)注冊(cè)來(lái)查找Web服務(wù)應(yīng)用程序
RESTfull
HTTP/SSL作為RPC傳輸,并簡(jiǎn)化為RESTfull設(shè)計(jì):
使用HTTP和SSL/TLS作為傳輸標(biāo)準(zhǔn)
使用HTTP方法進(jìn)行創(chuàng)建耸峭、加載桩蓉、上傳、刪除(create劳闹、load院究、upload、delete本涕,CLUD)业汰,如get、post菩颖、put样漆、delete
使用URI作為資源標(biāo)識(shí)符
使用JSON作為標(biāo)準(zhǔn)數(shù)據(jù)表示
RESTfull基于HTTP支持任何編程語(yǔ)言
如有多個(gè)RESTfull程序,需要考慮在VCS上管理多個(gè)源代碼及如何部署多個(gè)RESTfull服務(wù)器晦闰,CICD幫助構(gòu)建和部署更多RESTfull服務(wù)應(yīng)用程序
微服務(wù)
微服務(wù)設(shè)計(jì)關(guān)注
無(wú)狀態(tài)放祟,不將用戶會(huì)話存儲(chǔ)到系統(tǒng),有助于擴(kuò)展
無(wú)共享數(shù)據(jù)存儲(chǔ)呻右,有自己的數(shù)據(jù)存儲(chǔ)如數(shù)據(jù)庫(kù)跪妥,有助于封裝后端數(shù)據(jù)庫(kù),代碼重構(gòu)声滥,單個(gè)微服務(wù)中更新數(shù)據(jù)庫(kù)模式
版本控制和兼容性眉撵,經(jīng)常更改和更新API,應(yīng)定義版本落塑,具有向后兼容性纽疟,有助于與其他微服務(wù)和應(yīng)用程序解耦
集成CICD:采用CICD流程來(lái)消除管理工作
構(gòu)建微服務(wù)應(yīng)用程序框架
Spring Boot、Flask
單體架構(gòu)應(yīng)用程序設(shè)計(jì)和微服務(wù)設(shè)計(jì)
微服務(wù)也包括接口層憾赁、業(yè)務(wù)邏輯層污朽、數(shù)據(jù)存儲(chǔ),但應(yīng)用程序(服務(wù))由多個(gè)微服務(wù)構(gòu)建龙考,不同應(yīng)用程序可在下面共享相同的微服務(wù)膘壶,開(kāi)發(fā)者可以添加或修改現(xiàn)有的微服務(wù)
CICI有助于開(kāi)發(fā)和部署多個(gè)微服務(wù),但資源和復(fù)雜性(如虛擬機(jī)洲愤、操作系統(tǒng)颓芭、庫(kù)、磁盤卷柬赐、網(wǎng)絡(luò))在數(shù)量上無(wú)法與單體架構(gòu)應(yīng)用程序進(jìn)行比較亡问,在工具和角色可以支持云上大型自動(dòng)化環(huán)境
自動(dòng)化工具
自動(dòng)化實(shí)現(xiàn)快速軟件交付,解決管理許多微服務(wù)的復(fù)雜性
自動(dòng)化工具不是普通的IT\基礎(chǔ)設(shè)施應(yīng)用程序,如Active Directory州藕、Bind(DNS)束世、Sendmail(MTA),為了實(shí)現(xiàn)自動(dòng)化床玻,工程師應(yīng)具備編碼技能尤其是腳本語(yǔ)言毁涉,及基礎(chǔ)結(jié)構(gòu)運(yùn)維技能,如虛擬化锈死、網(wǎng)絡(luò)贫堰、存儲(chǔ)
DevOps是開(kāi)發(fā)和運(yùn)維的結(jié)合,可實(shí)現(xiàn)自動(dòng)化流程待牵,如持續(xù)集成其屏、基礎(chǔ)設(shè)施即代碼和持續(xù)交付
持續(xù)集成工具
Git VCS工具,使用git進(jìn)行check in\out代碼缨该,托管git服務(wù)如Github偎行、Bitbucket,創(chuàng)建保存Git存儲(chǔ)庫(kù)贰拿,并與其他用戶協(xié)作
構(gòu)建服務(wù)器蛤袒,如jekins、Teamcity
托管服務(wù)膨更,軟件即服務(wù)Software as a service妙真,SasS,如Codeship询一、Travis CI
持續(xù)交付工具
配置管理工具:Puppet隐孽、Chef癌椿、Ansible
托管Chef平臺(tái):AWS Ops Works
AWS CloudFormation有助于實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼健蕊,支持AWS操作的自動(dòng)化:
創(chuàng)建VPC
在VPC上創(chuàng)建子網(wǎng)
在VPC上創(chuàng)建Internet網(wǎng)關(guān)
創(chuàng)建路由表以將子網(wǎng)關(guān)聯(lián)到Internet網(wǎng)關(guān)
創(chuàng)建安全組
創(chuàng)建云主機(jī)實(shí)例
將安全組關(guān)聯(lián)到云主機(jī)實(shí)例
AWS CodeDeploy聚焦軟件部署,允許用戶自定義
監(jiān)控和日志工具
Amazon CloudWatch是AWS內(nèi)置監(jiān)控工具
ELK是流行堆棧組合踢俄,是Elasticsearch缩功、Logstash、Kibana的組合
Logstash有助于采集日志并轉(zhuǎn)為JSON格式都办,發(fā)送到ES嫡锌,ES是一個(gè)分布式JSON數(shù)據(jù)庫(kù),Kibana可以可視化存在ES上的數(shù)據(jù)
Grafana 也是一個(gè)流行的可視化工具琳钉,與時(shí)間序列數(shù)據(jù)庫(kù)連接势木,如Graphite、InfluxDB歌懒,時(shí)間序列數(shù)據(jù)庫(kù)用于存儲(chǔ)扁平的啦桌、非規(guī)范化的數(shù)字型數(shù)據(jù),如CPU使用率和網(wǎng)絡(luò)流量,時(shí)間序列數(shù)據(jù)庫(kù)有內(nèi)置優(yōu)化甫男,可節(jié)省數(shù)據(jù)空間且改,更快的查詢歷史數(shù)據(jù),大多數(shù)DevOps監(jiān)控功能根據(jù)后端都適用時(shí)間序列數(shù)據(jù)庫(kù)
溝通工具
如使用多個(gè)DevOps工具板驳,需切換訪問(wèn)不同控制臺(tái)以檢查CICD流水線是否正常工作又跛,
如需考慮, 將源代碼合并到GitHub、在Jenkins上觸發(fā)新構(gòu)建若治、觸發(fā)AWS CodeDeploy以部署新版吧應(yīng)用程序
通信工具慨蓝,可以幫助集成這些DevOps工具,任何人都可查看事件并評(píng)論直砂,如Slack菌仁、HipChat
公有云
云計(jì)算,可以輕松實(shí)現(xiàn)CICD和自動(dòng)化工作静暂,特別是公有云API為DevOps提供多CICD支持
Amazon Web Services济丘、Google Cloud Platform