WSO2 — Реализация дроссельного посредника для политики, не блокирующей запросы с IP-адреса

#wso2 #wso2carbon #wso2ei #mediator

#wso2 #wso2-предприятие-интегратор #посредник

Вопрос:

Я боролся с посредничеством дроссельной заслонки WSO2 и настроил его с использованием документации WSO2. Тем не менее, я не могу достичь желаемой цели получения эффекта от политики.

Хотя код есть, но в политике написано что-то вроде этого:

  • ЕСЛИ запрос поступает с IP ={{MY_IP}} и количество запросов <= 10
  • ЗАТЕМ вызовите конечную точку / последовательность (AcceptSequence) -> При этом будет вызвана конечная точка
  • В ПРОТИВНОМ СЛУЧАЕ, ЕСЛИ количество запросов> 10, запросы будут регистрироваться в базе данных.

Я протестировал конечную точку для последовательности принятия и службу данных EI для rejectSequence как по отдельности, так и работают нормально. Я даже вижу запрос, поступающий в журналах EI wso2carbon, но нет никаких признаков вызова посредника дроссельной заслонки и возвращает «202 Принято»

 <?xml version="1.0" encoding="UTF-8"?>
<api context="/my_api" name="MY_API" version="1.0.0" version-type="context" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST">
        <inSequence>
            <log level="custom">
                <property expression="json-eval($)" name="Incoming Payload"/>
            </log>
            <property description="Client_Name" expression="$trp:Client_Name" name="Client_Name" scope="default" type="STRING"/>
            <property description="Client_DOB" expression="$trp:Client_DOB" name="Client_DOB" scope="default" type="STRING"/>
            <property description="Client_ID_Type" expression="$trp:Client_ID_Type" name="Client_ID_Type" scope="default" type="STRING"/>
            <property description="Client_ID_No" expression="$trp:Client_ID_No" name="Client_ID_No" scope="default" type="STRING"/>
            <property description="Client_Gender" expression="$trp:Client_Gender" name="Client_Gender" scope="default" type="STRING"/>
            <property description="Client_Nationality" expression="$trp:Client_Nationality" name="Client_Nationality" scope="default" type="STRING"/>
            <property description="Source_System" expression="$trp:Source_System" name="Source_System" scope="default" type="STRING"/>
            <property description="Transaction_Type" expression="$trp:Transaction_Type" name="Transaction_Type" scope="default" type="STRING"/>
            <property description="Transaction_Ref_No" expression="$trp:Transaction_Ref_No" name="Transaction_Ref_No" scope="default" type="STRING"/>
            <property description="Transaction_Ref_No_2" expression="$trp:Transaction_Ref_No_2" name="Transaction_Ref_No_2" scope="default" type="STRING"/>
            <property description="Transaction_Date" expression="$trp:Transaction_Date" name="Transaction_Date" scope="default" type="STRING"/>
        </inSequence>
        <outSequence>
            <throttle id="myThrottle" onAccept="acceptSequence" onReject="rejectSequence">
                <policy>
                    <wsp:Policy wsu:id="WSO2MediatorThrottlingPolicy" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                        <throttle:MediatorThrottleAssertion xmlns:throttle="http://www.wso2.org/products/wso2commons/throttle">
                            <throttle:MaximumConcurrentAccess>0</throttle:MaximumConcurrentAccess>
                            <wsp:Policy>
                                <throttle:ID throttle:type="IP">{{Required_IP}}</throttle:ID>
                                <wsp:Policy>
                                    <throttle:Control>
                                        <wsp:Policy>
                                            <throttle:MaximumCount>10</throttle:MaximumCount>
                                            <throttle:UnitTime>60000</throttle:UnitTime>
                                            <throttle:ProhibitTimePeriod>60000</throttle:ProhibitTimePeriod>
                                        </wsp:Policy>
                                    </throttle:Control>
                                </wsp:Policy>
                            </wsp:Policy>
                        </throttle:MediatorThrottleAssertion>
                    </wsp:Policy>
                </policy>
            </throttle>
            <log/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>
  

Ответ №1:

Посредник дроссельной заслонки работает не так, как ожидалось, не из-за проблемы с посредником дроссельной заслонки, а из-за того, как вы это реализовали.

В последовательности вы определили только журнал и некоторые посредники свойств. При этой реализации вывод не будет вызван. Поскольку вы внедрили посредник дроссельной заслонки в конечном итоге, и поскольку это не выполняется, вы можете вызывать API без ограничения запросов. Вы можете обратиться к некоторой документации, чтобы уточнить, что касается посредничества сообщений EI (например: [1])

Сообщения будут передаваться на выход из последовательности только в следующих двух сценариях.

  • Если вы использовали посредник обратной связи [2]
  • Если вы использовали посредника отправки для вызова серверной части. В этом случае ответ от серверной части отправляется на выход.

Поэтому для решения этой проблемы у вас есть 2 варианта.

  • Добавьте посредника обратной связи в конце посредников свойств в последовательности
  • Измените посредничество следующим образом, чтобы получить посредника дроссельной заслонки в последовательности.

 <?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" context="/my_api" name="MY_API" version="1.0.0" version-type="context">
   <resource methods="POST">
      <inSequence>
         <log level="custom">
            <property expression="json-eval($)" name="Incoming Payload" />
         </log>
         <property description="Client_Name" expression="$trp:Client_Name" name="Client_Name" scope="default" type="STRING" />
         <property description="Client_DOB" expression="$trp:Client_DOB" name="Client_DOB" scope="default" type="STRING" />
         <property description="Client_ID_Type" expression="$trp:Client_ID_Type" name="Client_ID_Type" scope="default" type="STRING" />
         <property description="Client_ID_No" expression="$trp:Client_ID_No" name="Client_ID_No" scope="default" type="STRING" />
         <property description="Client_Gender" expression="$trp:Client_Gender" name="Client_Gender" scope="default" type="STRING" />
         <property description="Client_Nationality" expression="$trp:Client_Nationality" name="Client_Nationality" scope="default" type="STRING" />
         <property description="Source_System" expression="$trp:Source_System" name="Source_System" scope="default" type="STRING" />
         <property description="Transaction_Type" expression="$trp:Transaction_Type" name="Transaction_Type" scope="default" type="STRING" />
         <property description="Transaction_Ref_No" expression="$trp:Transaction_Ref_No" name="Transaction_Ref_No" scope="default" type="STRING" />
         <property description="Transaction_Ref_No_2" expression="$trp:Transaction_Ref_No_2" name="Transaction_Ref_No_2" scope="default" type="STRING" />
         <property description="Transaction_Date" expression="$trp:Transaction_Date" name="Transaction_Date" scope="default" type="STRING" />
         <throttle id="myThrottle" onAccept="acceptSequence" onReject="rejectSequence">
            <policy>
               <wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:id="WSO2MediatorThrottlingPolicy">
                  <throttle:MediatorThrottleAssertion xmlns:throttle="http://www.wso2.org/products/wso2commons/throttle">
                     <throttle:MaximumConcurrentAccess>0</throttle:MaximumConcurrentAccess>
                     <wsp:Policy>
                        <throttle:ID throttle:type="IP">{{Required_IP}}</throttle:ID>
                        <wsp:Policy>
                           <throttle:Control>
                              <wsp:Policy>
                                 <throttle:MaximumCount>10</throttle:MaximumCount>
                                 <throttle:UnitTime>60000</throttle:UnitTime>
                                 <throttle:ProhibitTimePeriod>60000</throttle:ProhibitTimePeriod>
                              </wsp:Policy>
                           </throttle:Control>
                        </wsp:Policy>
                     </wsp:Policy>
                  </throttle:MediatorThrottleAssertion>
               </wsp:Policy>
            </policy>
         </throttle>
      </inSequence>
      <outSequence>
         <log />
         <send />
      </outSequence>
      <faultSequence />
   </resource>
</api>  

[1]-https://docs.wso2.com/display/EI611/WSO2 Enterprise Integrator Best Practices [2]-https://ei.docs.wso2.com/en/7.2.0/micro-integrator/references/mediators/loopback-Mediator/