我正在想办法让 API 管理在多个后端上进行故障转移。
问题与ff非常相似:
区别在于我有三个后端,而不是两个后端。即
我最好的猜测是如果可能的话,以某种方式获得
<retry>
counter。像这样的东西:
<backend>
<retry condition="@(context.Response.StatusCode == 500" count="9" interval="10" first-fast-retry="true">
<choose>
<when condition="@(int.Parse(context.RetryCount) % 3 == 0)">
<set-backend-service backend-id="backend2" />
</when>
<when condition="@(int.Parse(context.RetryCount) % 3 == 1)">
<set-backend-service backend-id="backend3" />
</when>
<otherwise>
<set-backend-service backend-id="backend1" />
</otherwise>
</choose>
<forward-request />
</retry>
</backend>
但这不行,因为没有
context.RetryCount
,有这样的变量吗?或者有其他建议吗?
理想情况下,除了重试之外,我还希望能够对后端进行循环负载平衡。但我现在会采取任何解决方案。
弄明白了,张贴在这里,因为它可能会帮助某人。另外,如果这里有人知道更好的方法,请分享。
<policies>
<inbound>
<base />
<cache-lookup-value key="backend-counter" variable-name="backend-counter" />
<choose>
<when condition="@(!context.Variables.ContainsKey("backend-counter"))">
<set-variable name="backend-counter" value="0" />
<cache-store-value key="backend-counter" value="0" duration="100" />
</when>
</choose>
<choose>
<when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 0)">
<set-backend-service backend-id="backend1" />
<set-variable name="backend-counter" value="1" />
<cache-store-value key="backend-counter" value="1" duration="100" />
</when>
<when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 1)">
<set-backend-service backend-id="backend2" />
<set-variable name="backend-counter" value="2" />
<cache-store-value key="backend-counter" value="2" duration="100" />
</when>
<otherwise>
<set-backend-service backend-id="backend3" />
<set-variable name="backend-counter" value="0" />
<cache-store-value key="backend-counter" value="0" duration="100" />
</otherwise>
</choose>
</inbound>
<backend>
<retry condition="@(context.Response.StatusCode >= 500 || context.Response.StatusCode >= 400)" count="6" interval="10" first-fast-retry="true">
<choose>
<when condition="@(context.Response.StatusCode >= 500 || context.Response.StatusCode >= 400)">
<when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 0)">
<set-backend-service backend-id="backend1" />
<set-variable name="backend-counter" value="1" />
<cache-store-value key="backend-counter" value="1" duration="100" />
</when>
<when condition="@(int.Parse((string)context.Variables["backend-counter"]) == 1)">
<set-backend-service backend-id="backend2" />
<set-variable name="backend-counter" value="2" />
<cache-store-value key="backend-counter" value="2" duration="100" />
</when>
<otherwise>
<set-backend-service backend-id="backend3" />
<set-variable name="backend-counter" value="0" />
<cache-store-value key="backend-counter" value="0" duration="100" />
</otherwise>
</when>
</choose>
<forward-request buffer-request-body="true" />
</retry>
</backend>
<outbound>
<base />
<!-- Uncomment for debugging, this outputs the next backend-counter in the JSON response body. -->
<!--
<set-body>@{
JObject body = context.Response.Body.As<JObject>();
body.Add(new JProperty("backend-counter", ((string)context.Variables["backend-counter"])));
return body.ToString();
}</set-body>
-->
</outbound>
<on-error>
<base />
</on-error>
</policies>