一、RocketMQ安装
本文将介绍两种RocketMQ的安装,分别是源码安装,和docker安装(推荐使用这种方式,因为简单)
1、源码安装Rocket
源码安装参考官方文档Quick Start - Apache RocketMQ,有一个坑,就是官方设置启动内存为8G,如果内存不够的请按照下面修改
,之后就可以按照官方教程正常运行了。
参考文章:RocketMQ的broker启动失败解决 - 走看看 (zoukankan.com)
使用vim xxx.sh命令进行JVM参数配置修改:
将runbroker.sh的第一个JAVA_OPT改成JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
将runserver.sh的第一个JAVA_OPT改成JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
2、docker安装Rocket
(1)项目目录结构
如上图所示,logs和store文件是docker文件的挂载点,挂载点就是本机文件和docker里文件的映射,下图是挂载点的配置,有需要的可以自行修改。
go.mod和go.sum是golang模块化的必备文件,用来管理依赖(和Java的maven的pom文件作用类似),main.go文件里编写了一个RocketMQ-Golang的简单案例,在本文的第二部分将介绍。
(2)编写docker-compose.yml配置文件
version: '2'
services:
namesrv:
image: rocketmqinc/rocketmq
container_name: rmqnamesrv
restart: always
ports:
- 9876:9876
volumes:
- ./logs:/home/rocketmq/logs
- ./store:/home/rocketmq/store
command: sh mqnamesrv
broker:
image: rocketmqinc/rocketmq
container_name: rmqbroker
restart: always
ports:
- 10909:10909
- 10911:10911
- 10912:10912
volumes:
- ./logs:/home/rocketmq/logs
- ./store:/home/rocketmq/store
- ./conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
depends_on:
- namesrv
console:
image: styletang/rocketmq-console-ng
container_name: rocketmq-console
restart: always
ports:
- 9090:8080
depends_on:
- namesrv
environment:
- JAVA_OPTS= -Dlogging.level.root=info -Drocketmq.namesrv.addr=rmqnamesrv:9876
- Dcom.rocketmq.sendMessageWithVIPChannel=false
(3)编写broker.conf配置文件
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhere = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# broker 容器IP
# 通过客户端远程访问时,需要设置为服务器的IP地址
#brokerIP1 = rmqbroker
(4)启动docker
docker-compose up -d #后台启动docker,它会按照编写docker-compose.yml文件拉去镜像,启动rocketmq
docker-compose down #停止docker容器
上述命令需在docker-compose.yml同意目录才可以正确启动,docker-compose命令默认加载名字为docker-compose.yml的配置文件,如果需要修改docker-compose命令的加载文件加上
-f
参数。
3、RocketMQ前端页面的使用
参考文章Golang之RocketMQ基础使用 - 掘金 (juejin.cn)
二、RocketMQ-Golang简单案例
(1)项目初始化
使用命令,如果当前项目不在GOPATH目录中,则需要指定初始化模块名(我踩了一个坑)
go mod init 模块名
(2)下载依赖
go get github.com/apache/rocketmq-client-go/v2
(3)编写简单案例
package main
import (
"context"
"fmt"
"os"
"github.com/apache/rocketmq-client-go/v2"
"github.com/apache/rocketmq-client-go/v2/admin"
"github.com/apache/rocketmq-client-go/v2/consumer"
"github.com/apache/rocketmq-client-go/v2/primitive"
"github.com/apache/rocketmq-client-go/v2/producer"
)
func main() {
// 1. 创建主题,这一步可以省略,在send的时候如果没有topic,也会进行创建。
CreateTopic("testTopic01")
// 2.生产者向主题中发送消息
SendSyncMessage("hello world2022send test ,rocketmq go client! too,是的")
// 3.消费者订阅主题并消费
SubcribeMessage()
}
func CreateTopic(topicName string) {
endPoint := []string{"127.0.0.1:9876"}
// 创建主题
testAdmin, err := admin.NewAdmin(admin.WithResolver(primitive.NewPassthroughResolver(endPoint)))
if err != nil {
fmt.Printf("connection error: %s\n", err.Error())
}
err = testAdmin.CreateTopic(context.Background(), admin.WithTopicCreate(topicName))
if err != nil {
fmt.Printf("createTopic error: %s\n", err.Error())
}
}
func SendSyncMessage(message string) {
// 发送消息
endPoint := []string{"127.0.0.1:9876"}
// 创建一个producer实例
p, _ := rocketmq.NewProducer(
producer.WithNameServer(endPoint),
producer.WithRetry(2),
producer.WithGroupName("ProducerGroupName"),
)
// 启动
err := p.Start()
if err != nil {
fmt.Printf("start producer error: %s", err.Error())
os.Exit(1)
}
// 发送消息
result, err := p.SendSync(context.Background(), &primitive.Message{
Topic: "testTopic01",
Body: []byte(message),
})
if err != nil {
fmt.Printf("send message error: %s\n", err.Error())
} else {
fmt.Printf("send message seccess: result=%s\n", result.String())
}
}
func SubcribeMessage() {
// 订阅主题、消费
endPoint := []string{"127.0.0.1:9876"}
// 创建一个consumer实例
c, err := rocketmq.NewPushConsumer(consumer.WithNameServer(endPoint),
consumer.WithConsumerModel(consumer.Clustering),
consumer.WithGroupName("ConsumerGroupName"),
)
// 订阅topic
err = c.Subscribe("testTopic01", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for i := range msgs {
fmt.Printf("subscribe callback : %v \n", msgs[i])
}
return consumer.ConsumeSuccess, nil
})
if err != nil {
fmt.Printf("subscribe message error: %s\n", err.Error())
}
// 启动consumer
err = c.Start()
if err != nil {
fmt.Printf("consumer start error: %s\n", err.Error())
os.Exit(-1)
}
err = c.Shutdown()
if err != nil {
fmt.Printf("shutdown Consumer error: %s\n", err.Error())
}
}
(4)启动项目
go run main.go
三、参考资料
RocketMQ的broker启动失败解决 - 走看看 (zoukankan.com)