高質量服務端之路 - Docker微服務架構實踐

jopen 9年前發布 | 32K 次閱讀 Docker
 

我們在后臺架構設計中經常會將較大的系統進行微服務化。這種架構的優勢是顯而易見的:模塊化的開發和維護相對要簡單很多,每個服務可以采用不同的 技術去構建,團隊的分工協作能力也能夠得到最大的發揮。然而微服務架構同樣也帶來了一些麻煩,比如運維的復雜度較高,數據的一致性等問題。我們認為實施高 質量的微服務架構至少需要解決以下三個問題。

定義微服務的邊界

  • 首先我們需要考慮如何對服務進行拆分,可以按照業務邏輯或是技術層面進行分割。
    不管是哪種方式,我們期望最終的效果是每一塊服務都應該提供單一的服務,并且能夠實現自治,即不需要過度依賴外部接口,出現問題后也不至于拖垮整個系統。
  • 其次我們需要選擇一種高效的服務間通信方式,我們經常會用到thrift或protobuf等RPC框架,以及各種消息隊列的靈活應用也能幫助優化我們的通信機制。
    通過使用RPC,服務之間的相互依賴都會被集中在接口上,比如我們將多個服務都會用到的語義全部封裝在thrift IDL中,這樣也避免服務內部的硬編碼導致難以化解的耦合。

微服務的部署

  • 當我們完成了子服務的拆分之后,需要考慮如何去部署他們。當然我們會想到把服務部署在彈性十足的云上,通過劃分不同的硬件資源來承載不同服務的運行,力求達到資源的合理性利用。
    然而在缺少高效運維平臺的支撐下,傳統云服務還是很難提供最佳的外部資源環境,部署和遷移的成本還是較高。
  • 這時候我們想到了用時下很流行的Docker對我們的系統進行Dockerize。通過這種方式,我們可以在一臺物理機器上虛擬出上百個 container,這種計算粒度足夠的小,加上操作系統級別的虛擬機制,整個服務構建起來也很方便快捷。而且可以考慮將不同的服務進程封裝在不同的 Docker Container,這樣各個服務的動態伸縮和遷移都能夠得到保證。

微服務架構的自我構建

  • 微服務由于網狀的架構,它的負載均衡及自我構建也比傳統的單一后端服務要復雜很多。
    所謂的自我構建就是,微服務架構中的任何一塊服務都能夠同步感知到其他關聯服務的變化。
    比如依賴的后端服務進行了擴容或者遷移,前端的服務是否能夠及時的發現。又或者,后端某個微服務進行了節點擴容,前端的代理服務是否能夠做到無縫感知。
  • 這里我們推薦一種輕量級的基于Docker的高可用web基礎架構,通過Etcd和Confd來做到負載均衡的自動發現。
    高質量服務端之路 - Docker微服務架構實踐
  • 其中Docker Container中部署的是我們的后端服務,比如Python的Uwsgi進程或者PHP的Fast CGI等。
  • 負載均衡我們通過Nginx來實現,當然也可以采用Haproxy等其它代理服務。
  • Etcd作為一個高可用的K/V存儲系統,我們用它來存儲后端服務的信息,對于負載均衡而言,只需要知道host:port即可。
  • 采用Confd作為配置管理工具,可以定時檢測Etcd節點的變化并獲取最新配置,然后結合模板引擎生成最新的Nginx配置文件,并自動執行service nginx reload。
  • Docker run shell是我們編寫的用于啟動Docker Container的腳本,同時兼顧在啟動時向etcd注冊最新的后端服務信息。
  • 上述架構中,每次啟動或是停止Container時,Etcd中的value都會發生變化,Confd也能較及時的感知到這一變化,從而實現了自動負載均衡。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!