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 组件。在上例中,调用解析为 Camel URI,该 URI 由动态 toD 端点调用,如下所示:

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.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

 

在使用客户端查找时设置 Client Keystore 数据。

clientKeyFile

 

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

clientKeyPassphrase

 

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

dnsDomain

 

设置用于 dns 查询的 DNS 域。

lookup

环境

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

  • 环境 主机上运行的使用环境变量。
  • DNS TOKEN-将 DNS 域名使用 DNS 域名。
  • 客户端 主机上运行的 Java 客户端使用 Java 客户端调用 Kubernetes 主机 API,并查询哪些服务器正在主动托管服务。

masterUrl

 

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

namespace

 

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

oauthToken

 

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

password

 

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

trustCerts

false

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

username

 

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.