中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐

發布時間:2020-06-26 19:17:02 來源:網絡 閱讀:368 作者:個推 欄目:云計算

2016年伊始,Docker無比興盛,如今Kubernetes萬人矚目。在這個無比需要創新與速度的時代,由容器、微服務、DevOps構成的云原生席卷整個IT界。在近期舉辦的QCon全球軟件開發大會上,個推應用平臺基礎架構高級研發工程師王志豪,基于他在基礎架構方面多年的經驗,分享了《個推基于Docker和Kubernetes的微服務實踐》。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐

個推應用平臺基礎架構高級研發工程師王志豪

一、微服務化

微服務架構

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


微服務是將單一的應用程序拆分成多個微小的服務,各個小服務之間松耦合,高內聚,每個小的服務可以單獨進行開發,不依賴于具體的編程語言,也可以使用不同的數據存儲技術,各個服務可以獨立部署,擁有各自的進程,相互之間通過輕量化的機制進行通信(如基于HTTP的API接口),所有的服務共同實現具體的業務功能。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


客戶端與服務端通信有2種方式,第一種是客戶端直接與各個微服務進行通信,這樣的架構有4個缺點:

(1)多次服務請求,效率低;

(2)對外暴露服務接口;

(3)接口協議無法統一;

(4)客戶端代碼復雜,服務端升級困難。

第二種方式是由API網關統一代理各個服務,對外提供統一的接口協議,該架構有3 個優勢:

(1)封裝服務接口細節,減少通信次數;

(2)統一通信協議,減少客戶端代碼耦合;

(3)統一鑒權,流控,防***;

在該架構下,網關也有可能成為系統瓶頸。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


相應地,這2種架構也帶來了2種服務注冊發現的方式,第一種是客戶端通過向服務的注冊中心查詢微服務的地址與其通信,第二種是增加統一的API網關來查詢。前者會增加客戶端的復雜度,開發成本高,第二種操作會顯得更加簡潔,因此我們在實踐的時候選擇了第二種架構方式。

微服務數量增加以后,服務之間的調用關系易產生耦合,甚至出現循環調用的情況,最好的應對方法是對服務進行分層,即將相互依賴的服務通過消息隊列等技術進行異步解耦,減少服務間的依賴。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐

服務分層

微服務的具體實踐

1.技術選型

在實踐中,我們的API Gateway使用的是OpenResty, OpenResty基于Nginx并擴展了對Lua的支持,可構建高并發的Web服務。我們通過HTTP接口實現客戶端通信,數據基本封裝成JSON格式,服務間的通信接口也是基于HTTP,并利用消息隊列進行異步解耦;至于服務注冊發現,我們使用的是Consul;我們選擇了Lua(擴展API Gateway的功能),Node.js(用于開發后端服務),Java(用于密集計算和與大數據通信的場景)作為主要的開發語言。

2.具體實現過程

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


在實踐過程中,我們使用Lua開發了自己的微服務框架——WebLua,其封裝服務之間的通信協議和訪問外部資源(如MysqlRedis等)的方法和依賴,同時提供了應用插槽。我們可以將每一個APP看成一個功能模塊,每個APP都需要插到WebLua中才能運行。WebLua可以方便地將模塊進行組合,既可以一個APP運行一個微服務,也可以多個APP一起對外提供服務。如此,開發者只需關注業務APP開發,很大程度上提高了開發效率。上圖右側是具體的代碼目錄結構,每個APP可分為Action,Page,Data三層,Action層在請求處理前后進行攔截,可做某些特殊處理,如請求前進行權限校驗等;Page層主要對請求的參數進行解析和校驗;Data層負責具體業務處理,同時提供了Shell腳本,可實現APP打包和部署安裝。

二、 API網關

在架構中一個重要角色就是API網關,下面來做一個介紹。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


從上面的對比圖中可以看到,左側是沒有API Gateway的,很多的模塊如Auth,Logging等,這些代碼都需要自己去實現,造成了模塊的重復建設,同時侵入了服務,功能擴展比較困難;右側的圖是使用了API Gateway之后的架構圖,所有通用模塊均在API Gateway實現,維護簡單,一處建設,各處受益。在這種情況下,對API Gateway也提出了更高要求——其功能必須可以很方便地擴展。

為了實現這樣的API網關,我們基于 OpenResty,借鑒了Kong和Orange的插件機制,通過插件來擴展API網關功能。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


從上面的API Gateway架構圖中可以看到,網關安裝諸多插件,每個插件會在請求的一個或多個階段發揮作用。插件配置會在Consul上更新,實時生效,插件規則可靈活配置。在操作中,我們為插件開發者提供了更多的自由,開發者可以自己定義格式。

三、容器化

在微服務落地實踐時我們選擇了Docker,下面將詳細介紹個推基于Docker的實踐。

首先網絡組件選擇的是Calico,服務注冊發現和配置管理選擇的是Consul。Consul-Template可實時監測Consul配置和服務的變化。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


個推鏡像體系是以CentOS為基礎系統鏡像,安裝OpenResty,Nodejs,JDK,由此得到環境鏡像,再在這個基礎上安裝微服務框架,獲得Gorp鏡像。再在這個基礎上安裝具體應用服務,得到應用服務鏡像。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐

服務注冊發現和配置更新流程

在API網關中,服務注冊通過Consul-Agent來實現,配置更新通過Consul-Template實現。Consul-Template主要更新3類配置,包括:Services:代理的所有微服務的服務地址;Products:簡言之即請求到微服務的映射表,如左上所示,所有請求都有統一個規范,從Host中可以獲取Prod,從URI中可以獲取APP,這 2個信息可將請求動態路由到具體服務;Nging-Conf:產品的Nginx配置。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


應用服務容器,服務注冊的方式跟API網關一致。首先,服務通過容器內部運行的Consul Agent將服務注冊到Consul上,其次通過Consul-Template來監測觀察 Consul上配置的變化,并更新配置文件。OpenResty或者WebNode配置的更新是直接覆蓋相應的配置文件,然后重啟對應的服務。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


上圖是個推基于Docker的集群架構,從中可看到,Docker集群包括3個節點,整個微服務分為3層,最上層是API Gateway,中間是業務層,最下層是一些多產品公用的基礎的微服務。

四、Kubernetes實踐

微服務雖然有很多好處,但也帶來了很多問題,其中一個就是運維復雜。以前運維只需要面對一個單體應用即可,現在可能面臨的是幾十甚至上百的微服務。在這種情況下,我們需要借助Kubernetes來解決問題。Kubernetes是Google開源的一個容器編排工具,可用于協助管理容器。

一開始,我們將容器向Kubernetes集群遷移時,沒做任何改變,只是采用Pod將所有的服務體系在Kubernetes集群運行。但隨著深入使用Kubernetes,我們對微服務做了一些改變。

1.首先我們換成用Deployment的方式來部署服務,Deployment會保證服務時刻有一定的副本存活,提高了服務穩定性。

2.其次,我們使用了Service,它可以代理Pod實現負載的均衡。

3. Kube-DNS可以將Service名解析成具體的ClusterIP,并且當Service沒有刪除重建時,其ClusterIP不變,如此DNS解析的緩存就不存在失效問題。基于Kube-DNS和Service的特性,后續我們改造了服務注冊發現體系。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


上圖是我們當前的服務部署方式,Pod用Deployment的方式創建,用Service來進行代理。

在實踐過程中,我們還遇到了另一個問題,即配置管理問題。

(1)微服務化后配置文件多而分散;

(2)不同環境之間有很多不必要的差異,如數據庫名;

(3)在很多不同環境中,相同的配置項暴露給測試和運維;

(4)沒有版本控制,回滾比較麻煩;

(5)基于Consul的Web UI無法對非法的輸入進行校驗。

針對這些問題我們做了以下調整:

(1) 統一不同環境間不必要的差異;

(2) 對配置文件進行模板化,只暴露差異部分,同時可實現不同配置文件集中配置;

(3)基于Consul開發配置中心,對產品配置集中管理;對輸入進行合法性校驗;增加版本控制,方便回滾。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐

配置中心流程圖

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


關于日志服務,我們在應用容器中集成了Fluent-Bit,配置了2個輸入源,TCP和tail, 輸出也有2個,一個是Elasticsearch,所有的日志都會上傳到ES通過Kibana展示查詢,另一個是日志審計服務,有些需要進行審計的操作日志會發送到日志審計服務進行進一步的分析處理。


微服務數量增加以后,請求鏈路可能延長,開發者在追蹤問題和排查性能瓶頸時會很不方便,因此我們引入了Zipkin,其主要用于分布式鏈路追蹤,在API Gateway實現了一個插件進行Span收集,后端服務則通過開源的中間件來實現。

QCon技術干貨:個推基于Docker和Kubernetes的微服務實踐


上圖是個推目前的整體架構圖,最底層是K8S集群,上面部署了Kube-DNS,Consul用于服務注冊發現和配置管理,再者是我們分層的微服務體系,右側是一些輔助的管理系統。

五、總結

上述是個推基于Docker和Kubernetes的整個微服務實踐過程,我們在實踐微服務過程中做了9件重要的事情,簡化了操作流程,提高了工作效率。個推設計實現了自己的微服務框架,完成微服務的容器化部署,自研API網關,并基于Consul的服務注冊和配置管理,使用Kubernetes對容器進行編排,基于Service和Kube-DNS對服務注冊和發現體系進行改造,搭建了自己的配置中心,優化了日志服務,實現了Zipkin鏈路追蹤。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

常宁市| 平顶山市| 房产| 台中县| 福州市| 景洪市| 白朗县| 慈利县| 新安县| 石泉县| 双鸭山市| 甘孜| 枝江市| 乐山市| 阿鲁科尔沁旗| 峨眉山市| 沁水县| 华蓥市| 阿克陶县| 龙游县| 云浮市| 陆川县| 宁强县| 福泉市| 临沭县| 诏安县| 固安县| 尖扎县| 上高县| 赞皇县| 砚山县| 宁海县| 木里| 南康市| 子长县| 武隆县| 屯门区| 永城市| 时尚| 图片| 宜宾县|