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