基于springboot+vue+(redis\mysql\rocketmq)个人博客技术总结

基于springboot+vue+(redis\mysql\jwt\rocketmq等)个人博客技术总结

前言

    首先非常感谢码神的个人博客的教程,之前完成了基础的本地搭建,最近,自己买了一台服务器实现了项目的部署,同时,解决了之前项目遗留的更新文章之后文章因为缓存的问题没有显示等一些bugs,记录了云服务器安装rocketMQ的一些坑,目前还在备案域名
我的个人博客,等之后备案成功就可以访问了,终于完成了第一个博客,真的是技术满满,踩了好多的坑。

基于springboot+vue+(redis\mysql\rocketmq)个人博客技术总结_第1张图片

技术总结

  1. 注册的时候添加 @Transactional注意数据库事务的回滚,不然会倒置注册程序出现运行时错误数据可以进行回滚不更新到数据库。
  2. threadlocal 做了线程隔离 通过线程变量 减少session 的使用 减小服务器的压力 需要注意threadlocal的内存泄露的问题,threadlocal可以解决多线程不安全的另外一种方案除去加锁以外,内存泄漏的问题主要是因为里面有key-value对应的map,但是key是弱引用 在垃圾回收的过程中可以回收掉,但是value是强引用,强引用不会被回收,因此内存里面value会越来越多。
  3. 线程池的使用 七大核心参数,更新文章的阅读数。否则放在主线程执行会在数据库更新的时候添加写锁增加性能的消耗。了解了乐观锁和悲观锁的应用场景相关知识 ,在阅读数更新的时候用到了类似于乐观锁的思想, //update article set viewcount =100 where viewcount=99 and id=11; 为了保证线程的安全,需要先查询上一个count的数量 只有一致的时候才可以进行更新的操作 乐观锁的实现方式 CAS 比较并交换,但是可能会出现ABA的问题,因此可以采用添加版本号和时间戳的方法实现。
  4. 评论功能 评论显示功能 两级评论的功能 设置parentid 通过parentid查找子评论,level代表是否含有子评论 touser为评论的对象 评论功能实现过程中出现了后端分布式id传到前端的过程中出现了精度损失的问题,需要进行json序列化
  5. AOP思想 日志 cache缓存 log4j
  6. 七牛云 实现图片的上传 图片专属的服务器
  7. 统一缓存优化,AOP思想将数据存入redis 到时候直接返回数据,避免了数据库大量访问的压力,但是在更新文章的时候由于cache缓存时间的问题,需要同步更新缓存,通过消息队列rocketmq设置解决
  8. 后台管理系统 spring security实现权限管理,控制不同用户的访问权限
  9. jwt +redis token令牌登录 session共享 redis 做了令牌和用户信息管理,登录用户缓存,灵活控制用户过期

优化点

  1. 文章可以放入Elasticsearch
  2. 评论数据放入Mangodb 电商系统中 评论数据放在Mangodb中
  3. 阅读数和评论数 redis,定时任务, 实现自增 , 固化到数据库 优化了原来线程池的性能问题
  4. 加快访问速度 ,部署的时候把静态资源放到文件网站

部署踩坑记录

上一篇文章记录了基本的云服务器的一个部署过程 我的部署 下面主要记录后续修改cache缓存一致的bug问题,记得前端文件要新增关于编辑功能的按钮有,以及后端文件需要添加编辑功能接口,以及关于rocketMQ消息队列的一系列配置

关于云服务器配置rocketmq

起初遇到一些问题,后端访问远程的rocketmq一直显示连接失败,根本原因应该是启动的时候没有使用相关的配置文件broker.conf进行broker的启动,先启动rocketmqServer 然后启动 broker 。
基本命令

  • 安装rocketMQ
    docker run -d -p 9876:9876 --name rmqserver foxiswho/rocketmq:server-4.7.0
  • 编写broker.conf文件(vim /home/rocketmq/broker.conf 路径自己选择,运行的时候设置对应映射关系即可)
# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = 自己的ip地址
  • 启动broker
docker run -d -p 10911:10911 -p 10909:10909\
--name rmqbroker --link rmqserver:namesrv\
--privileged=true\
-e "NAMESRV_ADDR=自己的ip地址" -e "JAVA_OPTS=-Duser.home=/opt"\
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m"\
-v /home/rocketmq/broker.conf:/etc/rocketmq/broker.conf \
foxiswho/rocketmq:broker-4.7.0
  • 启动rocketMQ-console
docker run -d --name rmqconsole -p 8180:8080 --link rmqserver:namesrv\
 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=自己的ip:9876\
 -Dcom.rocketmq.sendMessageWithVIPChannel=false"\
 -t styletang/rocketmq-console-ng

基于springboot+vue+(redis\mysql\rocketmq)个人博客技术总结_第2张图片

  • 记得修改springboot中rocketMQ相关配置以及打开云服务器相关端口

最后docker容器里面放的所有运行的容器如下图:
在这里插入图片描述

    最后,终于完结了个人博客,这个过程中对整体的前后端分离项目以及一些技术都有了基本的了解,感谢码神的教程,以及在部署过程中遇到的各种各种坑,学到了很多处理的方式,自己一步一步部署成功,顺便把docker中的一些操作做了一遍,收获不少,最后感谢大家的三连

你可能感兴趣的:(部署,docker,spring,boot,阿里云)