java微服务中消息队列处理中间件基础语法学习,零基础学习
在 Java 微服务中,消息队列处理中间件可以帮助实现服务之间的异步通信、解耦和负载均衡。常用的 Java 消息队列工具包括 RabbitMQ、Apache Kafka 和 ActiveMQ。下面我将详细介绍这些消息队列工具在 Java 中的基础语法和使用方法。
1. RabbitMQ
RabbitMQ 是一个广泛使用的开源消息代理软件,支持多种协议(AMQP、MQTT、STOMP 等)。我们可以使用 Spring AMQP 来简化 RabbitMQ 的集成。
1.1 安装 RabbitMQ
-
在 Ubuntu 上安装 RabbitMQ
bash
sudo apt-get update
sudo apt-get install rabbitmq-server
- 启动 RabbitMQ 服务
bash
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
- 启用管理插件
bash
sudo rabbitmq-plugins enable rabbitmq_management
-
访问管理界面:打开浏览器,访问
http://<your_server_ip>:15672
,默认用户名和密码为guest
。
1.2 基本概念
- Exchange: 消息的路由中心。
- Queue: 存储消息的地方。
- Binding: 将 Exchange 和 Queue 关联起来。
- Routing Key: 路由键,用于匹配 Binding。
- Producer: 发送消息的应用程序。
- Consumer: 接收消息的应用程序。
1.3 示例代码
1.3.1 创建 Spring Boot 项目
使用 Spring Initializr 创建一个新的 Spring Boot 项目,并添加以下依赖:
- Spring Web
- Spring AMQP
- Lombok (可选)
1.3.2 配置 RabbitMQ
在 application.yml
中配置 RabbitMQ 连接信息:
yaml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
1.3.3 生产者
创建一个生产者类来发送消息:
RabbitMQSender.java
package com.example.demo.rabbitmq;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RabbitMQSender {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(String message) {
amqpTemplate.convertAndSend("my_queue", message);
System.out.println("Sent message = " + message);
}
}
1.3.4 消费者
创建一个消费者类来接收消息:
RabbitMQReceiver.java
package com.example.demo.rabbitmq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class RabbitMQReceiver {
@RabbitListener(queues = "my_queue")
public void receiveMessage(String message) {
log.info("Received message = {}", message);
}
}
1.3.5 控制器
创建一个控制器来触发消息发送:
RabbitMQController.java
package com.example.demo.controller;
import com.example.demo.rabbitmq.RabbitMQSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RabbitMQController {
@Autowired
private RabbitMQSender rabbitMQSender;
@GetMapping("/send-rabbitmq-message")
public String sendMessage(@RequestParam String message) {
rabbitMQSender.send(message);
return "Message sent successfully";
}
}
2. Apache Kafka
Apache Kafka 是一个分布式流处理平台,常用于实时数据管道和流应用程序。我们可以使用 Spring Kafka 来简化 Kafka 的集成。
2.1 安装 Kafka
-
下载并解压 Kafka
bash
wget https://downloads.apache.org/kafka/3.0.0/kafka_2.13-3.0.0.tgz
tar -xzf kafka_2.13-3.0.0.tgz
cd kafka_2.13-3.0.0
- 启动 Zookeeper:
bash
bin/zookeeper-server-start.sh config/zookeeper.properties
- 启动 Kafka 服务器
bash
bin/kafka-server-start.sh config/server.properties
2.2 基本概念
- Broker: Kafka 集群中的节点。
- Topic: 数据分类的主题。
- Partition: Topic 的分区。
- Producer: 发送消息的应用程序。
- Consumer: 接收消息的应用程序。
- Consumer Group: 消费者的组。
2.3 示例代码
2.3.1 创建 Spring Boot 项目
使用 Spring Initializr 创建一个新的 Spring Boot 项目,并添加以下依赖:
- Spring Web
- Spring for Apache Kafka
- Lombok (可选)
2.3.2 配置 Kafka
在 application.yml
中配置 Kafka 连接信息:
yaml
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
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
2.3.3 创建 Topic
在 Kafka 中创建一个主题 test-topic
:
bash
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1
2.3.4 生产者
创建一个生产者类来发送消息:
KafkaProducer.java
package com.example.demo.kafka;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String message) {
kafkaTemplate.send("test-topic", message);
System.out.println("Sent message = " + message);
}
}
2.3.5 消费者
创建一个消费者类来接收消息:
KafkaConsumer.java
package com.example.demo.kafka;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class KafkaConsumer {
@KafkaListener(topics = "test-topic", groupId = "my-group")
public void consume(String message) {
log.info("Consumed message = {}", message);
}
}
2.3.6 控制器
创建一个控制器来触发消息发送:
KafkaController.java
package com.example.demo.controller;
import com.example.demo.kafka.KafkaProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class KafkaController {
@Autowired
private KafkaProducer kafkaProducer;
@GetMapping("/send-kafka-message")
public String sendMessage(@RequestParam String message) {
kafkaProducer.sendMessage(message);
return "Message sent successfully";
}
}
3. ActiveMQ
ActiveMQ 是另一个流行的开源消息代理,支持 JMS 协议。我们可以使用 Spring JMS 来简化 ActiveMQ 的集成。
3.1 安装 ActiveMQ
-
下载并解压 ActiveMQ
bash
wget https://downloads.apache.org/activemq/5.16.5/apache-activemq-5.16.5-bin.tar.gz
tar -xzf apache-activemq-5.16.5-bin.tar.gz
cd apache-activemq-5.16.5
- 启动 ActiveMQ 服务:
bin/activemq start
-
访问管理界面:
打开浏览器,访问
http://<your_server_ip>:8161/admin
,默认用户名和密码为admin
和admin
。
3.2 基本概念
- Broker: 消息代理。
- Queue: 存储消息的地方。
- Topic: 订阅模式的消息通道。
- Producer: 发送消息的应用程序。
- Consumer: 接收消息的应用程序。
3.3 示例代码
3.3.1 创建 Spring Boot 项目
使用 Spring Initializr 创建一个新的 Spring Boot 项目,并添加以下依赖:
- Spring Web
- Spring for Apache ActiveMQ
- Lombok (可选)
3.3.2 配置 ActiveMQ
在 application.yml
中配置 ActiveMQ 连接信息:
yaml
spring:
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin
3.3.3 生产者
创建一个生产者类来发送消息:
ActiveMQProducer.java
package com.example.demo.activemq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
@Service
public class ActiveMQProducer {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(String message) {
jmsTemplate.convertAndSend("my_queue", message);
System.out.println("Sent message = " + message);
}
}
3.3.4 消费者
创建一个消费者类来接收消息:
ActiveMQConsumer.java
package com.example.demo.activemq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class ActiveMQConsumer {
@JmsListener(destination = "my_queue")
public void receiveMessage(String message) {
log.info("Received message = {}", message);
}
}
3.3.5 控制器
创建一个控制器来触发消息发送:
ActiveMQController.java
package com.example.demo.controller;
import com.example.demo.activemq.ActiveMQProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ActiveMQController {
@Autowired
private ActiveMQProducer activeMQProducer;
@GetMapping("/send-activemq-message")
public String sendMessage(@RequestParam String message) {
activeMQProducer.sendMessage(message);
return "Message sent successfully";
}
}
4.RabbitMQ、Apache Kafka 和 ActiveMQ 在微服务架构中作为消息队列处理工具的优缺点对比。
1. RabbitMQ
优点
- 成熟稳定: 已经存在很长时间,社区支持强大。
- 丰富的协议支持: 支持多种协议(AMQP、MQTT、STOMP 等),灵活性高。
- 可靠的消息传递: 提供持久化和确认机制,确保消息不丢失。
- 易于管理: 提供强大的管理界面和监控工具。
- 广泛使用: 社区活跃,文档丰富。
缺点
- 性能限制: 相比 Kafka,在大规模数据处理方面可能稍逊一筹。
- 复杂性: 配置和管理相对复杂,尤其是在高级场景下。
- 许可证: 使用 Erlang VM,可能会增加一些学习成本。
2. Apache Kafka
优点
- 高性能: 设计用于高吞吐量和低延迟,适合大规模数据处理。
- 可扩展性强: 容易水平扩展,支持多副本和分区。
- 持久化能力强: 默认情况下所有消息都会被持久化到磁盘。
- 容错性好: 内置了复制机制,确保数据安全。
- 流处理能力: 内置流处理功能,支持实时数据处理。
缺点
- 配置复杂: 初次配置和调优较为复杂。
- 资源消耗大: 需要较多的内存和磁盘空间。
- 依赖 Zookeeper: 需要额外部署和维护 Zookeeper。
- 学习曲线陡峭: 对于新手来说,理解其内部工作原理需要一定时间。
3. ActiveMQ
优点
- 成熟的 JMS 实现: 符合 JMS 规范,适用于 Java 应用程序。
- 支持多种传输协议: 支持 TCP、UDP、HTTP 等多种传输协议。
- 广泛的集成: 与 Spring 等框架无缝集成。
- 易于配置: 相对简单,适合中小型项目。
- 灵活的消息模式: 支持点对点(Queue)和发布/订阅(Topic)两种模式。
缺点
- 性能较低: 相比 RabbitMQ 和 Kafka,在高吞吐量场景下性能较差。
- 缺乏现代特性: 不如 Kafka 新颖,缺少一些现代流处理特性。
- 社区活跃度下降: 相比其他两个工具,社区活跃度有所下降。
- 复杂性: 在大型系统中配置和管理相对复杂。
总结
特征 | RabbitMQ | Apache Kafka | ActiveMQ |
---|---|---|---|
成熟稳定性 | 高 | 高 | 高 |
协议支持 | 多种协议 (AMQP, MQTT, STOMP) | 主要支持 Kafka 协议 | 多种协议 (TCP, UDP, HTTP) |
可靠性 | 强 | 极强 | 强 |
易于管理 | 是,提供强大的管理界面 | 较复杂,需要配置 Zookeeper | 是,易于配置 |
性能 | 中等 | 高 | 中等 |
扩展性 | 中等 | 非常好,支持水平扩展 | 中等 |
持久化 | 强 | 极强 | 强 |
容错性 | 强 | 极强 | 强 |
流处理能力 | 基本支持 | 内置流处理功能 | 基本支持 |
学习曲线 | 中等 | 陡峭 | 中等 |
资源消耗 | 中等 | 高 | 中等 |
选择哪种消息队列工具取决于你的具体需求,例如性能要求、可靠性需求、现有技术栈以及团队的技术背景。
以上内容涵盖了如何在 Java 微服务中使用 RabbitMQ、Apache Kafka 和 ActiveMQ 进行消息队列处理。每个部分都包含了安装步骤、基本概念和示例代码。你可以根据实际需求选择合适的工具,并进一步扩展和完善这些示例。
原文地址:https://blog.csdn.net/xiaozukun/article/details/145251814
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!