一般運算語言 (CEL) 是一種開放原始碼的非圖靈完備語言,可實作運算式評估的通用語意。Service Extensions 會使用 CEL 條件的子集,根據屬性資料做出鏈結評估決策。一般來說,條件運算式是由一或多個陳述式組成,並以邏輯運算子 (&&、|| 或 !) 連結。
屬性
對於任何連線要求,Proxy 都會擷取屬性,也就是一組情境資訊。屬性具有固定類型 (例如 string 或 int),且可能存在或不存在,視情境而定。在比對條件處理期間,屬性會公開給 CEL 執行階段。如要將特定屬性轉送至擴充功能服務或外掛程式,請使用 forwardAttributes 欄位。詳情請參閱「支援的屬性」。
要求屬性
您可以從要求中擷取下列屬性:
| 屬性 | 類型 | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
說明 |
|---|---|---|---|---|---|---|---|
request.headers |
地圖 | ✓ | ✓ | ✓ | ✓ | ✓ | HTTP 要求標頭的字串/字串對應,其中所有鍵均為小寫。 |
request.method |
字串 | ✓ | ✓ | ✓ | ✓ | ✓ | HTTP 要求方法 (例如 GET、POST)。 |
request.host |
字串 | ✓ | ✓ | ✓ | ✓ | ✓ | 功用相當於 request.headers['host']。 |
request.path |
字串 | ✓ | ✓ | ✓ | ✓ | ✓ | 要求的 HTTP 網址路徑。 |
request.query |
字串 | ✓ | ✓ | ✓ | ✓ | ✓ | 網址查詢字串 (name1=value&name2=value2)。 |
request.scheme |
字串 | ✓ | ✓ | ✓ | ✓ | ✓ | 網址配置 (http 或 https)。 |
request.backend_service_name |
字串 | — | ✓ | ✓ | — | — | 後端服務名稱。 |
request.backend_service_project_number |
整數 | — | ✓ | ✓ | — | — | 後端服務專案編號。 |
連線屬性
您可以從連線中擷取下列屬性:
| 屬性 | 類型 | LbEdge |
LbRoute |
LbTraffic |
Authz |
CdnEdge |
說明 |
|---|---|---|---|---|---|---|---|
source.ip |
字串 | ✓ | ✓ | ✓ | ✓ | — | 用戶端 IP 位址。 |
source.port |
整數 | ✓ | ✓ | ✓ | ✓ | ✓ | 用戶端連線通訊埠編號。 |
source.client_region |
字串 | ✓ | — | ✓ | — | ✓ | 兩個字母的用戶端國家/地區代碼。 |
connection.sni |
字串 | ✓ | — | ✓ | ✓ | ✓ | 下游 TLS 伺服器名稱指示。 |
connection.tls_version |
字串 | ✓ | — | ✓ | ✓ | ✓ | 下游 TLS 版本 (例如 TLSv1.2、TLSv1.3)。 |
connection.sha256_peer_certificate_digest |
字串 | ✓ | — | ✓ | ✓ | — | 對等互連憑證 SHA-256 摘要。 |
運算子
Service Extensions 支援多種運算子,可讓您透過簡單的運算式陳述式,建構複雜的比對條件。Service Extensions 支援邏輯運算子 (例如 &&、|| 和 !) 和字串操作運算子 (例如 x.contains('y'))。
字串操作運算子會比對您定義的字串或子字串。舉例來說,如果 HTTP 要求傳送至結尾為 example.com 的網域,request.host.endsWith('.example.com') 會評估為 true。
邏輯運算子可讓您驗證條件運算式中的多個變數。舉例來說,request.method == 'GET' && request.host.matches('.example.com') 會連結兩個陳述式,且兩個陳述式都必須為 true,才能產生 true 的整體結果。
邏輯運算子
下表說明 Service Extensions 支援的邏輯運算子。
| 運算式範例 | 說明 |
|---|---|
x == "foo" |
如果 x 等於常數字串常值引數,則傳回 true。 |
x == R"fo'o" |
如果 x 等於指定的原始字串常值 (不解譯逸出序列),則傳回 true。原始字串常值可用於表示程式碼必須用來逸出序列字元的字串。 |
x == y |
如果 x 等於 y,則傳回 true。 |
x != y |
如果 x 不等於 y,則傳回 true。 |
x && y |
如果 x 和 y 均為 true,則傳回 true。 |
x || y |
如果 x 和/或 y 為 true,則傳回 true。 |
!x |
如果布林值 x 為 false,則傳回 true。或者,如果布林值 x 為 true,則傳回 false。 |
m['k'] |
如果鍵 k 存在,則傳回字串對字串對應 m 中鍵 k 的值。如果沒有 k 鍵,則會傳回錯誤,導致評估中的規則不相符。 |
k in m |
如果字串索引鍵對應 m 中有索引鍵 k,則傳回 true。否則傳回 false。 |
字串操作運算子
下表說明 Service Extensions 支援的字串操作運算子。
| 運算式 | 說明 |
|---|---|
x.contains(y) |
如果字串 x 包含子字串 y,則傳回 true。 |
x.startsWith(y) |
如果字串 x 的開頭為子字串 y,則傳回 true。 |
x.endsWith(y) |
如果字串 x 的結尾是子字串 y,則傳回 true。 |
x.matches(y) |
如果字串 Service Extensions 在編譯 RE2 模式時會使用 RE2::Latin1 選項,這會停用 Unicode 功能。 Edge 擴充功能只允許每個 CEL 運算式使用一個規則運算式。 |
int(x) |
將 x 的字串結果轉換為 int 類型。您可以使用標準算術運算子 (例如大於 (>) 和小於或等於 (≤)),將轉換後的字串用於整數比較。這僅適用於可為整數的值。 |
運算式範例
比對並找出傳送至主機 example.com,而且以 123 的後端服務 bs1 為最終目的地的所有要求:
request.host == "example.com" && request.backend_service_name == "bs1" && request.backend_service_project_number == 123
比對並找出路徑為 */inventory,且 HTTP 標頭為 Hello 的所有要求。請注意,CEL 比對不區分標頭名稱的大小寫:
request.path.endsWith("/inventory") && "Hello" in request.headers
限制
為 Service Extensions 指定 CEL 運算式時,須遵守下列限制:
- 每個擴充功能的運算式數量上限:邊緣擴充功能為 1 個,其他擴充功能為 5 個
- 每個規則運算式的字元數上限:100
- 每個 CEL 運算式的字元數上限:500