利用動態遞送的遞送規則特性,您可以根據要求資訊,選取要採取特殊遞送行為來處理的要求。
開始之前
在群體控制器中啟用「動態遞送」。完成設定 Liberty 群體的動態遞送中的步驟。
提示: 如果要使用遞送規則來遞送至多個群體,每一個群體必須有不同名稱。
執行
collective create 指令時,請使用
--collectiveName 選項來命名群體。
如果群體已建立,您可以使用
<dynamicRouting> XML 元素的
connectorClusterName 內容,提供邏輯名稱給群體。
如果指定
connectorClusterName 內容,則值優先於
--collectiveName 選項指定的
collectiveName。請參閱
設定多個 Liberty 群體的動態遞送。
關於這項作業
依預設,動態遞送會在所有可處理要求的伺服器之間,平衡分配要求負載。配置遞送規則來置換預設行為,讓遞送規則可以將要求遞送至特定的伺服器資源、重新導向要求或拒絕要求。
註: 群體中的所有群體控制器必須透過動態遞送服務,提供一組相同的遞送規則。
將含有遞送規則的
.xml 檔,新增至其中一個控制器的
configDropins/defaults 目錄,以確保所有控制器使用相同的遞送規則。如需相關資訊,請參閱
自動提供配置給抄本共用。
程序
- 在控制器 server.xml 檔中,新增 <routingRules> 元素作為 <dynamicRouting> 元素的子項。
指定 <routingRules> 元素的 webServers 屬性。
每一個 <routingRules> 元素可以定義一組適合發佈規則的 Web 伺服器。
當 Web 伺服器連接至「動態遞送」服務時,此服務會將規則分送給該 Web 伺服器。
如果未指定任何 Web 伺服器,此服務會將規則分送給所有連接的 Web 伺服器。
如果指定多個 Web 伺服器,請使用逗點 (,) 作為定界字元。以 webServers 屬性值 * 所指定的任何規則,一律分送給所有 Web 伺服器。
請參閱下列範例:
<dynamicRouting>
<routingRules webServers="webserver1,webserver2">
...
</routingRules>
</dynamicRouting>
指定
<routingRules> 元素的
overrideAffinity 屬性。
依預設,對特定伺服器具有親緣性的要求會傳送至該伺服器,即使要求所符合的遞送規則並不含該親緣性伺服器當作目的地也一樣。
如果
overrideAffinity 內容設為
true,則選取相符規則中的目的地會優先於選取親緣性伺服器。
如果親緣性伺服器滿足相符規則,則會選擇親緣性伺服器,即使親緣性伺服器是在一組失效接手的端點中也一樣。
overrideAffinity 內容會套用至所有遞送規則,無法針對個別規則來設定。
<dynamicRouting>
<routingRules webServers="webserver1"
overrideAffinity=”true”>
...
</routingRules>
</dynamicRouting>
- 新增 <routingRule> 元素作為 <routingRules> 元素的子項。
- 指定遞送規則的 order 屬性並設為一個整數。
order 是必要屬性。規則是從最低至最高依序評估。
如果在多個規則中指派相同的 order 屬性,則會發佈第一個找到的規則,並捨棄有相同 order 屬性的其他所有規則。
最好保留規則序號之間的間隙,替未來的規則提供空間。
- 指定遞送規則的 matchExpression 屬性。將它設為可找出相符送入要求的表示式。
比對表示式結合一組固定的運算元和運算子。您可以利用 AND 和 OR 運算子,以結合多組運算元和運算子。
<dynamicRouting>
<routingRules webServers="webserver1,webserver2">
<routingRule order="100" matchExpression="URI LIKE'/myapp%'">
...
</routingRule>
</routingRules>
</dynamicRouting>
表 1. matchExpression 運算元. 在 matchExpression 定義中併入運算元。運算元 |
語法 |
說明 |
用戶端 IPV4 |
clientipv4 |
用戶端的 IP 位址,採用網際網路通訊協定第 4 版 (IPv4) 帶點四段式位址類型 n.n.n.n。 |
用戶端 IPV6 |
clientipv6 |
用戶端電腦的網際網路通訊協定第 6 版 (IPv6) 128 位元位址類型 x:x:x:x:x:x:x:x,遵循 Request for Comments 1924 (RFC 1924)。 |
Cookie 名稱 |
cookie$name |
Cookie 名稱。 例如,表示式 cookie$My_Cookie_Name='My_Cookie_Value' 會測試要求,判斷它是否包含名為 My_Cookie_Name 且值為 My_Cookie_Value 的 Cookie。
如果要測試特定 Cookie 是否存在,請使用下列其中一個表示式:
cookie$MyCookieName IS NOT NULL
cookie$MyCookieName IS NULL
|
標頭名稱 |
header$name |
標頭名稱和值。 例如,表示式 header$Host='localhost' 會測試要求是否包含值為 locahost 的 HTTP 主機標頭。
如果要測試主機標頭是否存在,請使用下列其中一個表示式:
header$Host IS NOT NULL
header$Host IS NULL
|
百分比 |
percentage$val |
百分比運算元會將部分時間百分比評估為 true。 例如,percentage$50 會將平均 50% 的時間評估為 true。
|
查詢參數 |
queryparm$name |
查詢參數名稱和值。 例如,表示式 queryparm$timezone='EST' 會測試要求,判斷要求是否包含名為 timezone 且值為 EST 的 HTTP 查詢參數。
如果要測試查詢參數是否存在,請使用下列其中一個形式:
queryparm$timezone IS NOT NULL
queryparm$timezone IS NULL
|
URI |
uri |
統一資源識別碼 (URI) |
虛擬主機 |
virtualhost |
要求的虛擬主機目標 |
虛擬埠 |
numeric |
要求的虛擬埠目標 |
表 2. matchExpression 運算子. 依需要在 matchExpression 定義中併入運算子。操作員 |
語法 |
說明 |
等於 |
= |
相等運算子表示區分大小寫的比對。 |
等於(不區分大小寫) |
EQUALSIGNORECASE |
同於 'String = String',但忽略字串大小寫。
例如,'ABC' EQUALSIGNORECASE 'abc' 會評估為 true,('ABC' = 'abc') 會評估為 false。 |
IN |
IN |
在單一表示式中表達具有多個值的運算元。例如,假設有一個名為 port 的運算元,如果要表達 port 值可以是整數 9080、9090 和 9091 中的任何一個或全部,表示式片段為 port IN
(9080,9090,9091)。 如何表達括弧內的值取決於資料類型。
比方說,如果 port 是整數,則不加引號的值才是正確語法。
如果 port 是字串,則正確語法為 port IN
('9080','9090','9091')。
|
非空值 |
IS NOT NULL |
如果指定的運算元存在,則評估為 true。 |
空值 |
IS NULL |
如果指定的運算元不存在,則評估為 true。 |
相似 |
LIKE |
表達字串運算元值的型樣相符。值在型樣相符開始的位置,必須包含萬用字元百分比符號 (%)。例如:- host LIKE %blanca 表示式會比對 blanca 這個單字,或以 blanca 結尾的其他任何單字。
- host LIKE blanca% 表示式會比對 blanca 這個單字,或以 blanca 開頭的其他任何單字。
- host LIKE %blanca% 表示式會比對 blanca 這個單字,或任何含有 blanca 的單字。
|
相似(不區分大小寫) |
LIKEIGNORECASE |
同於 'string LIKE string',但忽略字串大小寫。 |
之內相似 |
LIKEIN |
評估某個字串是否存在於一份字串清單中。例如,string likein
(string1%, string2%, string3%, etc.) 評估為 true 時,就表示 string 符合括弧中的一或多個字串。在這個範例中,括弧包含三個 string 值。 |
- 指定遞送規則的動作類型。
三個可能的動作類型為 permitAction、redirectAction 或 rejectAction。對每一個遞送規則,只能指定三個動作類型的其中之一。
- 指定 permitAction 動作類型,將要求遞送至識別的端點。
- 將 <permitAction> 元素新增至 <routingRule> 元素。
- 選擇性地,將 allowMaintenanceModeServers 屬性新增至 <permitAction> 元素,以指定是否將符合規則的要求,傳送至處於維護模式的伺服器。
這個屬性的預設值是 false。
當這個屬性設為 true 時,符合這個規則的要求可以傳送至處於維護模式的伺服器。
- 將一或多個 <loadBalanceEndPoints> 元素新增至 <permitAction> 元素。
如果 <permitAction> 元素有多個 <loadBalanceEndPoints> 元素,第一個 <loadBalanceEndPoints> 元素會作為一組主要目的地。
所有後續的 <loadBalanceEndPoints> 元素作為失效接手目的地。<loadBalanceEndPoints> 元素的定義順序決定失效接手優先順序。
- 將一或多個 <endpoint> 元素新增至每一個 <loadBalanceEndPoints> 元素。
- 將 destination 屬性新增至每一個 <endpoint> 元素。
將 destination 屬性設為伺服器類型或叢集類型。
如果要指定伺服器類型的端點,請指定 server=,後面接著四段式伺服器規格,並以逗點區隔各部分:
<endpoint destination="server=collective_name,host_name,wlp.user.dir,server_name"/>
- collective_name 是伺服器所屬的群體名稱。
- host_name 是主機位址。
- wlp.user.dir 是定義伺服器之主機系統上的 Liberty 使用者目錄。您在這裡也許可以使用 ${wlp.user.dir} 變數,但可能不適當。
評估這個 server.xml 時,${wlp.user.dir} 的值是定義控制器伺服器的目錄。
這可能不是定義成員伺服器的相同目錄。
- server_name 是伺服器名稱。
如果要指定叢集類型的端點,請指定 cluster=,後面接著兩段式伺服器規格,並以逗點區隔各部分:
<endpoint destination="cluster=collective_name,cluster_name"/>
- collective_name 是定義叢集的群體名稱。
- cluster_name 是叢集名稱。
伺服器或叢集目的地規格的所有部分,可使用萬用字元 (*) 來符合任何字串。如果要使用遞送規則來遞送至多個群體,每一個群體必須有不同名稱。
如果指定 <dynamicRouting> 元素的 connectorClusterName 屬性,則群體名稱是 connectorClusterName 屬性的值。
如果未指定 <dynamicRouting> 的 connectorClusterName 屬性,則群體名稱是您執行 collective create 指令時,用於 --collectiveName 選項的值。
如果未指定 connectorClusterName 屬性,也未使用 --collectiveName 選項,則群體名稱是 defaultCollective。
下列範例顯示具有伺服器類型端點的 <permitAction> 元素:
<dynamicRouting maxRetries="5" retryInterval="10000">
<routingRules webServers="myWebServer">
<routingRule order="100" matchExpression="URI LIKE '/myapp%'">
<permitAction>
<loadBalanceEndPoints>
<endpoint destination="server=collective1,myhost,/opt/IBM/liberty/wlp/usr,member1"/>
</loadBalanceEndPoints>
</permitAction>
</routingRule>
</routingRules>
</dynamicRouting>
- 指定 redirectAction 動作類型,將要求遞送至另一個位置。
- 將 <redirectAction> 元素新增至 <routingRule> 元素。
- 將 location 屬性新增至 <redirectAction> 元素。將 location 屬性設為要求的新目的地。
下列範例顯示 <redirectAction> 元素:
<dynamicRouting maxRetries="5" retryInterval="10000">
<routingRules webServers="myWebServer">
<routingRule order="200" matchExpression="URI LIKE '/myapp%'">
<redirectAction location="http://some.other.destination" />
</routingRule>
</routingRules>
</dynamicRouting>
- 指定 rejectAction 動作類型,以特定回應碼來拒絕要求。
- 將 <rejectAction> 元素新增至 <routingRule> 元素。
- 將 code 屬性新增至 <rejectAction> 元素。將 code 屬性設為 HTTP 回應碼,在要求符合規則時使用。此代碼必須是 Web 伺服器支援的錯誤碼。
下列範例顯示 <rejectAction> 元素:
<dynamicRouting maxRetries="5" retryInterval="10000">
<routingRules webServers="myWebServer">
<routingRule order="300" matchExpression="URI LIKE '/myapp%'">
<rejectAction code="503" />
</routingRule>
</routingRules>
</dynamicRouting>
結果
定義規則之後,當 Web 伺服器連接至動態遞送服務時,就會分送與該 Web 伺服器相關聯的規則,以及與所有 Web 伺服器相關聯的規則。
Web 伺服器會根據規則中的比對表示式來比對要求。表示式是根據規則順序,從最低至最高來評估。將會使用第一個具有相符表示式的規則。
與規則相關聯的動作決定如何處理要求。如果不符合任何規則,則會在所有可處理要求的伺服器之間,平衡分配要求負載。
依預設,當要求具有階段作業親緣性時,將根據親緣性來選取伺服器。如果找到親緣性伺服器,則會選擇該伺服器,不會評估遞送規則。
如果要讓遞送規則置換親緣性選擇,您可以將 overrideAffinity 屬性新增至 server.xml 檔的 <routingRules> 元素。
範例
下列範例結合多個規則:
<dynamicRouting>
<routingRules webServers="myWebServer">
<routingRule order="100" matchExpression="URI LIKE '/myapp%'">
<permitAction>
<loadBalanceEndPoints>
<endpoint destination="server=collective1,*,*,member1"/>
</loadBalanceEndPoints>
<loadBalanceEndPoints>
<endpoint destination="server=collective2,*,*,member1"/>
</loadBalanceEndPoints>
</permitAction>
</routingRule>
<routingRule order="200" matchExpression="uri like '/AppX%' AND queryparm$test = 'true'">
<permitAction allowMaintenanceModeServers="true">
<loadBalanceEndPoints>
<endpoint destination="cluster=collective1,clusterB"/>
<endpoint destination="cluster=collective2,clusterB"/>
</loadBalanceEndPoints>
</permitAction>
</routingRule>
<routingRule order="300" matchExpression=" uri like '/AppX%' ">
<permitAction>
<loadBalanceEndPoints>
<endpoint destination="cluster=collective1,clusterA"/>
<endpoint destination="cluster=collective2,clusterA"/>
</loadBalanceEndPoints>
</permitAction>
</routingRule>
<routingRule order="400" matchExpression="URI LIKE '/myoldapp'">
<redirectAction location="http://mysite/mynewapp" />
</routingRule>
<routingRule order="500" matchExpression="URI LIKE '/myveryoldapp'">
<rejectAction code="503" />
</routingRule>
</routingRules>
</dynamicRouting>
-order 100 的遞送規則會將 /AppX 要求的遞送目的地,限制為兩個群體上的兩個特定叢集。
–order 200 的遞送規則顯示如何啟用從一組端點至另一組端點的失效接手。
規則 200 會將所有符合表示式的要求,遞送至 collective1 中任何可處理要求的伺服器。
如果 collective1 中所有可處理要求的伺服器都無法使用,則會選擇 collective2 中可處理要求的伺服器,以處理符合規則表示式的要求。
–order 300 的遞送規則示範將測試要求遞送至處於維護模式的伺服器。
如果新增 test=true 作為查詢參數,則會將這些要求傳送至 collective1 中的 server1,即使該伺服器處於維護模式也一樣。
–order 400 的遞送規則顯示重新導向規則的範例。–order 500 的遞送規則顯示拒絕規則的範例。