Spring全家桶笔记十一:配置管理与消息队列

Spring全家桶笔记十一:配置管理与消息队列

配置管理

Spring Cloud Config

服务端配置

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/your-repo/config-repo
username: your-username
default-label: master
search-paths: '{application}'
1
2
3
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {}

客户端配置

1
2
3
4
5
6
7
spring:
cloud:
config:
uri: http://localhost:8888
profile: dev
label: master
name: application

动态刷新

1
2
3
4
5
6
7
@RefreshScope
@RestController
public class TestController {

@Value("${custom.property}")
private String property;
}

触发刷新:POST /actuator/refresh

Nacos配置中心

基本使用

1
2
3
4
5
6
7
8
9
10
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev
group: DEFAULT_GROUP

配置优先级

  • 动态配置 > 本地配置
  • 规则:服务名+环境 > 服务名 > 默认

共享配置

1
2
3
4
5
6
7
8
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true

消息队列概述

为什么要用消息队列

  • 解耦:生产者和消费者解耦
  • 异步:提高系统响应速度
  • 削峰:应对高并发流量
  • 日志处理:日志收集与分析

常见消息队列

  • ActiveMQ:老牌 MQ,功能全面
  • RabbitMQ:功能强大,生态丰富
  • Kafka:高性能,日志系统常用
  • RocketMQ:阿里巴巴开源,Java 友好

RabbitMQ

核心概念

  • Producer:生产者
  • Consumer:消费者
  • Exchange:交换机
  • Queue:队列
  • Binding:绑定

Exchange 类型

类型 说明
Direct 完全匹配
Fanout 广播
Topic 模式匹配
Headers 属性匹配

Spring AMQP 集成

1
2
3
4
5
6
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest

生产者

1
2
3
4
5
6
7
8
9
10
@Component
public class MessageProducer {

@Autowired
private RabbitTemplate rabbitTemplate;

public void send(String message) {
rabbitTemplate.convertAndSend("exchange", "routing.key", message);
}
}

消费者

1
2
3
4
5
6
7
8
@Component
public class MessageConsumer {

@RabbitListener(queues = "queue.name")
public void handleMessage(String message) {
System.out.println("Received: " + message);
}
}

消息确认

1
2
3
4
5
6
7
8
9
@RabbitListener(queues = "queue.name")
public void handleMessage(String message, Message message2, Channel channel) {
try {
// 处理消息
channel.basicAck(message2.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicNack(message2.getMessageProperties().getDeliveryTag(), false, true);
}
}

Kafka

核心概念

  • Topic:消息主题
  • Partition:分区
  • Replication:副本
  • Consumer Group:消费者组
  • Offset:偏移量

Spring Kafka 集成

1
2
3
4
5
6
7
8
9
10
spring:
kafka:
bootstrap-servers: localhost:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: my-group
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

生产者

1
2
3
4
5
6
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;

public void send(String topic, String message) {
kafkaTemplate.send(topic, message);
}

消费者

1
2
3
4
@KafkaListener(topics = "my-topic", groupId = "my-group")
public void listen(ConsumerRecord<String, String> record) {
System.out.println("Received: " + record.value());
}

消息顺序性

  • 单分区保证顺序
  • 同一 key 的消息发送到同一分区

消息队列最佳实践

1. 消息可靠性

  • 消息持久化
  • 消费者确认机制
  • 死信队列处理

2. 消息幂等性

  • 唯一标识 + 去重表
  • 乐观锁/版本号

3. 消息顺序性

  • 同一分区
  • 消息分区key

4. 消息积压

  • 消费者扩容
  • 临时队列消费

总结

配置管理和消息队列是微服务架构的重要组成部分。配置中心实现配置的集中管理和动态刷新,消息队列实现系统间的解耦和异步通信。在实际应用中,需要根据业务场景选择合适的方案。