阿里云服务器Docker中RocketMQ的安装与使用和Springboot集成配置

阿里云服务器Docker中RocketMQ的安装与使用

1.搜索镜像

docker search rocketmq

curl https://registry.hub.docker.com/v1/repositories/foxiswho/rocketmq/tags\
| tr -d '[\[\]" ]' | tr '}' '\n'\
| awk -F: -v image='镜像名称' '{if(NR!=NF && $3 != ""){printf("%s:%s\n",image,$3)}}'

下面的就是分步启动nameserver和broker。

2、启动NameServer:

docker run -d -p 9876:9876 --name rmqserver  foxiswho/rocketmq:server-4.5.1

3、启动broker:

docker run -d -p 10911:10911 -p 10909:10909\
 --name rmqbroker --link rmqserver:namesrv\
 -e "NAMESRV_ADDR=namesrv:9876" -e "JAVA_OPTS=-Duser.home=/opt"\
 -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m"\
 foxiswho/rocketmq:broker-4.5.1

4.进入容器,修改配置文件

Broker容器中默认的配置文件的路径为:/etc/rocketmq/broker.conf

# 进入容器
docker exec -it 容器id /bin/bash
# 进入目录,找到配置文件broker.conf
cd /etc/rocketmq
# 修改broker.conf
vim broker.conf
# 在最后添加一行添加服务器公网IP
brokerIP1=服务器公网IP
broker.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 公网IP
autoCreateTopicEnable=true
退出容器
exit 
重启容器
docker stop 容器id
docker start 容器id

然后通过如下命令检查一下启动情况:

docker ps|grep rocketmq

请添加图片描述

说明服务已启动

5.下载rocketmq console控制台

如果一切正常,NameServer和Broker一会儿就会安装好,为了管理上的方便,rocketmq console也是必不可少的工具了,通过上面查询的方式找到需要启动的版本,启动方式如下:

查找到需要启动的版本
curl https://registry.hub.docker.com/v1/repositories/foxiswho/rocketmq/tags\
| tr -d '[\[\]" ]' | tr '}' '\n'\
| awk -F: -v image='styletang/rocketmq-console-ng' '{if(NR!=NF && $3 != ""){printf("%s:%s\n",image,$3)}}'
docker run -d --name rmqconsole -p 8180:8080 --link rmqserver:namesrv\
 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876\
 -Dcom.rocketmq.sendMessageWithVIPChannel=false"\
 -t styletang/rocketmq-console-ng

然后通过如下命令检查一下启动情况:

docker ps|grep rocketmq

请添加图片描述

再通过浏览器访问http://服务器公网IP:8180,console的页面显示如下:

请添加图片描述

查看集群地址:确保为服务器公网IP地址

请添加图片描述

SpringBoot集成Rocketmq

  1. POM.xml 2.2.0对应rocketmq4.8.0,2.1.1对应rocketmq4.7.1,不过影响不大
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
  1. application.properties
#Rocketmq server
rocketmq.name-server=http://公网IP:9876
rocketmq.producer.group=blog_group
rocketmq.producer.send-message-timeout=10000
  1. ArticleListener
import com.alibaba.fastjson.JSON;
import com.happyhao.blog.common.dto.JsonResult;
import com.happyhao.blog.common.vo.ArticleMessage;
import com.happyhao.blog.service.ArticleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.Set;

@Slf4j
@Component
@RocketMQMessageListener(topic = "blog-update-article",consumerGroup = "blog-update-article-group")
public class ArticleListener implements RocketMQListener<ArticleMessage> {

    @Autowired
    private ArticleService articleService;
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public void onMessage(ArticleMessage message) {
        log.info("*****收到的消息:{}",message);
        //做什么了,更新缓存
        //1. 更新查看文章详情的缓存
        Long articleId = message.getArticleId();
        String params = DigestUtils.md5Hex(articleId.toString());
        String redisKey = "view_article::ArticleController::findArticleById::"+params;
        JsonResult articleResult = articleService.findArticleById(articleId);
        redisTemplate.opsForValue().set(redisKey, JSON.toJSONString(articleResult), Duration.ofMillis(5 * 60 * 1000));
        log.info("*****更新了缓存:{}",redisKey);
        //2. 文章列表的缓存 不知道参数,解决办法 直接删除缓存
        Set<String> keys = redisTemplate.keys("listArticle*");
        keys.forEach(s -> {
            redisTemplate.delete(s);
            log.info("*****删除了文章列表的缓存:{}",s);
        });

    }
}
  1. 调用:topic必须对应
if (isEdit){
            //发送一条消息给rocketmq 当前文章更新了,更新一下缓存吧
            ArticleMessage articleMessage = new ArticleMessage();
            articleMessage.setArticleId(article.getId());
            rocketMQTemplate.convertAndSend("blog-update-article",articleMessage);
        }

参考博客:

https://blog.csdn.net/fenglibing/article/details/92378090

https://blog.csdn.net/qq_41773240/article/details/104247817

结合了这两篇重装 | 第二个问题是显示sendDefaultImpl call timeout,在配置里加上自动创建topic就可以!

https://blog.csdn.net/qq_41108614/article/details/106044882

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值