Camel REST - Маршрутизация на основе пути - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно разработать REST-маршрут Camel с маршрутизацией на основе пути.Сценарий таков: у нас есть деловой партнер, который предоставил веб-сервис REST для отображения документов.Веб-служба REST развернута на 3 разных серверах, в зависимости от географического положения.Таким образом, у нас в основном есть 3 сервера, подобные этим:

http://north.acme.com/flowdocv2/rest/repository/attachment/{id}/findById
http://center.acme.com/flowdocv2/rest/repository/attachment/{id}/findById
http://south.acme.com/flowdocv2/rest/repository/attachment/{id}/findById

Моя цель - разработать одиночный верблюжий маршрут для сопоставления этих серверов, принимая имя сервера в пути.Примерно так:

http://my.camel.com/center/repository/attachment/{id}/findById
http://my.camel.com/north/repository/attachment/{id}/findById
http://my.camel.com/south/repository/attachment/{id}/findById

Мой (упрощенный и не работающий) blueprint.xml:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
    xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0    
    https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd  
    http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

<cm:property-placeholder persistent-id="my.config.file"/>

<reference id="sharedNettyHttpServer" interface="org.apache.camel.component.netty4.http.NettySharedHttpServer"/>

<camelContext id="my_context" xmlns="http://camel.apache.org/schema/blueprint">
    <restConfiguration component="netty4-http">
        <endpointProperty key="nettySharedHttpServer" value="#sharedNettyHttpServer"/>
    </restConfiguration>
    <rest path="/center/repository">
        <get uri="/attachment/{attachmentId}/findById">
            <route streamCache="true" trace="true">
                <to uri="http://center.acme.com/flowdocv2/rest?bridgeEndpoint=true"/>
            </route>
        </get>            
    </rest>
    <rest path="/north/repository">
        <get uri="/attachment/{attachmentId}/findById">
            <route streamCache="true" trace="true">
                <to uri="http://north.acme.com/flowdocv2/rest?bridgeEndpoint=true"/>
            </route>
        </get>            
    </rest>
</camelContext>
</blueprint>

Проблема в том, что я не знаю, как удалить / центр, / северили / на юг от пути, поэтому заголовок перенаправляется службе назначения, которая не знает, как с этим справиться.Вызов:

http://my.camel.com/center/repository/attachment/{id}/findById

приводит к тому, что следующий URL-адрес вызывается на конечном сервере:

http://center.acme.com/flowdocv2/rest/center/repository/attachment/{id}/findById

Как избавиться от center ?Я не хочу развертывать 3 верблюжьих маршрута на разных портах.

Спасибо

1 Ответ

0 голосов
/ 16 декабря 2018

Я думаю на самом деле это немного проще.Пока вы не зависаете на netty и используете Camel 2.11+, вы можете использовать camel-urlrewrite

По сути, вы определяете одно правило перезаписи в конфигурации и добавляете его в свойКомплект маршрутов.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
    "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
    <urlrewrite>
        <rule>
            <name>Generic Proxy</name>
            <note>
                This rule completely rewrites the url to call.
                Basically, in Camel's "to", you could write whatever you want
            </note>
            <from>^/(.*?)/(.*)</from>
            <to>http://$1.acme.com/flowdocv2/rest/$2</to>
        </rule>
    </urlrewrite>

Теперь вы можете использовать довольно простой маршрут:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0" xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0    
    https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd  
    http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <bean id="myRewrite" class="org.apache.camel.component.urlrewrite.HttpUrlRewrite">
        <property name="configFile" value="class/path/to/proxyrewrite.xml" />
    </bean>

    <camelContext id="my_context" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="proxyRoute">
            <from uri="jetty:http://localhost:9090/proxy" />
            <to uri="jetty:http://somewhere/myapp2?bridgeEndpoint=true&amp;throwExceptionOnFailure=false&amp;urlRewrite=#myRewrite" />
        </route>
    </camelContext>
</blueprint>

Однако netty не поддерживается, поэтому я выбрал следующую лучшую вещь.

Когда вы вызываете http://localhost:9090/proxy/north/foo, переписывание фактически изменит URL для вызова на http://north.acme.com/flowdoc2/rest/foo.

Есть несколько предостережений с этим.Во-первых, вы должны использовать один из поддерживаемых компонентов для UrlRewrite.Во-вторых, кажется, что вы должны иметь файл конфигурации перезаписи в вас classpath - так что нет маршрута только для чертежей.Третье: я не проверял это, но я думаю, вы понимаете суть.Я делаю этот ответ вики-сообщества, чтобы другие, более способные, чем я, могли расширить этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...