隨着Nacos 0.9版本的發佈,Nacos 離正式生產版本(GA)又近了一步,其實已經有很多企業已經上了生產,例如虎牙直播。html
本週三(今天),晚上 19:00~21:00 將會在 Nacos 釘釘羣(羣號:21708933)直播 Nacos 1.0.0 全部發布特性的預覽以及升級和使用上的指導。nginx
一般,企業研發的流程是這樣的:先在測試環境開發和測試功能,而後灰度,最後發佈到生產環境。而且,爲了生產環境的穩定,須要將測試環境和生產環境進行隔離,此時,必然會遇到問題是多環境問題,即:數據庫
本文將就 Nacos 環境隔離,向你們介紹阿里在這方面的實踐經驗。緩存
說到環境隔離,首先應該定義好什麼是環境。服務器
環境這個詞目前尚未一個比較統一的定義,有些公司叫環境,在阿里雲上叫 region,在 Kubernetes 架構中叫 namespace。本文認爲,環境是邏輯上或物理上獨立的一整套系統,這套系統中包含了處理用戶請求的所有組件,例如網關、服務框架、微服務註冊中心、配置中心、消息系統、緩存、數據庫等,能夠處理指定類別的請求。網絡
舉個例子,不少網站都會有用戶 ID 的概念,能夠按照用戶 ID 劃分,用戶 ID 以偶數結尾的請求所有由一套系統處理,而奇數結尾的請求由另外一套系統處理。以下圖所示。 咱們這裏說的環境隔離是指物理隔離,即不一樣環境是指不一樣的機器集羣。架構
上一節定義了環境的概念,即一套包含了處理用戶請求所有必要組件的系統,用來處理指定類別的請求。本節跟你們討論一下環境隔離有哪些好處。從概念的定義能夠看出,環境隔離至少有三個方面的好處:故障隔離、故障恢復、灰度測試;框架
故障隔離curl
首先,由於環境是可以處理用戶請求的獨立組件單元,也就是說用戶請求的處理鏈路有多長,都不會跳出指定的機器集羣。即便這部分機器故障了,也只是會影響部分用戶,從而把故障隔離在指定的範圍內。若是咱們按照用戶id把所有機器分爲十個環境,那麼一個環境出問題,對用戶的影響會下降爲十分之一,大大提升系統可用性。jvm
故障恢復
環境隔離的另外一個重要優點是能夠快速恢復故障。當某個環境的服務出現問題以後,能夠快速經過下發配置,改變用戶請求的路由方向,把請求路由到另外一套環境,實現秒級故障恢復。固然,這須要一個強大的分佈式系統支持,尤爲是一個強大的配置中心(如Nacos),須要快速把路由規則配置數據推送到全網的應用進程。
灰度測試
灰度測試是研發流程中不可或缺的一個環節。傳統的研發流程中,測試和灰度環節,須要測試同窗作各類各樣的配置,如綁定host、配置jvm參數、環境變量等等,比較麻煩。通過多年的實踐,阿里巴巴內部的測試和灰度對開發和測試很是友好,經過環境隔離功能來保證請求在指定的機器集羣處理,開發和測試不須要作任何作任何配置,大大提升了研發效率。
前兩節講到了環境的概念和環境隔離的做用,本節介紹如何基於 Nacos,實現環境的隔離。
Nacos 脫胎於阿里巴巴中間件部門的軟負載小組,在環境隔離的實踐過程當中,咱們是基於 Nacos 去隔離多個物理集羣的,同時,在 Nacos 客戶端不須要作任何代碼改動的狀況下,就能夠實現環境的自動路由。
開始前,咱們先作一些約束:
基本原理是:
上面講了基於IP段作環境隔離的約束和基本原理,那麼如何實現一個地址服務器呢。最簡單的方法是基於nginx實現,利用nginx的geo模塊,作IP端和環境的映射,而後利用nginx返回靜態文件內容。
在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 的開發和社區維護,阿里巴巴高級開發工程師。
本文爲雲棲社區原創內容,未經容許不得轉載。