RocketMQ-Golang快速开始

1,147 阅读3分钟

一、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)项目目录结构

image.png

如上图所示,logs和store文件是docker文件的挂载点,挂载点就是本机文件和docker里文件的映射,下图是挂载点的配置,有需要的可以自行修改。

image.png

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

三、参考资料

Quick Start - Apache RocketMQ

RocketMQ的broker启动失败解决 - 走看看 (zoukankan.com)

Golang之RocketMQ基础使用 - 掘金 (juejin.cn)

(51条消息) rocketmq在golang的使用_段晓慢的博客-CSDN博客_golang rocketmq