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. 消息顺序性
4. 消息积压
总结
配置管理和消息队列是微服务架构的重要组成部分。配置中心实现配置的集中管理和动态刷新,消息队列实现系统间的解耦和异步通信。在实际应用中,需要根据业务场景选择合适的方案。