springboot+mybatis-plus实现读写分离

shigen坚持日更的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考,不断沉淀和成长。
最近shigen加班也比较严重,很多天文章没有更新了,各位读者和伙伴见谅哈。

好的,现在我们进入正题。在之前的文章一文讲清楚mysql主从服务的搭建过程中,我相信伙伴们已经清楚了docker如何快速的搭建mysql主从服务了。那怎么使用呢?这个问题在shigen的心里藏了很久,趁着周末的功夫我正好研究了一下,并把我的代码master-slave-demo放在了gitee上,感兴趣的伙伴可以自己上去看看。当然,也欢迎大家提出优化的点,shigen会及时的回复和更新。

在开始之前,我们用一个图展示出读写分离的原理:

不会这么简单吧,是的你没有看错。就当我思考如何展示出这个概念的时候,我发现一张图就这样简单的展示出来了,不可思议。但是事实就是这么简单。

现在,我们的难点就是如何判断用户的请求是读请求还是写请求,然后切换到不同的数据库。 若依框架的多数据库似乎给了我灵感,但是我还没来得及看。现在自己造一个出来,文章中的部分代码参考springboot+mybatis-plus实现读写分离

老规矩,我们先把自己的mysql集群启动。

启动完毕之后,我们开始新建项目:master-slave-demo

引入项目需要的依赖

常用的我不说了,这里需要注意:

  • 引入spring-boot-starter-aop,我们需要用到spring的切片功能
  • mysql的驱动名字变了!com.mysql.mysql-connector-j,伙伴们可以关注一下
  • 需要进入alibaba的druid实现多数据源

配置文件多数据源

这里主要是配置了多个数据源,还有mybatis-plus需要的配置,具体的配置项含义可参考详细的注释

配置类

这里主要是读取我们在yaml配置文件的配置,并将bean放在DateSource中,现在我们需要的是一个路由,动态的切换数据源

数据源路由

数据源路由应需求而生,我们需要做的事就是从重写一下路由规则,规则是我们定制的,这里我们设置了一个dataSourceContextHolder。这个是不是很熟悉,什么holder的 ,就自然引入了线程上下文ThreadLocal

DataSourceContextHolder

这里的轮训是我设计的一个缺陷,我之前针对的是一主两从的设计,所以对2取模,这里对于一主一丛,设计的作用不大。这个类主要的作用就是将不同的数据源塞到县城上下文中。那我们怎么决定呢?我们需要一个切片!

切片设计

代码的核心,主要是拦截我们去查询、修改数据的方法,然后修改上下文。其中,Master注解是我单独设计的,可以用来实现这样的功能:部分接口查询主数据库。其它的就是spring的aop的使用了,这里不加赘述!

补充

需要注意的是,我们的ORM框架是mybatis-plus,我们仍然需要告诉它:你该用哪个数据源。

OK,一番准备之后,我们来测试一下实现的效果。效果我们可以看到会打印出部分的日志,我们根据日志区分,同时我也会采用断点跟进的方式,动态追踪代码。

对,我先看一下我的测试接口:

开始测试了!

  • 查询数据
  • 查询数据,但是从主节点

这里有个很有意思的现象,出现了进入读切点的日志,@Master应该放在service包下的方法。

对,这里需要改一下:

因为现在只有一个从节点了,不需要轮训了。

  • 添加数据

可以看到效果已经实现了,源码可以到上文提到的仓库查看。


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台 备注 链接
CSDN 知名博客平台,很少关注 shigen的CSDN主页
知乎 专注内容分享和问题解答 shigen的知乎主页
掘金 高质量博客平台 shigen的掘金主页
腾讯云开发者社区 腾讯云开发者社区 shigen的腾讯云开发者社区主页
微信公众平台 个人微信公众号,分享技术和日常 公众号名:shigen

shigen一起,每天不一样!

相关推荐
阿祖zu9 分钟前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
不才不才不不才19 分钟前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
IT_陈寒26 分钟前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端
搜狐技术产品小编202340 分钟前
告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
后端·多agent
DantyWei1 小时前
controller注册及调用时机
后端
edwarddamon1 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
码事漫谈2 小时前
我用 Seed Evolving 做了个 AI 小说写作工具
后端
Raas1002 小时前
MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
java·后端·网关·api网关·魔芋ai·finapi·mai gateway
DantyWei3 小时前
kube-controller-manager的leader选举流程和策略
后端