我正在尝试在SpikeArrest策略中代理超过其速率时返回自定义错误消息,但SpikeArrest似乎没有触发分配用于处理错误的策略:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest.BurstProtection">
<DisplayName>SpikeArrest.BurstProtection</DisplayName>
<FaultRules>
<FaultRule>
<Policy>
<Name>RaiseFault.BurstProtection</Name>
</Policy>
</FaultRule>
</FaultRules>
<Properties/>
<Identifier ref="request.header.sender-id"/>
<MessageWeight ref="1"/>
<Rate>1pm</Rate>
</SpikeArrest>
我以前在其他地方使用过这个构造(主要是在VerifyAPIKey中)并且它总是工作正常,但不是在这个。
我错过了什么吗?
我们正在运行Apigee Edge(安装包为14.01.0.0)
答案 0 :(得分:1)
之前我没有在策略中使用<FaultRules>
配置,但我知道如果违反了速率,SpikeArrest策略本身会在消息流中引发错误。这会将消息发送到故障流<FaultRules>
,然后您可以在其中定义类似RaiseFault.BurstProtection
的策略以设置自定义故障响应。在此处查看更多信息:http://apigee.com/docs/api-services/content/fault-handling
大多数策略在执行时确定应该引发错误(速率限制,xml / json注入策略,oauth v2策略等)时会引发错误。
我不确定您为RaiseFault.BurstProtection
使用的政策类型,但是当您使用在ProxyEndpoint或TargetEndpoint中定义的Apigee <FaultRules>
的方法时,您可以使用AssignMessage策略覆盖响应消息,设置自定义故障响应。
我喜欢使用Apigee中的故障规则流来设计代理,以构建更多的故障处理框架和故障规则的每策略配置。
答案 1 :(得分:0)
<FaultRules>
功能。
如果要为SpikeArrest引发自定义错误,请首先确保在SpikeArrest策略中设置continueOnError="true"
属性。这允许您忽略系统的通用响应输出。其次,您可以在后续政策中检查以下条件,利用ratelimit.<spike_arrest_policy_name>.exceed.count
变量:
...
<!-- Spike Arrest policy -->
<Step>
<Name>SpikeArrest.BurstProtection</Name>
</Step>
<!-- RaiseFault for Spike Arrest violation -->
<Step>
<Condition>(ratelimit.SpikeArrest.BurstProtection.exceed.count > 0)</Condition>
<Name>RaiseCustomFault</Name>
</Step>
...
满足条件后,您可以提出自己的自定义故障信息。
值得注意的是,SpikeArrest并不是真的有计数。有关SpikeArrest的其他SO问题,请参阅here。
重要编辑
ratelimit.<spike_arrest_policy_name>.exceed.count>0
检查此时无效。正如迈克尔所建议的那样,一个好的选择是离开continueOnError="true"
(默认值)。让Spike Arrest出错,然后在Proxy文件的顶部,利用FaultRules部分。您可以按如下方式检查正确的FaultRule条件:
<FaultRules>
<FaultRule name="FaultHandling">
<Step>
<Condition>(fault.name = "SpikeArrestViolation")</Condition>
<Name>RaiseSpikeCustomFault</Name>
</Step>
</FaultRule>
</FaultRules>
fault.name
值列在每个主题下的公共文档网站上,因此SpikeArrest是here。请参阅“特定于策略的错误代码”。