如何在 Azure APIM 中禁用基于 azure 订阅的速率限制策略
How to disable rate limit policy based on the azure subscription in Azure APIM
我有一个针对不同环境使用单个 policy.xml 的用例,但是速率限制仅适用于特定环境。
例如:
Dev:速率限制适用(托管在 dev azure 订阅中)
QA:速率限制不适用(托管在测试 Azure 订阅中)
Prod:速率限制适用(托管在 prod Azure 订阅中)
更新:
从此处 :
的其中一篇帖子中尝试过此操作
<choose>
<when condition="@(context.Subscription.Name=="abcd")">
<rate-limit-by-key calls="1" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Subscription.Name=="efgh")">
<rate-limit-by-key calls="2" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
下面的片段来自入站请求,我不明白的是第一个 when 元素条件属性的值是 false 即使它是从“abcd”订阅执行的。
choose (7.565 ms)
{
"message": "Expression was successfully evaluated.",
"expression": "context.Subscription.Name==\"abcd\"",
"value": false
}
choose (0.251 ms)
{
"message": "Expression was successfully evaluated.",
"expression": "context.Subscription.Name==\"efgh\"",
"value": false
}
通过以下方法对我有用的解决方案:
<choose>
<when condition="@(context.Request.Url.Host.Contains("dev"))">
<rate-limit-by-key calls="1" renewal-period="5" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Request.OriginalUrl.Host.Contains("prod")">
<rate-limit-by-key calls="2" renewal-period="10" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
1.The 基于订阅密钥的方法如下。
您可以为每个环境定义一个订阅密钥。在下面的示例中,我在开发环境中创建了一个名为 dev
的订阅,在生产环境中创建了一个名为 prod
的订阅。您可以查看此 link to understand how to create a subscription key. Once you creaete subscription keys on all three environment. You can add the following policy to your inbound 政策。
<choose>
<when condition="@(context.Subscription.Name=="dev")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Subscription.Name=="prod")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
完成此操作后,下一步是您需要确保此订阅密钥由客户端发送。您可以在设置中启用此功能。
如果您不想创建和维护订阅。还有另一种方法。这里的条件可以根据资源的名称。
2。第二种方法很简单,就是引用 context
中的任何变量
在这里你可以引用一个变量来区分你的环境。像下面这样。
<choose>
<when condition="@(context.Request.OriginalUrl.Host=="www.devenvironment.com")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Request.OriginalUrl.Host=="www.prodenvironment.com")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
我认为如果除了环境之外没有任何其他限制,第二个很容易。您实际上可以引用上下文中可用的任何属性,而不仅仅是 context.Request.OriginalUrl.Host
编辑:关于为什么这个 中的示例没有像您期望的那样执行是:context.Subscription.Name 不是您的 azure 的订阅。它是您在 API 管理器下创建的订阅,客户端可以使用它访问 API。我希望我的回答描述有适当的链接
我有一个针对不同环境使用单个 policy.xml 的用例,但是速率限制仅适用于特定环境。
例如:
Dev:速率限制适用(托管在 dev azure 订阅中)
QA:速率限制不适用(托管在测试 Azure 订阅中)
Prod:速率限制适用(托管在 prod Azure 订阅中)
更新:
从此处
<choose>
<when condition="@(context.Subscription.Name=="abcd")">
<rate-limit-by-key calls="1" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Subscription.Name=="efgh")">
<rate-limit-by-key calls="2" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
下面的片段来自入站请求,我不明白的是第一个 when 元素条件属性的值是 false 即使它是从“abcd”订阅执行的。
choose (7.565 ms)
{
"message": "Expression was successfully evaluated.",
"expression": "context.Subscription.Name==\"abcd\"",
"value": false
}
choose (0.251 ms)
{
"message": "Expression was successfully evaluated.",
"expression": "context.Subscription.Name==\"efgh\"",
"value": false
}
通过以下方法对我有用的解决方案:
<choose>
<when condition="@(context.Request.Url.Host.Contains("dev"))">
<rate-limit-by-key calls="1" renewal-period="5" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Request.OriginalUrl.Host.Contains("prod")">
<rate-limit-by-key calls="2" renewal-period="10" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
1.The 基于订阅密钥的方法如下。
您可以为每个环境定义一个订阅密钥。在下面的示例中,我在开发环境中创建了一个名为 dev
的订阅,在生产环境中创建了一个名为 prod
的订阅。您可以查看此 link to understand how to create a subscription key. Once you creaete subscription keys on all three environment. You can add the following policy to your inbound 政策。
<choose>
<when condition="@(context.Subscription.Name=="dev")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Subscription.Name=="prod")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
完成此操作后,下一步是您需要确保此订阅密钥由客户端发送。您可以在设置中启用此功能。
如果您不想创建和维护订阅。还有另一种方法。这里的条件可以根据资源的名称。
2。第二种方法很简单,就是引用 context
中的任何变量在这里你可以引用一个变量来区分你的环境。像下面这样。
<choose>
<when condition="@(context.Request.OriginalUrl.Host=="www.devenvironment.com")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<when condition="@(context.Request.OriginalUrl.Host=="www.prodenvironment.com")">
<rate-limit-by-key calls="10000" renewal-period="15" counter-key="@(context.Subscription.Id)" />
</when>
<otherwise />
</choose>
我认为如果除了环境之外没有任何其他限制,第二个很容易。您实际上可以引用上下文中可用的任何属性,而不仅仅是 context.Request.OriginalUrl.Host
编辑:关于为什么这个