Как настроить управление API с несколькими бэкэндами? - PullRequest
0 голосов
/ 05 июня 2019

Я размещаю службу для клиентов, в которой одно и то же приложение развернуто для каждого клиента в Azure.

По сути, это для каждого клиента:

Application Gateway ->
App Service Environment ->
API Management ->
VM with Application back end ->
Remote Azure SQl Data

Первые 3 слоя значительно увеличивают затраты.

Возможно ли настроить его так?

Application Gateway ->
App Service Environment ->
API Management ->
    - Client 1 
        VM1 with Application back end ->
        Remote Azure SQl Data1
    - Client 2 
        VM2 with Application back end ->
        Remote Azure SQl Data2
    - Client 3 
        VM3 with Application back end ->
        Remote Azure SQl Data3

т.е.. веб-слои направляются к соответствующему внутреннему концу каким-то образом

например. Возможно, каждый клиент получит доступ к веб-слою с другим URL-адресом.

http://client1.rest -application.azure.com

http://client2.rest -application.azure.com

но все они проходят через один и тот же шлюз приложений.

1 Ответ

1 голос
/ 06 июня 2019

Необходимо использовать политику APIM для маршрутизации трафика в другой внутренний пул на основе информации заголовка HTTP.

Вот пример политики, которая маршрутизирует трафик на основе размера тела запроса.

Политика, определенная в этом файле, демонстрирует, как маршрутизировать запросы в зависимости от размера тела сообщения.Заголовок Content-Length содержит размер тела сообщения.256 КБ, ограничение размера сообщения в служебной шине Azure.он проверяет, если сообщение меньше 256000 байт.Если он больше, запрос перенаправляется в другое место.Скопируйте следующий фрагмент во входящий раздел.

<policies>
<inbound>
    <base/>
        <set-variable name="bodySize" value="@(context.Request.Headers["Content-Length"][0])"/>
        <choose>
            <when condition="@(int.Parse(context.Variables.GetValueOrDefault<string>("bodySize"))<256000)">
                <!-- let it pass through by doing nothing -->
            </when>
            <otherwise>
                <rewrite-uri template="{{alternate-path-and-query}}"/>
                <set-backend-service base-url="{{alternate-host}}"/>
            </otherwise>
        </choose>

        <!-- In rare cases where Content-Length header is not present we'll have to read the body to get its length. -->
        <!--
        <choose>
            <when condition="@(context.Request.Body.As<string>(preserveContent: true).Length<256000)">

            </when>
            <otherwise>
                <rewrite-uri template=""/>
                <set-backend-service base-url=""/>
            </otherwise>
        </choose>
        -->
</inbound>
<backend>
    <base/>
</backend>
<outbound>
    <base/>
</outbound>
<on-error>
    <base/>
</on-error>

...