在现代的软件开发中,微服务是一种流行的体系结构模式,它可以将大型应用程序拆分成小的单元,这些单元可以独立的部署和扩展。在微服务架构中,每个服务都有自己的数据存储,并通过 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 实现分布式事件处理来解除微服务之间的依赖关系。