8.12. 服务调用


概述

从 Camel 2.18 开始提供。

服务调用 模式允许您在分布式系统中调用远程服务。要调用的服务位于服务 registry 中,如 Kubernetes、Consul、etcd 或 Zookeeper。模式将服务 registry 的配置与调用服务分开。

Maven 用户必须为要使用的服务 registry 添加依赖项。可能性包括:

  • camel-consul
  • camel-etcd
  • camel-kubenetes
  • camel-ribbon

调用服务的语法

要调用服务,请参考服务名称,如下所示:

from("direct:start")
    .serviceCall("foo")
    .to("mock:result");

以下示例显示了调用服务的 XML DSL:

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <serviceCall name="foo"/>
    <to uri="mock:result"/>
  </route>
</camelContext>

在这些示例中,Camel 使用与服务 registry 集成的组件来查找带有名称 foo 的服务。查找返回一组 IP:PORT 对,引用托管远程服务的活跃服务器的列表。然后,Camel 从该列表中随机选择要使用的服务器,并使用所选 IPPORT 号构建 Camel URI。

默认情况下,Camel 使用 HTTP 组件。在上例中,调用解析为由动态 toD 端点调用的 Camel URI,如下所示:

toD("http://IP:PORT")
<toD uri="http:IP:port"/>

您可以使用 URI 参数来调用服务,例如 beer=yes

serviceCall("foo?beer=yes")
<serviceCall name="foo?beer=yes"/>

您还可以提供上下文路径,例如:

serviceCall("foo/beverage?beer=yes")
<serviceCall name="foo/beverage?beer=yes"/>

将服务名称转换为 URI

正如您所见,服务名称解析为 Camel 端点 URI。下面是几个示例。 显示 Camel URI 的解析:

serviceCall("myService") -> http://hostname:port
serviceCall("myService/foo") -> http://hostname:port/foo
serviceCall("http:myService/foo") -> http:hostname:port/foo
<serviceCall name="myService"/> -> http://hostname:port
<serviceCall name="myService/foo"/> -> http://hostname:port/foo
<serviceCall name="http:myService/foo"/> -> http:hostname:port/foo

要完全控制已解析的 URI,请提供指定所需 Camel URI 的额外 URI 参数。在指定的 URI 中,您可以使用服务名称,该服务名称解析为 IP:PORT。下面是一些示例:

serviceCall("myService", "http:myService.host:myService.port/foo") -> http:hostname:port/foo
serviceCall("myService", "netty4:tcp:myService?connectTimeout=1000") -> netty:tcp:hostname:port?connectTimeout=1000
<serviceCall name="myService" uri="http:myService.host:myService.port/foo"/> -> http:hostname:port/foo
<serviceCall name="myService" uri="netty4:tcp:myService?connectTimeout=1000"/> -> netty:tcp:hostname:port?connectTimeout=1000

上面的示例调用名为 myService 的服务。第二个参数控制解析的 URI 的值。请注意,第一个示例使用 serviceName.hostserviceName.port 来指代 IP 或 PORT。如果您只指定了 serviceName,则会解析为 IP:PORT

配置调用该服务的组件

默认情况下,Camel 使用 HTTP 组件调用该服务。您可以使用不同的组件(如 HTTP4 或 Netty4 HTTP)配置不同的组件,如下例所示:

KubernetesConfigurationDefinition config = new KubernetesConfigurationDefinition();
config.setComponent("netty4-http");

// Register the service call configuration:
context.setServiceCallConfiguration(config);

from("direct:start")
    .serviceCall("foo")
    .to("mock:result");

以下是 XML DSL 中的示例:

&lt;camelContext xmlns="http://camel.apache.org/schema/spring">
  &lt;kubernetesConfiguration id="kubernetes" component="netty4-http"/>
  &lt;route>
    &lt;from uri="direct:start"/>
    &lt;serviceCall name="foo"/>
    &lt;to uri="mock:result"/>
  &lt;/route>
&lt;/camelContext>

所有实现共享的选项

以下选项可用于每个实现:

选项

默认值

描述

clientProperty

 

指定特定于您使用的服务调用实现的属性。例如,如果您使用 ribbon 实现,则客户端属性在 com.netflix.client.config.CommonClientConfigKey 中定义。

component

http

设置用于调用远程服务的默认 Camel 组件。您可以使用 netty4-http, jetty, restlet 或一些其他组件来配置组件。如果服务没有使用 HTTP 协议,则必须使用另一个组件,如 mqtt、jms、amqp。如果您在服务调用中指定 URI 参数,则使用此参数中指定的组件,而不是默认。

loadBalancerRef

 

设置使用自定义 org.apache.camel.spi.ServiceCallLoadBalancer 的引用。

serverListStrategyRef

 

设置一个对要使用的自定义 org.apache.camel.spi.ServiceCallServerListStrategy 的引用。

使用 Kubernetes 时的服务调用选项

Kubernetes 实现支持以下选项:

选项

默认值

描述

apiVersion

 

使用客户端查找时的 Kubernetes API 版本。

caCertData

 

在使用客户端查找时设置证书颁发机构数据。

caCertFile

 

设置在使用客户端查找时从文件中加载的证书颁发机构数据。

clientCertData

 

在使用客户端查找时设置客户端证书数据。

clientCertFile

 

设置在使用客户端查找时从文件中加载的客户端证书数据。

clientKeyAlgo

 

在使用客户端查找时,设置客户端密钥存储算法,如 RSA。

clientKeyData

 

在使用客户端查找时设置客户端密钥存储数据。

clientKeyFile

 

设置在使用客户端查找时从文件中加载的客户端密钥存储数据。

clientKeyPassphrase

 

在使用客户端查找时设置客户端密钥存储密码短语。

dnsDomain

 

设置用于 dns 查找的 DNS 域。

lookup

环境

用于查找服务的策略选择。lookup 策略包括:

  • 环境 wagon-wagon 使用环境变量。
  • DNS wagon-wagon 使用 DNS 域名。
  • 客户端 wagon-wagon 使用 Java 客户端调用 Kubernetes 主 API,并查询哪些服务器正在主动托管该服务。

masterUrl

 

使用客户端查找时的 Kubernetes 主机的 URL。

namespace

 

要使用的 Kubernetes 命名空间。默认情况下,命名空间的名称从环境变量 KUBERNETES_MASTER 获取。

oauthToken

 

在使用客户端查找时,设置用于身份验证的 OAUTH 令牌(而不是用户名/密码)。

password

 

设置在使用客户端查找时用于身份验证的密码。

trustCerts

false

设置在使用客户端查找时是否打开信任证书检查。

username

 

设置在使用客户端查找时用于身份验证的用户名。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.