357.8. HTTP/2 示例

在本例中,我们将 camel-undertow 组件配置为支持 HTTP/2 协议,并在 http://localhost:7766/foo/bar 中公开 HTTP 服务。

这个示例的目录结构如下:

├── pom.xml 1
├── README.md
└── src
    └── main
        └── resources
            └── META-INF
                └── spring
                    └── camel-context.xml 2

以下文件务必要配置 camel-undertow 组件来支持 HTTP/2 协议:

1
pom.xml:包含以下属性和依赖项:
<properties>
    <camel.version>2.23.1</camel.version>
</properties>

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-core</artifactId>
    <version>${camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring</artifactId>
    <version>${camel.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-undertow</artifactId>
    <version>${camel.version}</version>
    </dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-http-common</artifactId>
    <version>${camel.version}</version>
</dependency>

<plugin>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-maven-plugin</artifactId>
    <version>${camel.version}</version>
    <configuration>
        <fileApplicationContextUri>src/main/resources/META-INF/spring/camel-context.xml</fileApplicationContextUri>
    </configuration>
</plugin>
2
Camel-context.xml:配置 camel-undertow 组件,如下所示:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
    <camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/spring">
        <route id="cbr-route" trace="true">
            <from id="_from1" uri="undertow:http://localhost:7766/foo/bar"/>
            <setBody id="_setBody1">
                <constant>Sending Response</constant>
            </setBody>
            <log id="_log5" message="Headers ${in.headers}"/>
            <log id="_log5" message="Done processing ${body}"/>
        </route>
    </camelContext>
    <bean class="org.apache.camel.component.undertow.UndertowComponent" id="undertow">
        <property name="hostOptions" ref="undertowHostOptions"/>
    </bean>
    <bean     class="org.apache.camel.component.undertow.UndertowHostOptions" id="undertowHostOptions">
        <property name="http2Enabled" value="true"/>
    </bean>
</beans>
注意

对于 UndertowHostOptions 类,默认为 falsehttp2Enabled 属性设为 true。然后,这个类被指代在 camel 路由中使用的 UndertowComponent

在本例中,通过使用 pom.xml 文件中的 camel-maven-plugin,我们可以在执行 Maven 命令 mvn camel:run 时在 http://localhost:7766/foo/bar 中公开 HTTP 服务。

我们可以使用 curl 命令测试此示例,如下所示:

$ curl -v --http2 http://localhost:7766/foo/bar
* Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 7766 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 7766 (#0)
> GET /foo/bar HTTP/1.1
> Host: localhost:7766
> User-Agent: curl/7.53.1
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
>
< HTTP/1.1 101 Switching Protocols
< Connection: Upgrade
< Upgrade: h2c
< Date: Sun, 10 Dec 2017 08:43:58 GMT
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< accept: */*
< http2-settings: AAMAAABkAARAAAAAAAIAAAAA
< breadcrumbid: ID-dhcppc1-1512886066149-0-25
< content-length: 16
< user-agent: curl/7.53.1
< date: Sun, 10 Dec 2017 08:43:58 GMT
<
* Connection #0 to host localhost left intact
Sending Response