阿里巴巴基于 Nacos 实现环境隔离的实践
隨著Nacos 0.9版本的發布,Nacos 離正式生產版本(GA)又近了一步,其實已經有不少企業已經上了生產,例如虎牙直播。
本周三(今天),晚上 19:00~21:00 將會在 Nacos 釘釘群直播 Nacos 1.0.0 所有發布特性的預覽以及升級和使用上的指導。
Nacos環境隔離
通常,企業研發的流程是這樣的:先在測試環境開發和測試功能,然后灰度,最后發布到生產環境。并且,為了生產環境的穩定,需要將測試環境和生產環境進行隔離,此時,必然會遇到問題是多環境問題,即:
- 多個環境的數據如何隔離?
- 如何優雅的隔離?(不需要用戶做任何改動)
本文將就 Nacos 環境隔離,向大家介紹阿里在這方面的實踐經驗。
什么是環境?
說到環境隔離,首先應該定義好什么是環境。
環境這個詞目前還沒有一個比較統一的定義,有些公司叫環境,在阿里云上叫 region,在 Kubernetes 架構中叫 namespace。本文認為,環境是邏輯上或物理上獨立的一整套系統,這套系統中包含了處理用戶請求的全部組件,例如網關、服務框架、微服務注冊中心、配置中心、消息系統、緩存、數據庫等,可以處理指定類別的請求。
舉個例子,很多網站都會有用戶 ID 的概念,可以按照用戶 ID 劃分,用戶 ID 以偶數結尾的請求全部由一套系統處理,而奇數結尾的請求由另一套系統處理。如下圖所示。 我們這里說的環境隔離是指物理隔離,即不同環境是指不同的機器集群。
環境隔離有什么用
上一節定義了環境的概念,即一套包含了處理用戶請求全部必要組件的系統,用來處理指定類別的請求。本節跟大家討論一下環境隔離有哪些好處。從概念的定義可以看出,環境隔離至少有三個方面的好處:故障隔離、故障恢復、灰度測試;
故障隔離
首先,因為環境是能夠處理用戶請求的獨立組件單元,也就是說用戶請求的處理鏈路有多長,都不會跳出指定的機器集群。即使這部分機器故障了,也只是會影響部分用戶,從而把故障隔離在指定的范圍內。如果我們按照用戶id把全部機器分為十個環境,那么一個環境出問題,對用戶的影響會降低為十分之一,大大提高系統可用性。
故障恢復
環境隔離的另一個重要優勢是可以快速恢復故障。當某個環境的服務出現問題之后,可以快速通過下發配置,改變用戶請求的路由方向,把請求路由到另一套環境,實現秒級故障恢復。當然,這需要一個強大的分布式系統支持,尤其是一個強大的配置中心(如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 - 驗證
至此, 一個簡單的根據IP網段做環境隔離的示例已經可以工作了,不同網段的nacos客戶端會自動獲取到不同的Nacos服務端IP列表,實現環境隔離。這種方法的好處是用戶不需要配置任何參數,各個環境的代碼和配置是一樣的,但需要提供底層服務的同學做好網絡規劃和相關配置。
總結
本文簡單介紹了環境隔離的概念,環境隔離的三個好處以及 Nacos 如何基于網段做環境隔離。最后,給出了一個基于 Nginx 做 Endpoint 服務端的環境隔離配置示例。需要注意的是,本文只是列出了一種可行的方法,不排除有更優雅的實現方法,如果大家有更好的方法,歡迎到Nacos 社區或官網貢獻方案。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的阿里巴巴基于 Nacos 实现环境隔离的实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里专家杜万:Java响应式编程,一文全
- 下一篇: 为什么说流处理即未来?