文章作者劉超
Citrix ADC的很多高級功能(Content Switch/Rewrite/Responder等),都是通過策略(policy)來控制該功能如何對請求或回應資料進行處理。策略使用邏輯運算式(expression)判斷資料,並根據判斷結果執行一個或多個動作(action)。
某些Citrix ADC功能使用預設語法策略(advanced expression),該策略提供了比舊的經典策略(classic expression)更強大的功能。如果已升級到Citrix ADC軟體的較新版本(12.1 build 56.20及以後),並且配置了經典策略,則需要將經典策略遷移到高級策略。當然遷移的工作不需要手工操作,Citrix提供了轉換工具NSPEPI,詳細使用方式可以參考下列兩個連結,後續該系列文章也會寫一寫這個話題。
https://support.citrix.com/article/CTX131024
https://docs.citrix.com/en-us/citrix-adc/13/appexpert/policies-and-expressions/introduction-to-policies-and-exp/converting-policy-expressions-nspepi-tool.html
回到正題,該系列(希望別從第一篇到放棄…)將通過模擬一個實際需求:
- 選擇正確的功能特性後將需求轉化為配置實現步驟—趕緊搞完好live better
開始正題,如何實現基於http post 請求的body 攜帶的不同json資料選擇不同伺服器?
直接上圖,通過postman提交兩個post請求,body攜帶的json資料,需要ADC根據json資料的author欄位的內容,對應栗子中就是如果請求的author欄位的內容為“Milton John”就把請求分發到伺服器1,如果請求的author欄位的內容為“JK Rowling”就把請求分發到伺服器2。




根據這個需求選擇對應的Citrix ADC功能相對比較簡單,很容易就能想到Content Switch。平時常用的根據HTTP請求的url或者hostname或者任何header選擇不同的伺服器,或是根據DNS請求解析的功能變數名稱選擇不同的伺服器,由此容易想到實現本文中的需求也用Content Switch。
確定使用Content Switch功能實現以後,根據上文需求描述及請求內容示例,我們就需求思考如何構建expression運算式來對請求內容進行判斷,進而執行相應的動作(分發到不同的伺服器)。請求內容從postman的截圖已經非常清楚了,需要運算式能夠從http post請求的內容(body)中,對body攜帶的資料類型json進行處理,需要匹配json資料類型的author欄位並得到對應的內容“Milton John”或者“JK Rowling”,根據匹配的結果是true或者false來決定執行的動作。得到這個分析結果就可以很容易的通過簡單易用的圖形化工具 expression editor來所見即所得的構建出具體策略了,不需要寫代碼哦。為了更好的體現所見即所得的構建策略運算式,可以通過下面影片瞭解。
可以看到按照上述明確的配置實現需求,通過expression editor下拉式功能表方式選擇對HTTP類型處理,需要處理的是請求(REQ)的body部分,從body的1000位元組大小資料中,通過XPATH_JSON標準語法(關於xpath請baidu一下有大量文章介紹),通過/Books/author匹配到需要處理的欄位,在判斷是否和預期的內容相等,這樣就很簡單的完成了運算式的構建。運算式執行的結果顯然是true或false,這樣就可以根據結果執行相應的動作-分發到不同的伺服器組。 最終配置根據需求配置完成的兩條策略如圖:

命令列如下:
- add cs policy po-1 -rule “HTTP.REQ.BODY(1000).XPATH_JSON(xp%/Books/author%).EQ(\”Milton John\”)” -action act1
- add cs policy po-2 -rule “HTTP.REQ.BODY(1000).XPATH_JSON(xp%/Books/author%).EQ(\”JK Rowling\”)” -action act2
其它配置過程如配置相應的action轉發到不同伺服器,將policy綁定到content switch vserver的過程就不詳細贅述了,和平時用到的常用content switch配置方法一致。
完成配置後還是通過postman測試,192.168.1.88是content switch vserver的vip,可以看到和預期結果一致。請求1得到server1_test_OK的回應,請求2得到server2_test_OK的回應,並且兩條策略也分別有命中的結果。


貌似到這步就可以live better了,在進一步想想假如生產環境有100種json資料內容需要分別分發到100組伺服器,那就要寫100條策略並綁定到content switch vserver上,工作量還是挺大的,也不利於用戶管理員維護。為了持續貫徹live better的方針政策,Citrix ADC可謂是用心良苦,一個看似很不起眼的小功能,可以大大簡化配置維護工作量。
前面把配置相應的action轉發到不同伺服器組的過程略過,大家對通常的配置都非常熟悉了,如下圖在選擇要轉發的目標時都是選擇loadbalancing virtual server。這裡也可以expression,我們來結合需求看一下這裡選擇expression的方式對配置工作量的簡化效果。

當選擇expression以後,原來需要手動指定的一個已經配置好的load balancing virtual server變成了通過運算式來對應到具體的loadbalancing virtual server。為了實現對應關係,這裡就需要loadbalancing virtual server遵循相應的命名規則。還是回到示例,我們可以首先配置兩個loadbalancing virtual server名字分別為vs_Milton Johnhe和vs_JK Rowling,vs命名規則為vs_加上從json資料中提取到的author欄位內容。因此這裡的運算式配置為”vs_” + HTTP.REQ.BODY(1000).XPATH_JSON(xp%/Books/author%),加號在運算式中的作用為字串拼接,所以這個配置的含義就是從HTTP請求的json資料中把author欄位的內容取出來和vs_字串拼接為需要轉發到的伺服器組(loadbalancing virtual server)的名字。

通過這樣優化配置以後和前文所述配置思路相比,policy就不需要配置2條,關聯兩個不同的action,而只需要綁定一條policy對應新方法配置的一個action相應的policy運算式可以寫為HTTP.REQ.METHOD.EQ(“POST”)&&HTTP.REQ.URL.PATH.HTTP.REQ.URL.PATH.STARTSWITH(“/test”), 即只要收到http請求方法為post,請求的介面URL以/test開頭,處理的動作為新方法配置的action,action中去分析json資料的內容並提取author欄位內容生成相應的需要轉發的目的伺服器組名稱,在轉發到對應伺服器。這樣優化配置後即使有100條規則,也只需要配置一條policy和一個action,而不需要像傳統配置思路需要配置100條policy對應100個action。當然100個load balancing virtual server還是需要配置的,這在兩種實現手段上是完全一樣的。而配置100個load balancing virtual server大家肯定都有簡化的手段了,比如傳統的編輯成命令列執行就不贅述了。後面有時間也會寫一下更簡單的方式通過Citrix ADC的另一強大功能Nitro API,寫一個小腳本調用API自動配置大量的配置物件。 最後想說的是,類似這樣的需求會越來越多,當前應用真的是API時代了,大量功能通過調用介面的方式實現,而json這種資料格式非常適合資料交換,資料的體積小,易於閱讀和編寫,程式也好操作比如用python可以直接轉換成字典資料類型操作,在有通過標準xpath語法也容易對需要的資料做匹配和提取。通過這篇實戰也可以瞭解到Citrix ADC可以簡單快速的對這種相對新的需求簡單靈活實現,也希望大家可以多多瞭解Citrix ADC運算式這一強大的功能。
發表迴響