阿里巴巴基於 Nacos 實現環境隔離的實踐

隨着Nacos 0.9版本的發佈,Nacos 離正式生產版本(GA)又近了一步,其實已經有很多企業已經上了生產,例如虎牙直播html

本週三(今天),晚上 19:00~21:00 將會在 Nacos 釘釘羣(羣號:21708933)直播 Nacos 1.0.0 全部發布特性的預覽以及升級和使用上的指導。nginx

Nacos環境隔離

一般,企業研發的流程是這樣的:先在測試環境開發和測試功能,而後灰度,最後發佈到生產環境。而且,爲了生產環境的穩定,須要將測試環境和生產環境進行隔離,此時,必然會遇到問題是多環境問題,即:數據庫

  • 多個環境的數據如何隔離?
  • 如何優雅的隔離?(不須要用戶作任何改動)

本文將就 Nacos 環境隔離,向你們介紹阿里在這方面的實踐經驗。緩存

什麼是環境?

說到環境隔離,首先應該定義好什麼是環境。服務器

環境這個詞目前尚未一個比較統一的定義,有些公司叫環境,在阿里雲上叫 region,在 Kubernetes 架構中叫 namespace。本文認爲,環境是邏輯上或物理上獨立的一整套系統,這套系統中包含了處理用戶請求的所有組件,例如網關、服務框架、微服務註冊中心、配置中心、消息系統、緩存、數據庫等,能夠處理指定類別的請求。網絡

舉個例子,不少網站都會有用戶 ID 的概念,能夠按照用戶 ID 劃分,用戶 ID 以偶數結尾的請求所有由一套系統處理,而奇數結尾的請求由另外一套系統處理。以下圖所示。 咱們這裏說的環境隔離是指物理隔離,即不一樣環境是指不一樣的機器集羣。架構

環境隔離有什麼用

上一節定義了環境的概念,即一套包含了處理用戶請求所有必要組件的系統,用來處理指定類別的請求。本節跟你們討論一下環境隔離有哪些好處。從概念的定義能夠看出,環境隔離至少有三個方面的好處:故障隔離、故障恢復、灰度測試;框架

故障隔離curl

首先,由於環境是可以處理用戶請求的獨立組件單元,也就是說用戶請求的處理鏈路有多長,都不會跳出指定的機器集羣。即便這部分機器故障了,也只是會影響部分用戶,從而把故障隔離在指定的範圍內。若是咱們按照用戶id把所有機器分爲十個環境,那麼一個環境出問題,對用戶的影響會下降爲十分之一,大大提升系統可用性。jvm

故障恢復

環境隔離的另外一個重要優點是能夠快速恢復故障。當某個環境的服務出現問題以後,能夠快速經過下發配置,改變用戶請求的路由方向,把請求路由到另外一套環境,實現秒級故障恢復。固然,這須要一個強大的分佈式系統支持,尤爲是一個強大的配置中心(如Nacos),須要快速把路由規則配置數據推送到全網的應用進程。

灰度測試

灰度測試是研發流程中不可或缺的一個環節。傳統的研發流程中,測試和灰度環節,須要測試同窗作各類各樣的配置,如綁定host、配置jvm參數、環境變量等等,比較麻煩。通過多年的實踐,阿里巴巴內部的測試和灰度對開發和測試很是友好,經過環境隔離功能來保證請求在指定的機器集羣處理,開發和測試不須要作任何作任何配置,大大提升了研發效率。

Nacos如何作環境隔離

前兩節講到了環境的概念和環境隔離的做用,本節介紹如何基於 Nacos,實現環境的隔離。

Nacos 脫胎於阿里巴巴中間件部門的軟負載小組,在環境隔離的實踐過程當中,咱們是基於 Nacos 去隔離多個物理集羣的,同時,在 Nacos 客戶端不須要作任何代碼改動的狀況下,就能夠實現環境的自動路由。

開始前,咱們先作一些約束:

  • 一臺機器上部署的應用都在一個環境內;
  • 一個應用進程內默認狀況下只連一個環境的 Nacos;
  • 經過某種手段能夠拿到客戶端所在機器 IP;
  • 用戶對機器的網段有規劃;

基本原理是:

  • 網絡中 32 位的 IPV4 能夠劃分爲不少網段,如192.168.1.0/24,而且通常中大型的企業都會有網段規劃,按照必定的用途劃分網段。咱們能夠利用這個原理作環境隔離,即不一樣網段的 IP 屬於不一樣的環境,如192.168.1.0/24屬於環境A, 192.168.2.0/24屬於環境B等。
  • Nacos 有兩種方式初始化客戶端實例,一種是直接告訴客戶端 Nacos 服務端的IP;另外一種是告訴客戶端一個 Endpoint,客戶端經過 HTTP 請求到 Endpoint,查詢 Nacos 服務端的 IP 列表。這裏,咱們利用第二種方式進行初始化。
  • 加強 Endpoint 的功能。在 Endpoint 端配置網段和環境的映射關係,Endpoint 在接收到客戶端的請求後,根據客戶端的來源 IP 所屬網段,計算出該客戶端的所屬環境,而後找到對應環境的 IP 列表返回給客戶端。以下圖

一個環境隔離server的示例

上面講了基於IP段作環境隔離的約束和基本原理,那麼如何實現一個地址服務器呢。最簡單的方法是基於nginx實現,利用nginx的geo模塊,作IP端和環境的映射,而後利用nginx返回靜態文件內容。

  • 安裝nginx http://nginx.org/en/docs/install.html
  • 在nginx-proxy.conf中配置geo映射,參考這裏

    geo $env {
      default        "";
      192.168.1.0/24 -env-a;
      192.168.2.0/24 -env-b;
    }
  • 配置nginx根路徑及轉發規則,這裏只須要簡單的返回靜態文件的內容;

    # 在http模塊中配置根路徑
    root                    /tmp/htdocs;
    
    # 在server模塊中配置
    location / {
      rewrite ^(.*)$  /$1$env break;
    }
  • 配置Nacos服務端IP列表配置文件,在/tmp/hotdocs/nacos目錄下配置以環境名結尾的文件,文件內容爲IP,一行一個

    $ll /tmp/hotdocs/nacos/
    total 0
    -rw-r--r-- 1 user1 users 0 Mar  5 08:53 serverlist
    -rw-r--r-- 1 user1 users 0 Mar  5 08:53 serverlist-env-a
    -rw-r--r-- 1 user1 users 0 Mar  5 08:53 serverlist-env-b
    
    $cat /tmp/hotdocs/nacos/serverlist
    192.168.1.2
    192.168.1.3
  • 驗證
curl 'localhost:8080/nacos/serverlist'
192.168.1.2
192.168.1.3

至此, 一個簡單的根據IP網段作環境隔離的示例已經能夠工做了,不一樣網段的nacos客戶端會自動獲取到不一樣的Nacos服務端IP列表,實現環境隔離。這種方法的好處是用戶不須要配置任何參數,各個環境的代碼和配置是同樣的,但須要提供底層服務的同窗作好網絡規劃和相關配置。

總結

本文簡單介紹了環境隔離的概念,環境隔離的三個好處以及 Nacos 如何基於網段作環境隔離。最後,給出了一個基於 Nginx 作 Endpoint 服務端的環境隔離配置示例。須要注意的是,本文只是列出了一種可行的方法,不排除有更優雅的實現方法,若是你們有更好的方法,歡迎到Nacos 社區或官網貢獻方案。

本文做者:正己,GitHub ID @jianweiwang,負責 Nacos 的開發和社區維護,阿里巴巴高級開發工程師。



本文做者:中間件小哥

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索