我在微服务方面没有太多经验,不太了解在以下情况下如何进行。
有两个 Web 服务,生产者和消费者。它们通过 Apache Kafka 进行通信,生产者本身定期发送带有随机 id 和分数的消息,消费者计算并保存 Map 中每个 id 的平均分值。
所以,我需要实现 REST API 端点,当它提供一个 id 时,它会返回它的平均分数。实际上,我在消费者控制器中创建了一个常规方法,它在获取请求时执行此操作。我与邮递员核实过,它确实有效。
但是,当提出许多消费者实例时该怎么办,而不仅仅是一个,因为客户端不知道将请求发送到哪个端口?毕竟,每个实例都是在操作系统选择的端口(server.port=0)上启动的。在这种情况下,为了让一切正常工作,你需要添加一些额外的服务,或者你可以这样做没有他们以某种方式不同?
以防万一,如有必要,我会发布 application.properties 文件以获得答案:
Продюсер:
spring.cloud.stream.bindings.output.destination=customers
spring.cloud.stream.bindings.output.producer.partitionKeyExpression=payload.id
spring.cloud.stream.bindings.output.producer.partitionCount=10
Консьюмер:
spring.cloud.stream.bindings.input.destination=customers
spring.cloud.stream.bindings.input.group=customer_group
spring.cloud.stream.instanceCount=10
server.port=0
在您当前的服务配置中,您只需要使用 API 网关(反向代理)并通过它传递客户端请求。在此配置中,客户端将不再知道任何端口,它只会向 http://web-api/resource 地址发送请求,网关会将其重定向到微服务(消费者)的某个实例。API 网关以开源项目的形式出现,需要部署在您自己的硬件上,以及按消费付费的云服务(通常非常便宜)。
当然,在这样的方案中,您会面临将您的消费者在线实例列表的更改交付给API网关的问题,但也有一些现成的解决方案可以解决这个问题(取决于网关/ 代理人)。