【问题标题】:Simple domain class-based Spring Kafka integration简单的基于域类的 Spring Kafka 集成
【发布时间】:2019-06-07 10:24:50
【问题描述】:

我正在 Spring Boot 框架中构建一组微服务,每个微服务都与 Kafka 集成以进行消息传递。似乎有 3 个独立但相关的 Spring 库提供 Kafka 集成:

我的目标是抽象出底层消息传递系统的细节,并为我的微服务提供一个简单的消息传递服务层来发送和接收消息。我希望此服务层与我的域类 (POJO) 一起使用,而不是让微服务与构建 Message 实例有关。例如:

public interface MyMessagingService {

    void send(MyPojo obj);

    MyPojo receive();
}

其次,我想添加 Avro 支持,但首先我将让它与 JSON 一起使用。

切入正题,似乎有多种方法可以实现这一点,这非常令人困惑,尤其是在各种可用的 Spring 库的情况下。我可以为我的微服务提供这样一个共享消息传递层的最直接的方法是什么,它们只需要关注域类?

我遇到了来自 Spring Integration 的 @MessagingGateway,它看起来很有希望,但这似乎与发送和回复语义相关,而且我的服务不会期待来自 Kafka 的回复消息。

我看过的例子,下面有一些链接,似乎仍然必须自己构造 Message 实例。有没有更简单的方法?

【问题讨论】:

  • 三个库的一点上下文:Spring Kafka是Spring对Kafka的基本支持; Spring Integration Kafka 建立在此之上,因此您可以将它与 Spring Integration 一起使用; Spring Cloud Stream 使用 Spring Integration。

标签: spring apache-kafka spring-integration messaging spring-cloud-stream


【解决方案1】:

如果你的".. 目标是抽象出底层消息系统的细节,并为我的微服务提供一个简单的消息服务层来发送和接收消息",那么为什么不直接使用 spring -云流?

代码开发人员甚至不必知道他/她编写的代码将成为某个消息系统的一部分。例如,

@SpringBootApplication
public class SampleStreamApplication  {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleStreamApplication.class);
    }

    @Bean
    public Function<String, String> uppercase() {
        return value -> value.toUpperCase();
    }
}

以上是一个完整且功能齐全的Spring Cloud Stream应用程序(在Kafka binder的上下文中)将从“输入”主题接收并将通过uppercase(..)函数传递的值发送到“输出”主题。

是的,对于 JSON、Avro 等,类型转换都是透明的。

显然有一些细节,但当您有更具体的问题时,我们当然可以讨论它们。现在我建议先通过一些reference documentation。

【讨论】:

  • 这是一个功能齐全的 Spring Cloud Stream 应用程序如何?没有为生产者或消费者主题定义绑定,也无法通过方法参数处理传入消息?编辑:我看到了这个spring.io/blog/2019/01/09/…。有趣!
  • Spring Cloud Stream 绝对是解决方案,着眼于您的需求。您还可以使用 Message Converters 添加 Avro 支持
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 2023-03-31
  • 2019-07-06
  • 2018-03-07
  • 2018-05-22
  • 1970-01-01
  • 2011-03-08
  • 2015-09-21
相关资源
最近更新 更多