Spring Cloud Bus与Spring Cloud Stream的关系示例

2023-04-15 12:52:35 浏览数 (1)

准备工作

首先,我们需要创建一个 Spring Boot 应用程序,并添加以下依赖:

代码语言:javascript复制
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

这些依赖将启用 Spring Cloud Bus 和 Spring Cloud Stream,并将其配置为使用 RabbitMQ 作为消息代理。

创建事件

接下来,我们需要创建一个事件类,以便在不同的服务之间传递事件信息。在本例中,我们将创建一个 GreetingEvent 类,用于表示向其他服务发送问候语的事件:

代码语言:javascript复制
public class GreetingEvent {
    private String message;

    public GreetingEvent() {}

    public GreetingEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

发布事件

现在,我们将创建一个服务,用于发布 GreetingEvent 事件。我们将使用 Spring Cloud Stream 来实现消息传递,使用 Spring Cloud Bus 来实现事件通知。在本例中,我们将创建一个名为 greeting-service 的服务,用于向其他服务发布 GreetingEvent 事件:

代码语言:javascript复制
@SpringBootApplication
@EnableBinding(Source.class)
public class GreetingServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GreetingServiceApplication.class, args);
    }

    @Bean
    @InboundChannelAdapter(channel = Source.OUTPUT, poller = @Poller(fixedDelay = "5000"))
    public MessageSource<GreetingEvent> greetingEventSource() {
        return () -> new GenericMessage<>(new GreetingEvent("Hello from Greeting Service"));
    }

    @RestController
    public class GreetingController {

        @Autowired
        private MessageChannel output;

        @GetMapping("/greeting")
        public void sendGreeting() {
            GreetingEvent event = new GreetingEvent("Hello from Greeting Service");
            output.send(MessageBuilder.withPayload(event).build());
        }
    }
}

这段代码中,我们使用了 @EnableBinding(Source.class) 注解来启用 Spring Cloud Stream,并创建了一个 MessageSource bean,用于向输出通道发送 GreetingEvent 事件。

此外,我们还创建了一个 GreetingController 类,用于处理 HTTP GET 请求,并使用 MessageChannel 将 GreetingEvent 事件发送到输出通道。

订阅事件

现在,我们将创建另一个服务,用于订阅 GreetingEvent 事件。我们将使用 Spring Cloud Stream 来实现消息传递,使用 Spring Cloud Bus 来实现事件订阅。在本例中,我们将创建一个名为 greeting-client 的服务,用于接收来自 greeting-service 的 GreetingEvent 事件:

代码语言:javascript复制
@SpringBootApplication
@EnableBinding(Sink.class)
public class GreetingClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(GreetingClientApplication.class, args);
    }

    @StreamListener(Sink.INPUT)
    public void receiveGreeting(GreetingEvent event) {
          System.out.println("Received greeting: "   event.getMessage());
    }
}

这段代码中,我们使用了 @EnableBinding(Sink.class) 注解来启用 Spring Cloud Stream,并创建了一个 @StreamListener 注解的方法,用于接收从输入通道发送的 GreetingEvent 事件。

运行应用程序

现在,我们已经准备好运行我们的应用程序了。首先,我们需要启动 RabbitMQ 作为消息代理。然后,我们可以启动 greeting-service 和 greeting-client 应用程序。

当我们访问 greeting-service 的 /greeting 路径时,将向输出通道发送一个 GreetingEvent 事件。由于 greeting-client 订阅了输入通道,它将接收到这个事件,并输出消息。

0 人点赞