您的位置:

使用Spring Cloud RabbitMQ 构建微服务架构

在现代的软件开发中,微服务是一种流行的体系结构模式,它可以将大型应用程序拆分成小的单元,这些单元可以独立的部署和扩展。在微服务架构中,每个服务都有自己的数据存储,并通过 REST 或其他协议进行通信,这样可以确保其他服务的故障不会影响整个系统的运作。使用Spring Cloud和RabbitMQ可以轻松构建微服务架构。

一、使用Spring Cloud与RabbitMQ创建基本的消息生产者和消费者

1、创建一个Spring Boot应用程序。在 pom.xml 文件中添加以下依赖:

   
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
   </dependency>
   

2、配置 RabbitMQ 的连接信息:

 
     spring.cloud.stream.rabbit.bindings.output.destination=myQueue
     spring.cloud.stream.rabbit.bindings.output.producer.routing-key-expression=payload
     spring.rabbitmq.host=localhost
     spring.rabbitmq.port=5672
     spring.rabbitmq.username=guest
     spring.rabbitmq.password=guest
  

3、定义一个生产者来发送消息:

 
    @EnableBinding(Source.class)
    public class OrderSender {
        @Autowired
        private MessageChannel output;
        public void send(String message) {
            output.send(MessageBuilder.withPayload(message).build());
        }
    }
  
 

4、定义一个消费者来接收消息:

 
    @EnableBinding(Sink.class)
    public class OrderReceiver {
        @StreamListener(Sink.INPUT)
        public void receive(String message) {
            System.out.println("Received message: " + message);
        }
    }
  

4、测试发送和接收消息:

 
    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        OrderSender sender = context.getBean(OrderSender.class);
        for (int i = 1; i <= 10; i++) {
            sender.send("order-" + i);
            Thread.sleep(1000);
        }
        context.close();
    }
  

在控制台上可以看到消息的发送和接收的日志。

二、使用Spring Cloud Config 为RabbitMQ添加外部配置信息

在微服务中,通常需要使用配置服务器来集中管理配置信息。通过使用 Spring Cloud Config,可以轻松实现这一目标。

1、创建一个配置中心,用于存储 RabbitMQ 配置信息。在 git 仓库中,创建一个文件 amqp.properties,其中包含 RabbitMQ 连接信息。

 
    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest
  

2、在配置中心的Spring Boot项目中添加以下maven依赖。

 
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-monitor</artifactId>
    </dependency>
  

3、将 RabbitMQ 配置信息添加到 bootstrap.yml 文件中:


    spring:
        cloud:
            config:
                server:
                    git:
                        uri: git@github.com:username/config-repo.git
                        search-paths: amqp
                        username: username
                        password: password
    rabbitmq:
        host: ${spring.rabbitmq.host}
        port: ${spring.rabbitmq.port}
        username: ${spring.rabbitmq.username}
        password: ${spring.rabbitmq.password}

4、在生产者和消费者应用程序中,在 消息通道绑定注解中添加参数来指定RabbitMQ 的交换机和队列的名称:


    @EnableBinding(value = {Source.class})
    public class Sender {
        @Autowired
        private Source source;
    
        public void sendMessage(String message) {
            source.output().send(MessageBuilder.withPayload(message).setHeader(MessageHeaders.CONTENT_TYPE,
                    MimeTypeUtils.APPLICATION_JSON).build());
        }
    }

使用与生产者类似的方式为消费者添加通道绑定注释。

三、使用Spring Cloud Gateway将消息路由到微服务

在微服务架构中,通常需要使用 API 网关来聚合和路由消息。Spring Cloud Gateway是一个轻量级的 API 网关,可以根据路由规则将消息路由到不同的微服务中。

1、创建一个 Spring Boot 应用程序并添加以下 Maven 依赖:


    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

2、创建一个配置文件 application.yml,并添加以下内容:


    spring:
        cloud:
            gateway:
                routes:
                    - id: order-service
                      uri: lb://order-service
                      predicates:
                        - Path=/api/orders/**
                    - id: payment-service
                      uri: lb://payment-service
                      predicates:
                        - Path=/api/payments/**
    server:
        port: 8080

3、使用该路由规则在网关中进行跨微服务消息调用,例如请求 http://localhost:8080/api/orders,该请求将被路由到 order-service 微服务中的 /api/orders URL。

四、使用Spring Cloud Stream实现事件驱动微服务

在微服务架构中,常用的一种模式是使用事件驱动架构来解耦微服务之间的依赖性。Spring Cloud Stream是一个简单的事件驱动框架,它可以轻松整合 RabbitMQ 和 Apache Kafka。

1、创建一个 Spring Boot 应用程序,并添加以下 Maven 依赖:


    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
    </dependency>

2、创建一个简单的事件发布者:


    public interface MessageSource {
        String OUTPUT = "orders-out";
        @Output(OUTPUT)
        MessageChannel messageOutput();
    }

3、创建一个简单的事件消费者:


    public interface MessageSink {
        String INPUT = "orders-in";
        @Input(INPUT)
        SubscribableChannel messageInput();
    } 

4、打开 EventEmitter 的应用程序类并添加以下方法:


    @Autowired
    private MessageSource source;
    public void emitMessage(String message) {
        source.messageOutput().send(MessageBuilder.withPayload(message).build());
    }

5、打开 OrderReceiver 类并将 @EnableBinding 注释移到类上,同时添加 @StreamListener:


    @StreamListener(OrderSink.INPUT)
    public void handle(String message) {
        System.out.println("Received message: " + message);
    }

6、在配置文件 application.yml 中添加以下配置:


    spring.rabbitmq.host: localhost
    spring.rabbitmq.port: 5672
    spring.rabbitmq.username: guest
    spring.rabbitmq.password: guest
    spring.cloud.stream.bindings.orders-out.destination: orders-exchange
    spring.cloud.stream.bindings.orders-in.destination: orders-exchange

7、运行 EventEmitter 和 OrderReceiver 应用程序。通过添加事件来测试应用程序。

结论

使用 Spring Cloud RabbitMQ,可以轻松构建消息驱动的微服务架构。Spring Cloud Config 可以使用外部配置管理 RabbitMQ 的连接信息,使用 Spring Cloud Gateway 路由消息,使用 Spring Cloud Stream 实现分布式事件处理来解除微服务之间的依赖关系。