当前位置: 首页 > 知识库问答 >
问题:

基于CamelRest路径的路由

龚俊捷
2023-03-14
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>

问题是,我不知道如何从路径中移除/center、/north或/south,因此头部被传递给目标服务,而目标服务不知道如何处理它。调用:

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

共有1个答案

宫修贤
2023-03-14

我觉得其实容易一点。只要您不坚持netty,并且使用的是Camel2.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>
 类似资料:
  • 基于路径的授权 Apache和svnserve都可以给用户赋予(或拒绝)访问许可,通常是对整个版本库:一个用户可以读版本库(或不),而且他可以写版本库(或不)。如果可能,也可以定义细粒度的访问规则。一组用户可以有版本库的一个目录的读写权限,但是没有其它的;另一个目录可以是只对一少部分用户可读。 两种服务器都使用同样的文件格式描述路径为基础的规则,如果是Apache,需要加载mod_authz_sv

  • 参见文档“10. Web”部分

  • 问题内容: 我有一个column ,一列和作为实例化路径的一列。 看起来像 我需要根据此表进行一些查询。 我需要做的查询是 选择所有9个孩子 可以正常工作,直到您将ID替换为1或19,因为开头没有ID 。 将选择数字以1结尾的所有行,因此1、11、21、31、211等 将在第1行或第19行中正常工作 所以测试员; 我能提出最好的建议吗? 选择9,但没有子儿的直接孩子 对于这个测试仪; 会很好的工作

  • 我有一个小难题来解决这个问题。 我有一个用户和一个管理员角色。 用户应该能够列出除管理员以外的所有用户。管理员可以列出所有用户。 我想到的第一个解决方案是检查控制器级别的角色: 但是我更想做的是在路线层面上,保持控制器更干净,但不知何故它确实起作用了。它只列出用户,即使我作为管理员登录。 有什么建议吗?谢谢!

  • 在docker容器中部署应用程序时,我无法使用Spring Boot实现liquibase迁移。我有一个胖罐子,它是在docker图像创建时提取的。 我有一个单独的模块,保存迁移文件。我能装上主机。xml: 然后它继续并加载其余的资源。问题在于然后从加载的资源中提取仍然正常的实际路径: 但是接下来做一些路径操作,结果是: 这反过来又不是有效的类路径: 我需要(类路径)或以能够读取文件。但它总是以上

  • 摘要:ZUUL没有为输入路径选择正确的目标url,因为它没有严格匹配输入路径。 以下是我的zuul路线: 对于输入路径:"/v1/顾客/卡片/产品/",它应该选择-http://localhost:8800/v1/customer/card/product但它选择http://localhost:8400/v1/composite.我的期望是路径模式匹配按照指定的顺序发生,并且更严格,但似乎不是这