我们有大约 50 个使用 Spring Boot 开发的微服务。我们使用 Spring Cloud 向 Eureka 注册服务,并使用 Feign 从消费者那里调用服务。合同非常标准,消费者使用带有@FeignClient("<foo>")
注释的接口来定位在foo
Eureka 中注册的服务。在运行一个或多个服务实例的情况下,目标服务上的注册、查找和调用都按预期工作。
我们有一个新要求,即同一个服务foo
可能运行多个实例,每个实例都有特定的原型或名称。例如,一些实例foo
预计将处理 3rd 方集成同步工作负载,而一些实例foo
预计将处理内部消息(异步工作负载)。我们已经定义了一个stereotype
在服务中调用的配置属性,该属性将在引导程序中定义(通过 Spring Cloud 配置的一部分完成)来告诉服务实例处理sync
或async
工作负载。配置如下所示:
service.stereotype: sync # or async
另外,我们在注册服务的时候也将这个属性eureka.instance.metadatamap
作为属性添加到了Eureka的map中。我可以看到 Eureka 现在在注册时会显示此服务值。stereotype
foo
foo
到目前为止,一切都很好。现在的问题:
或假装中是否有配置(或注释)机制DiscoveryClient
来查找foo
但使用stereotype
作为限定符。换句话说,当我的消费者应用程序查找 Eureka 时,它能否以某种方式告诉 Eureka 只给出例如stereotype
is的实例async
?如果这是可能的,那么我的消费者组件可以确保异步工作负载只发送到foo
处理异步工作负载的实例。
到目前为止,在我的研究中,我还没有发现任何东西。我编写了一个示例(可能会被DiscoveryClient
覆盖),它将使用此处GET /eureka/v2/apps/appID
概述的 Eureka REST 接口,然后通过查找返回的每个实例的元数据映射来找到目标端点。但这听起来像是蛮力。理想情况下,我希望使用现有机制之一(如果可用)来执行此操作,以便我可以继续使用 Feign 的负载平衡和重试功能,而不是重新发明轮子。