最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及Springboot整合过程踩到的一些坑。
1.准备工作
在搭建之前,我们需要做一些准备工作,这里我们需要使用 docker搭建服务,所以需要提前安装docker。此外,由于 rocketmq 需要部署 broker 与 nameserver ,考虑到分开部署比较麻烦,这里将会使用 docker-compose。
docker教程:https://www.runoob.com/docker/docker-tutorial.html
2.部署过程
首先我们需要 rocketmq docker 镜像,这里我们直接采用foxiswho
提供的docker-rocketmq镜像,git地址:https://github.com/foxiswho/docker-rocketmq
git clone https://github.com/foxiswho/docker-rocketmq.git
cd docker-rocketmq
cd rmq
chmod +x start.sh
./start.sh
启动之后的文件目录
访问浏览器
localhost:8180
注意 如果你的微服务或者项目在开发的时候没有放入docker中或者与rocketmq容器不能直接用IP访问, 那么请把broker.conf中的 #brokerIP1=192.168.0.253 前面#号去掉,并且把后面的IP地址改成你的rocketmq容器宿主机IP地址, 否则报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to ip:10911 failed 配置文件 在 rmq/rmq/brokerconf 目录下
控制台启动成功
3.Springboot+Rocketmq整合
消息消费者
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bloom</groupId>
<artifactId>rocketmq-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rocketmq-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- rocketMQ -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
server:
port: 8096
spring:
application:
name: rocketmq-consumer
rocketmq:
name-server: 127.0.0.1:9876 # rocketMQ的名称服务器,格式为:' host:port;host:port '。
# 生产端配置
producer:
group: ${spring.application.name} # 生产着组名
#access-key: access-key # rocketMQ服务端配置acl授权信息,没有则不需要
#secret-key: secret-key # rocketMQ服务端配置acl授权信息,没有则不需要
# 消费端配置
# consumer:
# access-key: access-key #如果开启了acl,一定要配置。否则集群模式下会正常,广播模式消费端会失效!
# secret-key: secret-key #如果开启了acl,一定要配置。否则集群模式下会正常,广播模式消费端会失效!
@Slf4j
@Component
@RocketMQMessageListener(topic = "simple", //主题
consumerGroup = "simple-consumer-group"//消费组
)
public class SimpleConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("消费者======" + s);
}
}
消息生产者
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bloom</groupId>
<artifactId>producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>producer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- rocketMQ -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
server:
port: 8093
spring:
application:
name: rocketmq-producer
rocketmq:
name-server: 127.0.0.1:9876 # rocketMQ的名称服务器,格式为:' host:port;host:port '。
# 生产端配置
producer:
group: ${spring.application.name} # 生产着组名
#access-key: access-key # rocketMQ服务端配置acl授权信息,没有则不需要
#secret-key: secret-key # rocketMQ服务端配置acl授权信息,没有则不需要
# 消费端配置
# consumer:
# access-key: access-key #如果开启了acl,一定要配置。否则集群模式下会正常,广播模式消费端会失效!
# secret-key: secret-key #如果开启了acl,一定要配置。否则集群模式下会正常,广播模式消费端会失效!
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
class ProducerApplicationTests {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Test
public void sendMessage() {
String key = "simple";
for (int i = 0; i < 1; i++) {
String message = "发送同步消息1,msg=" + i;
/*
第一个参数,主题名:标签 topicName:tags
第二个参数:发送对象
*/
SendResult sendResult = this.rocketMQTemplate.syncSend(key, message,100000);
log.info("MQ发送同步消息成功,key={} msg={},sendResult={}", key, message, sendResult);
}
}
}
执行结果
demo源代码
4.Rocketmq控制台