在計算機發展的很多年里,從最開始的插件版到個人計算機出現后,人們都習慣把所有的功能放到一個程序里,比如:一塊插件版、一個穿孔卡片、一個可執行文件等
隨著用戶需求越來越復雜,單體應用開始暴露一些問題:
- 靈活性差。因為包含的功能很多,單體應用體量很大,不同功能的邊界模糊,設計、開發和測試工作量成倍增加,很難靈活響應用戶需求
- 維護困難。一個小功能出問題可能導致整個應用崩潰,“千里之堤,潰于蟻穴”;一個小功能出問題,定位困難,修復困難,驗證困難,上線困難
- 擴展性差。單體應用想要嘗試新技術比較困難
- 彈性伸縮困難。超強的彈性能力可以應對復雜的網絡負載,例如:春運高峰訂票流量徒增,旅游淡季訂單量驟降等,彈性伸縮有兩個維度:
- 垂直伸縮。當負載增大時,增加服務器的CPU、內存、存儲空間、網絡帶寬等資源,再厲害的服務器,也不能無限制的增加資源,注定垂直伸縮是有上限的
- 水平伸縮。當負載增大時,增加一臺服務器,部署新的副本。負載的增加往往是極個別功能的負載,如果水平伸縮,會造成不必要的資源浪費
于是人們想到了把服務拆成一個一個更小的微服務,這是軟件層面(架構、代碼實現),除此之外,還需要很多其他方面來支撐,比如:基礎設施、CICD、服務治理等等,本文盡最大努力介紹微服務相關的技術,希望讓你對微服務及相關技術有一個大概的了解
如何拆分微服務
知乎搜索:微服務拆分規范
可以參考:The Twelve-Factor App
容器技術
容器技術的出現加快了微服務的盛行,提到容器技術一定避不開Open Container Initiative,制訂了兩個標準:
- Image spec
- Runtime spec
有關兩個標準的介紹可以閱讀:Open Container Initiative (OCI) Specifications
當今主流的容器生態玩家都遵循該標準,也有不同的實現:docker、containerd、crio等
在The Twelve-Factor App中:
- 原則2:顯式聲明依賴關系
- 原則5:嚴格分離構建、發布和運行
- 原則8:通過進程模型進行擴展
- 原則10:開發環境與線上環境等價
等特征都可以通過容器技術很好的支持,包括:
- 容器鏡像的構建能夠保證明確的依賴關系(例如Dockerfile)和可追溯
- 容器鏡像的管理可以保證開發環境和線上環境等價
- 容器能夠嚴格分離構建、運行,發布需要上層容器管理平臺協助
- 一般情況下,一個容器中包含一個主進程,運行一個容器鏡像的多個實例輕松實現“通過進程模型進行擴展”
可以從Docker — 從入門到實踐入門,熟練使用docker,再深入學習容器關鍵技術《自己動手寫Docker》
容器編排
容器技術能夠實現將單體應用拆分為微服務,解決了依賴關系、構建、運行、擴展等技術難題,但沒有很好的解決微服務的編排、通信的問題,這時候就需要引入容器編排技術,kubernetes已經成為容器編排的事實標準,所以本文只討論kubernetes
kubernetes官方的定義是:Kubernetes 是用于自動部署,擴展和管理容器化應用程序的開源系統
kubernetes有很多方面值得我們學習:
- 作為運維人員:從招聘網站發布的職位來看,越來越多的公司使用kubernetes作為業務應用部署平臺,運維人員應該熟練掌握集群、工作負載、服務負載均衡和聯網等的管理
- 作為開發人員:熟練掌握kubernetes的架構和擴展機制能夠清晰的了解所開發的軟件在整個kubernetes生態中的位置
- 作為設計人員:kubernetes的設計思想值得反復學習:archhitecture-principles.md(原則本身值得學習,先定原則,然后指導設計的方法同樣值得學習)、擴展性(kubernetes的擴展性做的非常好,在kube-apiserver、kube-controller-manager、kubelet、kubectl等多個點支持擴展,擴展的內容包括:自定義資源、認證、鑒權、控制器、容器運行時、容器網絡、容器存儲等,可以說是做到了無所不能擴展,極強的擴展性保證了促使了生態不斷豐富,最終成為容器編排領域的事實標準)
可以從《kubernetes權威指南》著手,結合kubernetes官方文檔和源碼深入了解kubernetes
kubernetes上的百花齊放
如果把kubernetes說成是一個平臺,或者是一個花壇,那他極強的擴展性就是很好的肥料,注定會迎來百花齊放的盛世
這里的擴展除了典型的:CRI、CNI、CSI是圍繞kubernetes的核心能力:工作負載和服務來進行擴展外,還有CRD、控制器、kubectl的擴展方式,更是引入了各種各樣的擴展
ECX就使用了kubernetes的諸多擴展:
- kubevirt:kubernetes上的虛擬化解決方案,官方文檔,想要快速了解架構可以參考architecture.md | developer documentation,虛擬化基礎知識參考KVM、qume、libvirt
- kube-ovn:integrates the OVN-based Network Virtualization with Kubernetes,github kube-ovn,OVN
- openebs:is the most widely deployed and easy to use open-source storage solution for Kubernetes. 官方文檔 | github
- prometheus:is an open-source systems monitoring and alerting toolkit originally built at SoundCloud,簡介 | 官方文檔