For distributed platformsFor z/OS platforms[17.0.0.1 and later]

Liberty 动态路由选择配置路由规则

使用动态路由选择的路由规则功能部件,可根据请求信息选择特殊路由行为的请求。

开始之前

在集合体控制器中启用动态路由选择。完成为 Liberty 集合体设置动态路由选择中的步骤。

提示: 要使用路由规则以路由到多个集合体,每个集合体必须具有不同名称。运行 collective create 命令时使用 --collectiveName 选项指定集合体名称。如果已创建集合体,那么可使用 <dynamicRouting> XML 元素的 connectorClusterName 属性为集合体提供逻辑名称。如果指定了 connectorClusterName 属性,那么此值优先于使用 --collectiveName 选项指定的 collectiveName。请参阅为多个 Liberty 集合体设置动态路由选择

关于此任务

缺省情况下,动态路由选择会在可处理请求的所有服务器中均衡装入请求。将路由规则配置为覆盖缺省行为,以便路由规则可以将请求路由到特定服务器资源,重定向请求或拒绝请求。

注: 集合体中所有集合体控制器必须通过动态路由选择服务提供一组相同路由规则。将包含路由规则的 .xml 文件添加到其中一个控制器的 configDropins/defaults 目录以确保所有控制器使用相同路由规则。有关更多信息,请参阅在副本间自动共享配置

过程

  1. 在控制器 server.xml 文件中将 <routingRules> 元素作为 <dynamicRouting> 元素的子代添加。

    指定 <routingRules> 元素的 webServers 属性。每个 <routingRules> 元素可定义一组适当的其中发布规则的 Web 服务器。Web 服务器连接到 DynamicRouting 服务时,服务会将规则传递到此 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>
  2. <routingRule> 元素作为 <routingRules> 元素的子代添加。
    1. 为路由规则指定 order 属性并将其设置为整数。 order 属性是必需的。从最低顺序到最高顺序评估规则。如果为多个规则分配相同 order 属性,那么会发布找到的第一个规则,且会废弃具有相同顺序属性的所有其他规则。较好的实践是在规则的顺序编号之间保留空格,为将来规则提供空间。
    2. 为路由规则指定 matchExpression 属性。将其设置为可找到匹配传入请求的表达式。匹配表达式将一组固定操作数与操作程序组合。您可以通过使用 ANDOR 操作程序组合操作数和操作程序集。
    <dynamicRouting>
       <routingRules webServers="webserver1,webserver2">
          <routingRule order="100" matchExpression="URI LIKE'/myapp%'">
          ...
          </routingRule>
       </routingRules>
    </dynamicRouting>
    表 1. matchExpression 操作数. matchExpression 定义中包含操作数。
    操作数 语法 描述
    客户机 IPV4 clientipv4 使用因特网协议 V4 (IPv4) 点分四组地址类型 n.n.n.n 的客户机的 IP 地址。
    客户机 IPV6 clientipv6 因特网协议 V6 (IPv6) 128 位地址类型 x:x:x:x:x:x:x:x,符合客户机的请求评论 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 统一资源标识
    虚拟主机 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')

    不为 null IS NOT NULL 如果存在指定操作数,那么求值为 true
    为 null 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 与括号中一个或多个字符串匹配,那么 string likein (string1%, string2%, string3%, etc.) 将求值为 true。 在此示例中,括号包含三个 string 值。
  3. 为路由规则指定操作类型。

    三种可能的操作类型为 permitActionredirectActionrejectAction。为每个路由规则仅指定三种操作类型之一。

    • 指定 permitAction 操作类型以将请求路由到识别的端点。
      1. <permitAction> 元素添加到 <routingRule> 元素。
      2. (可选)将 allowMaintenanceModeServers 属性添加到 <permitAction> 元素,以指定是否将与规则匹配的请求发送到处于维护方式的服务器。此属性的缺省值为 false。 如果此属性设置为 true,那么可以将与此规则匹配的请求发送到处于维护方式的服务器。
      3. 将一个或多个 <loadBalanceEndPoints> 元素添加到 <permitAction> 元素。

        如果 <permitAction> 元素具有多个 <loadBalanceEndPoints> 元素,那么第一个 <loadBalanceEndPoints> 元素充当主要目标集。所有后续 <loadBalanceEndPoints> 元素充当故障转移目标。 <loadBalanceEndPoints> 元素的定义顺序确定故障转移优先级。

      4. 将一个或多个 <endpoint> 元素添加到每个 <loadBalanceEndPoints> 元素。
      5. 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 操作类型以将请求路由到其他位置。
      1. <redirectAction> 元素添加到 <routingRule> 元素。
      2. 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 操作类型以通过特定响应代码拒绝请求。
      1. <rejectAction> 元素添加到 <routingRule> 元素。
      2. 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 的路由规则说明拒绝规则的示例。


用于指示主题类型的图标 任务主题

文件名:twlp_wve_routing_rules.html