根据 consul (camel.apache.org/consul-component.html)的camel文档,支持的HTTP API是kv,event和agent。有kv(键/值存储)的例子,它们工作正常,但代理API没有这样的例子。我通过了Consul的文档[www.consul.io/docs/agent/http/agent.html]以及相应的java客户端[github.com/OrbitzWorldwide/consul-client],并试图弄清楚如何领事:代理组件应该工作,但我发现没有什么简单。
main.getCamelTemplate().sendBodyAndHeader(
"consul:agent?url=http://localhost:8500/v1/agent/service/register",
payload,
ConsulConstants.CONSUL_ACTION, ConsulAgentActions.AGENT); //also tried with ConsulAgentActions.SERVICES, but no luck
我还检查了https://github.com/apache/camel/tree/master/components/camel-consul/src/test/java/org/apache/camel/component/consul提到的测试用例但无法找到与代理api相关的任何内容。
所以我的问题是如何使用consul:agent组件。
更新:我尝试了以下代码并能够获得服务。
Object res = main.getCamelTemplate().requestBodyAndHeader("consul:agent", "", ConsulConstants.CONSUL_ACTION, ConsulAgentActions.SERVICES);
似乎consul组件仅适用于HTTP代理API的GET操作。但在这种情况下,如何使用consul组件注册新服务(如/ v1 / agent / service / register:注册新的本地服务)?
答案 0 :(得分:0)
此代码适用于我:
ImmutableService service =
ImmutableService.builder()
.id("service-1")
.service("service")
.addTags("camel", "service-call")
.address("127.0.0.1")
.port(9011)
.build();
ImmutableCatalogRegistration registration =
ImmutableCatalogRegistration.builder()
.datacenter("dc1")
.node("node1")
.address("127.0.0.1")
.service(service)
.build();
ProducerTemplate template = main.getCamelTemplate();
Object res = template.requestBodyAndHeader("consul:catalog", registration, ConsulConstants.CONSUL_ACTION, ConsulCatalogActions.REGISTER);
但它看起来有点不合适(如解决方法),我认为还有其他解决方案。
答案 1 :(得分:0)
可以使用
.to("consul:agent?action=SERVICES")
以 Map<String, Service>
的形式检索已注册的服务,并将服务 ID 作为映射键。
和
.to("consul:catalog?action=REGISTER")
写注册,期望一个 ImmutableCatalogRegistration
作为正文
请注意,您可以使用 CamelServiceRegistrationRoutePolicy
将 Camel 路由注册为服务 automatically。