跨多个后端服务器进行负载均衡

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

Apigee Edge 通过提供对负载的内置支持来提升 API 的可用性 跨多个后端服务器实例实现负载均衡和故障切换。

TargetServer 配置将具体端点网址与 TargetEndpoint 分离开来 配置。每个 TargetServer 都由 TargetEndpoint 中的名称引用 HTTPConnection。您无需在配置中定义具体的网址,只需配置一个 或更多命名的 TargetServer,如 TargetEndpoint

TargetServer 定义包括名称、主机和端口,以及用于 指明 TargetServer 是启用还是禁用。

视频

观看以下视频,详细了解如何使用目标服务器进行 API 路由和负载均衡

视频 说明
使用目标服务器实现负载均衡 跨目标服务器的负载均衡 API。
根据环境使用目标服务器路由 API 根据环境将 API 路由到其他目标服务器。
API 路由和 使用目标服务器进行负载均衡(传统 Edge) 根据环境和负载均衡将 API 路由到其他目标服务器 在传统版 Edge 界面中跨目标服务器使用 API。

TargetServer 配置示例

以下代码定义了一个目标服务器:

<TargetServer  name="target1">
  <Host>1.mybackendservice.com</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer >

TargetServer 配置元素

下表介绍了用于创建和配置 TargetServer 的元素:

名称 说明 默认 是否必需?
name TargetServer 配置的名称,该名称在 环境TargetServer 名称只能包含字母数字字符。 不适用
Host

后端服务的主机网址(不含协议)。

不适用
Port 后端服务正在监听的端口 不适用
IsEnabled 指示 TargetServer 配置是已启用还是已停用的布尔值。 这样,您就可以在不修改 API 代理的情况下将 TargetServer 从轮替中移除 配置。一种常见的用法是编写可启用或停用 TargetServers 根据预期的容量需求、维护时间表 等等 true

使用界面管理目标服务器

管理目标服务器(如下所述)。

Edge

如需使用 Edge 界面管理目标服务器,请执行以下操作:

  1. 登录 apigee.com/edge
  2. 选择管理 >环境 >目标服务器
  3. 选择所需的环境,例如测试prod
  4. 如需创建目标服务器,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 点击 + 目标服务器
    2. 输入目标服务器的名称、主机和端口。

      例如:

      • 名称:target1
      • 主机:1.mybackendservice.com
      • 端口:80
    3. 根据需要选择 SSL
    4. 选择已启用以启用目标服务器。
    5. 点击添加
  5. 如需修改目标服务器,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 将光标置于要修改的目标服务器上,以显示操作菜单。
    2. 点击
    3. 修改目标服务器值。
    4. 点击更新
  6. 如需删除目标服务器,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 将光标置于要删除的目标服务器上,以显示操作菜单。
    2. 点击
    3. 点击删除以确认操作。

传统 Edge(私有云)

如需使用传统 Edge 界面访问“创建代理”向导,请执行以下操作:

  1. 登录 http://ms-ip:9000,其中 ms-ip 是管理服务器节点的 IP 地址或 DNS 名称。
  2. 选择 API >环境配置 >目标服务器
  3. 选择所需的环境,例如测试prod
  4. 如需创建目标服务器,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 点击修改
    2. 点击 + 目标服务器
    3. 输入目标服务器的名称、主机和端口。

      例如:

      • 名称:target1
      • 主机:1.mybackendservice.com
      • 端口:80
    4. 选择已启用以启用目标服务器。
    5. 点击保存
  5. 如需修改目标服务器,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 点击修改
    2. 修改目标服务器值。
    3. 点击保存
  6. 如需删除目标服务器,请执行以下操作: <ph type="x-smartling-placeholder">
      </ph>
    1. 点击修改
    2. 点击删除

使用 API 管理目标服务器

您可以使用 Edge API 创建、删除、更新、获取和列出目标服务器。对于 如需了解详情,请参阅 TargetServers

使用以下 API 调用来创建目标服务器:

$ curl -H "Content-Type:text/xml" -X POST -d \
'<TargetServer name="target1">
   <Host>1.mybackendservice.com</Host>
   <Port>80</Port>
   <IsEnabled>true</IsEnabled>
 </TargetServer>' \
-u email:password https://api.enterprise.apigee.com/v1/o/{org_name}/environments/test/targetservers

示例响应:

{
  "host" : "1.mybackendservice.com",
  "isEnabled" : true,
  "name" : "target1",
  "port" : 80
}

创建第一个 TargetServer 之后,请使用以下 API 调用创建第二个 TargetServer。 通过定义两个 TargetServer,您提供了两个可供 TargetEndpoint 用于负载均衡的网址:

$ curl -H "Content-type:text/xml" -X POST -d \
'<TargetServer  name="target2">
  <Host>2.mybackendservice.com</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer >' \
-u email:password https://api.enterprise.apigee.com/v1/o/{org_name}/environments/test/targetservers

示例响应:

{
  "host" : "2.mybackendservice.com",
  "isEnabled" : true,
  "name" : "target2",
  "port" : 80
}

使用以下 API 调用在环境中检索 TargetServer 列表:

$ curl -u email:password https://api.enterprise.apigee.com/v1/o/{org_name}/environments/test/targetservers

示例响应:

[ "target2", "target1" ]

现在有两个 TargetServer 可供测试中部署的 API 代理使用 环境为了在这些 TargetServer 之间实现流量负载平衡,您需要将 API 代理的目标端点中的 HTTP 连接配置为使用 TargetServer。

每个环境最多只能有 500 个 TargetServer, 请参阅限制主题。

配置 TargetEndpoint 以便对已命名的 TargetServer 进行负载平衡

现在有两个 TargetServer 可用,您可以修改 TargetEndpoint HTTP 连接设置,以按名称引用这两个 TargetServer:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <LoadBalancer>
      <Server name="target1" />
      <Server name="target2" />
    </LoadBalancer>
    <Path>/test</Path>
  </HTTPTargetConnection>
</TargetEndpoint>

以上配置是最基本的负载均衡配置。负载均衡器支持三种负载均衡算法:轮询、加权和最少连接。轮询是默认算法。由于以上配置中并未指定任何算法, 从 API 代理到后端服务器的出站请求会在两个版本之间交替: 即目标 1 和目标 2。

<Path> 元素构成了目标端点 URI 的基本路径, 所有目标服务器只有在使用 <LoadBalancer> 时才能使用该元素。否则会忽略该元素。在上面的示例中,到达“target1”的请求将是 对于其他目标服务器,则为 http://target1/test,依此类推。

设置负载平衡器选项

您可以使用负载上的负载均衡和故障切换选项来优化可用性 和 TargetServer 级别进行负载均衡。本部分介绍了这些选项。

算法

设置 <LoadBalancer> 使用的算法。可用的算法包括 RoundRobinWeightedLeastConnections,每个算法详见下文。

轮循

默认算法(即轮询)按照服务器在目标端点 HTTP 连接中的列出顺序将请求转发给每个 TargetServer。例如:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <Server name="target2" />
      </LoadBalancer>
      <Path>/test</Path>
  </HTTPTargetConnection>
</TargetEndpoint>

加权

通过加权负载均衡算法,您可以为 TargetServer 配置成比例的流量负载。加权负载平衡器将请求直接分配到您的 TargetServer 与每个 TargetServer 权重成比例。因此,加权算法要求您为每个 TargetServer 设置 weight 属性。例如:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <LoadBalancer>
      <Algorithm>Weighted</Algorithm>
      <Server name="target1">
        <Weight>1</Weight>
      </Server>
      <Server name="target2">
        <Weight>2</Weight>
      </Server>
    </LoadBalancer>
    <Path>/test</Path>
  </HTTPTargetConnection>
</TargetEndpoint>

在此示例中,每次向 target1 路由一个请求时,都将向 target2 路由两个请求。

最少连接

配置成使用最少连接算法的 LoadBalancer 可将出站请求路由到打开的 HTTP 连接数量最少的 TargetServer。例如:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>LeastConnections</Algorithm>
        <Server name="target1" />
        <Server name="target2" />
      </LoadBalancer>
  </HTTPTargetConnection>
  <Path>/test</Path>
</TargetEndpoint>

失败次数上限

从 API 代理发送到 TargetServer(它将请求重定向至另一个 TargetServer)的失败请求数量上限。

响应失败意味着 Apigee 不会收到目标服务器的任何响应。当出现这种情况时,失败计数器会加 1。

但是,当 Apigee 收到目标的响应时 即使响应是 HTTP 错误(例如 500),也会计为 目标服务器,且失败计数器会被重置。为了帮助确保错误的 HTTP 响应 (例如 500)也会递增失败计数器,以排出运行状况不佳的服务器 负载均衡轮替,则可以将 包含 <ResponseCode><ServerUnhealthyResponse> 元素 子元素添加到负载平衡器配置中。Edge 还会根据 错误。

在以下示例中,target1 将在五次后从轮播中移除 失败的请求,包括来自目标服务器的一些 5XX 响应。

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <Server name="target2" />
        <MaxFailures>5</MaxFailures>
        <ServerUnhealthyResponse>
            <ResponseCode>500</ResponseCode>
            <ResponseCode>502</ResponseCode>
            <ResponseCode>503</ResponseCode>
        </ServerUnhealthyResponse>
      </LoadBalancer>
      <Path>/test</Path>
  </HTTPTargetConnection>
</TargetEndpoint>

MaxFailures 默认值为 0。 这意味着,Edge 始终会尝试 连接到每个请求的目标服务器,并且绝不会从轮替中移除目标服务器。

最好使用 MaxFailures >0 和 HealthMonitor。 如果您配置 MaxFailures >0,则 TargetServer 从轮替中移除 目标失败的次数。当 HealthMonitor 已部署,Apigee 会自动将 根据 该 HealthMonitor 的配置信息。请参阅运行状况监控

或者,如果您配置 MaxFailures > 0,并且未配置 HealthMonitor,则在检测到失败后,Apigee 将不会自动将 TargetServer 重新纳入轮替。在这种情况下,您必须重新部署 API 代理,然后 Apigee 才会将 TargetServer 重新纳入轮替。请参阅部署 API 代理

重试

如果启用了重试功能,则每当响应失败(发生 I/O 错误或 HTTP 超时)或收到的响应与 <ServerUnhealthyResponse> 设置的值匹配时,系统就会重试请求。如需详细了解如何设置 <ServerUnhealthyResponse>,请参阅上面的失败次数上限

默认情况下,<RetryEnabled> 设置为 true。设置为 false 可停用重试功能。例如:

<RetryEnabled>false</RetryEnabled>

IsFallback

只能将一个 TargetServer 设置为后备服务器。在负载平衡器将所有其他 TargetServer 标识为不可用之前,后备 TargetServer 不会纳入负载平衡例程。当负载均衡器确定所有 TargetServer 均不可用时,所有流量都会路由到后备服务器。例如:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <Server name="target2" />
        <Server name="target3">
          <IsFallback>true</IsFallback>
        </Server>
      </LoadBalancer>
      <Path>/test</Path>
  </HTTPTargetConnection>
</TargetEndpoint>

以上配置会导致目标 1 和 2 之间进行轮询负载平衡,直到目标 1 和 2 都不可用。当目标 1 和 2 均不可用时,所有流量都会路由到目标 3。

路径

路径定义一个 URI 片段,该片段将会附加到 TargetServer 向后端服务器发出的所有请求。

此元素接受字面量字符串路径或消息模板。借助消息模板,您可以在运行时执行变量字符串替换操作。例如,在以下目标端点定义中,{mypath} 的值用于路径:

<HTTPTargetConnection>
    <SSLInfo>
      <Enabled>true</Enabled>
    </SSLInfo>
    <LoadBalancer>
      <Server name="testserver"/>
    </LoadBalancer>
    <Path>{mypath}</Path>
</HTTPTargetConnection>

为以下集群配置目标服务器: TLS/SSL

如果您使用 TargetServer 定义后端服务,且后端服务要求连接使用 HTTPS 协议,则您必须在 TargetServer 定义中启用 TLS/SSL。您必须这样做,因为 <Host> 标记不支持指定连接协议。下面显示了 TargetServer 定义对单向 TLS/SSL(其中 Edge 向后端服务发出 HTTPS 请求):

<TargetServer name="target1">
  <Host>mocktarget.apigee.net</Host>
  <Port>443</Port>
  <IsEnabled>true</IsEnabled>
  <SSLInfo>
      <Enabled>true</Enabled>
  </SSLInfo> 
</TargetServer>

如果后端服务需要双向 TLS/SSL,您可以使用与 TargetEndpoints 相同的 TLS/SSL 设置来配置 TargetServer:

<TargetServer  name="TargetServer 1">
    <IsEnabled>true</IsEnabled>
    <Host>www.example.com</Host>
    <Port>443</Port>
    <SSLInfo>
        <Ciphers/>
        <ClientAuthEnabled>true</ClientAuthEnabled>
        <Enabled>true</Enabled>
        <IgnoreValidationErrors>false</IgnoreValidationErrors>
        <KeyAlias>keystore-alias</KeyAlias>
        <KeyStore>keystore-name</KeyStore>
        <Protocols/>
        <TrustStore>truststore-name</TrustStore>
    </SSLInfo>
</TargetServer >

如需了解 <SSLInfo> 属性,例如 <Ciphers><ClientAuthEnabled>,请参阅 有关为虚拟主机设置这些属性的信息,请参阅配置对 API 的 TLS 访问 适用于私有云

有关配置出站 TLS/SSL 的完整说明,请参阅配置 TLS 从边缘到后端(Cloud 和 Private Cloud)

TargetServer 架构

请参阅 GitHub 上的 TargetServer 和其他实体的架构。

运行状况监控

借助运行状况监控,您可以主动轮询 TargetServer 配置中定义的后端服务网址,以增强负载平衡配置。启用运行状况监控功能后,当 HealthMonitor 确定 TargetServer 处于活动状态时,发生故障的 TargetServer 将会自动重新置于轮替中。

运行状况监控与 <MaxFailures> 配合工作。如果未启用运行状况监控功能,则 <MaxFailures> 会指定从 API 代理发送到 TargetServer(它将请求重定向至另一个 TargetServer)的失败请求数量上限。然后,在您重新部署代理之前,发生故障的 TargetServer 会停止轮替。

启用运行状况监控功能后,发生故障的 TargetServer 会自动重新置于轮替中,无需重新部署代理。

HealthMonitor 可充当一个简单的客户端,通过 TCP 或 HTTP 调用后端服务:

  • TCP 客户端仅确保能够打开套接字。
  • 您可将 HTTP 客户端配置为向后端服务提交有效的 HTTP 请求。您可以定义 HTTP GET、PUT、POST 或 DELETE 操作。HTTP 监视器调用的响应必须与 <SuccessResponse> 块中配置的设置相匹配。

成功和失败

当您启用健康状况监控后,Edge 会开始向您的目标发送健康检查 服务器。健康检查是发送到目标服务器的请求,用于确定 目标服务器的运行状况。

健康检查可能产生两种结果:

  • 成功:成功进行健康检查后,目标服务器被视为健康状况良好。通常,以下一项或多项原因导致此结果:
    • 目标服务器接受与指定端口的新连接,响应该端口上的请求,然后在指定的时间范围内关闭该端口。目标服务器的响应包含“Connection: close”
    • 目标服务器使用 200 (OK) 或您认为可以接受的其他 HTTP 状态代码来响应健康检查请求。
    • 目标服务器使用与预期邮件正文匹配的邮件正文响应健康检查请求。

    当 Edge 确定某个服务器运行状况良好时,它会继续或继续向该服务器发送请求。

  • 失败:目标服务器因各种原因而未通过健康检查,具体取决于检查类型。当目标服务器出现以下情况时,系统会记录失败:
    • 拒绝从 Edge 到健康检查端口的连接。
    • 在指定时间段内未响应健康检查请求。
    • 返回意外的 HTTP 状态代码。
    • 回复消息正文与预期消息正文不匹配。

    当目标服务器未通过健康检查时,Edge 会递增该服务器的失败计数。如果 该服务器的故障次数达到或超过预定义的阈值 (<MaxFailures>),Edge 停止向该服务器发送请求。

启用 HealthMonitor

如需创建 HealthMonitor,请将 <HealthMonitor> 元素添加到代理的 TargetEndpoint 的 HTTPConnection 配置中。您不能在界面中执行此操作。而是创建代理配置 请以 ZIP 文件格式上传到 Edge。代理配置是 API 代理各个方面的结构化描述。代理配置包括预定义目录结构中的 XML 文件。如需了解详情,请参阅 API 代理配置参考文档

简单的 HealthMonitor 定义了 IntervalInSec 与 TCPMonitor 或 HTTPMonitor 的组合。<MaxFailures> 元素指定从 API 代理发送到 TargetServer(它将请求重定向至另一个 TargetServer)的失败请求数量上限。默认情况下,<MaxFailures> 为 0, Edge 不会执行任何纠正操作。配置 Health Monitor 时,请确保将 <TargetEndpoint> 标记的 <HTTPTargetConnection> 标记中的 <MaxFailures> 设置为非零值。

TCPMonitor

以下配置定义了一个 HealthMonitor,它通过每 5 秒在端口 80 上打开一个连接来轮询每个 TargetServer。(端口为可选项。如果未指定,则 TCPMonitor 端口即为 TargetServer 端口。)

  • 如果连接失败或用时超过 10 秒,则该 TargetServer 的失败计数将会加 1。
  • 如果连接成功,则 TargetServer 的失败计数将重置为 0。

您可以将 HealthMonitor 添加为 TargetEndpoint 的 HTTPTargetConnetion 元素的子元素,如下所示:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <Server name="target2" />
        <MaxFailures>5</MaxFailures>
      </LoadBalancer>
      <Path>/test</Path>
      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <TCPMonitor>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
            <Port>80</Port>
        </TCPMonitor>
      </HealthMonitor>
  </HTTPTargetConnection>
. . .

带有 TCPMonitor 配置元素的 HealthMonitor

下表介绍了 TCPMonitor 配置元素:

名称 说明 默认 是否必需?
IsEnabled 启用或停用 HealthMonitor 的布尔值。 false
IntervalInSec 每个轮询 TCP 请求之间的时间间隔(秒)。 0
ConnectTimeoutInSec 必须建立与 TCP 端口的连接才算成功的时间。如果未能按指定的时间间隔连接,则计为失败,TargetServer 的负载均衡器失败次数加 1。 0
Port 可选。将用来建立 TCP 连接的端口。如果未指定,则 TCPMonitor 端口为 TargetServer 端口。 0

HTTPMonitor

使用 HTTPMonitor 的示例 HealthMonitor 每 5 秒向后端服务提交一次 GET 请求。以下示例将 HTTP Basic Authorization 标头添加到请求消息中。响应配置定义了要与后端服务的实际响应进行比较的设置。在以下示例中,预期响应是 HTTP 响应代码 200,以及其值为 YourOK 的自定义 HTTP 标头 ImOK。如果响应不匹配,则负载均衡器配置将请求视为失败。

HTTPMonitor 支持将后端服务配置为使用 HTTP 和单向 HTTPS 协议。但是,它不支持以下各项:

  • 双向 HTTPS(也称为双向 TLS/SSL)
  • 自签名证书

请注意,HTTP 监视器中的所有请求和响应设置将特定于必须调用的后端服务。

    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <IsSSL>true</IsSSL>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
          <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>80</Port>
          <Verb>GET</Verb>
          <Path>/healthcheck</Path>
          <Header name="Authorization">Basic 12e98yfw87etf</Header>
          <IncludeHealthCheckIdHeader>true</IncludeHealthCheckIdHeader>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
          <Header name="ImOK">YourOK</Header>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
    

带有 HTTPMonitor 配置元素的 HealthMonitor

下表介绍了 HTTPMonitor 配置元素:

名称 说明 默认 是否必需?
IsEnabled 启用或停用 HealthMonitor 的布尔值。 false
IntervalInSec 每个轮询请求之间的时间间隔(秒)。 0
Request

由 HealthMonitor 发送到轮替中的 TargetServer 的出站请求消息的配置选项。

该路径不支持变量。

不适用
IsSSL 指定是否使用 HTTPS(安全 HTTP)监控连接。

潜在 值: <ph type="x-smartling-placeholder">
    </ph>
  • true:使用 HTTPS。
  • false:使用 HTTP。
  • 未指定:使用目标服务器配置。
false
ConnectTimeoutInSec 必须通过 TCP 连接完成与 HTTP 服务的握手才算成功的时间(秒)。如果未能按指定的时间间隔连接,则计为失败,TargetServer 的负载均衡器失败次数加 1。 0
SocketReadTimeoutInSec 必须从 HTTP 服务读取数据才算成功的时间(秒)。如果未能按指定的时间间隔读取,则计为失败,TargetServer 的负载均衡器失败次数加 1。 0
Port 用来与后端服务建立 HTTP 连接的端口。 不适用
Verb 用于向后端服务发送每个轮询 HTTP 请求的 HTTP 动词。 不适用
Path 附加到 TargetServer 中定义的网址的路径。使用路径元素在 HTTP 服务上配置“轮询端点”。 不适用

IncludeHealthCheckIdHeader

允许您跟踪上游系统上的健康检查请求。IncludeHealthCheckIdHeader 采用布尔值,默认值为 false。如果将其设置为 true,则有一个名为 X-Apigee-Healthcheck-IdHeader 会被注入到健康检查请求。该标头的值是动态分配的,格式为 ORG/ENV/SERVER_UUID/N,其中 ORG 是组织名称,ENV 是环境名称,SERVER_UUID 是用于标识 MP 的唯一 ID,N 是经过的毫秒数(自 1970 年 1 月 1 日算起)。

生成的请求标头示例:

X-Apigee-Healthcheck-Id: orgname/envname/E8C4D2EE-3A69-428A-8616-030ABDE864E0/1586802968123
false
Payload 为每个轮询 HTTP 请求生成的 HTTP 正文。请注意,GET 请求不需要此元素。 不适用
SuccessResponse 轮询的后端服务生成的入站 HTTP 响应消息的匹配选项。如果响应不匹配,则失败次数会加 1。 不适用
ResponseCode 应从轮询的 TargetServer 接收的 HTTP 响应代码。代码与指定的代码不同会导致失败,且轮询后端服务的计数将加 1。您可以定义多个 ResponseCode 元素。 不适用
Headers 应从轮询的后端服务接收的一个或多个 HTTP 标头和值的列表。如果响应中的任何 HTTP 标头或值与指定值不同,都将导致失败,并且轮询 TargetServer 的计数将增加 1。您可以定义多个标头元素。 不适用