springboot+mybatis-plus实现读写分离

news2024/11/13 15:03:34

shigen坚持日更的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考,不断沉淀和成长。

最近shigen加班也比较严重,很多天文章没有更新了,各位读者和伙伴见谅哈。

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

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

读写分离的原理

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

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

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

启动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一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023/10/28 JAVA学习

导入模块 找到模块路径后,复制到上面,注意导入的是这个 还需要注意,这样导入的话,可能模块不在同一个工程文件里,如果不小心删除这个模块,就不能使用了,所以建议,把原本模块先复制到工程文件中,然后再找模块路径,进行上面操作 还有一种方式新创一个模块,然后把想要导入的模块代…

不一样的网络协议-------KCP协议

1、kcp 的协议特点 1.1、RTO 不翻倍 RTO(Retransmission TimeOut),重传超时时间。tcp x 2,kcp x 1.5,提高传输速度 1.2、选择重传 TCP丢包时会全部重传从该包开始以后的数据,而KCP选择性重传,只重传真正丢失的数据包…

『力扣刷题本』:移除链表元素

一、题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&a…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现ARIMA-LSTM差…

开源B2B网站电子商务平台源码下载搭建 实现高效交易的桥梁

随着互联网的普及和电子商务的快速发展,B2B(Business-to-Business)网站电子商务平台在商业领域中发挥着越来越重要的作用。通过开源B2B网站电子商务平台源码搭建,企业可以构建自己的电子商务平台,实现高效交易的桥梁。…

Claim Proof Bug——Aztec最大的45万美金bug bounty

1. 引言 近期,Aztec Labs通过其Immunefi bug bounty program,发出了其有史以来最大的bug bounty——45万美金,给白帽独立安全研究员lucash-dev,以感谢其所发现的Aztec Connect Claim Proof Bug,基本时间轴为&#xff…

EASEX绘制卡通头像

#include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI 180度 2PI 360度int main() {// 创建1024*1024的窗体initgraph(1024, 1024);// 将背景颜色设施为白色setbkcolor(WHITE);cleardevice();// to…

Leetcode刷题详解——不同路径

1. 题目链接&#xff1a;62. 不同路径 2. 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”…

【python练习】python斐波那契数列超时问题

计算斐波那契数列第n项的数字 Description计算斐波那契数列第n项的数字&#xff0c;其中f(1)f(2)1,f(n)f(n-1)f(n-2)&#xff0c;如1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5,......Input 正整数n(n<100)Output 一个整数f(n)Sample Input 1 8 Sample Output 1…

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序表: 该顺序表使用动态内存分配,可以用来存储任意数量的同类型数据. 顺序表需要包含三个要素:存储数据的数组arr,顺序表…

Pandas透视表

Pandas使用pivot_table()方法和crosstab()方法实现透视表。 pivot_table()方法及参数 pivot_table()方法的语法格式如下&#xff1a; pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameA…

10月份程序员书单推荐

新书书单 1、C程序设计教程&#xff08;第9版&#xff09; 1.广受认可的《C程序设计教程》系列的第9版&#xff08;个别版本也译作《C语言大学教程》&#xff09;&#xff0c;秉承了该系列一贯的丰富而详细的风格。该系列一些版本因封面画有蚂蚁形象而被称为“C语言蚂蚁书”。…

有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L&#xff0c;设计一个算法使其元素递增有序 代码思路&#xff1a; 我这里懒得搞那个指针了&#xff0c;直接遍历一遍链表&#xff0c;把链表的元素复制到数组arr里面 对数组A进行一下排序&#xff0c;排完之后再把元素复制到L里面。 至于排序你用啥算…

构建外卖小程序:技术要点和实际代码

1. 前端开发 前端开发涉及用户界面设计和用户交互。HTML、CSS 和 JavaScript 是构建外卖小程序界面的主要技术。 <!-- HTML 结构示例 --> <header><h1>外卖小程序</h1><!-- 其他导航元素 --> </header> <main><!-- 菜单显示 -…

Capacitor 打包 h5 到 Android 应用,uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED

Capacitor 打包 h5 到 Android 应用&#xff0c;uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED capacitor 官网&#xff1a; https://capacitorjs.com/docs/ 项目上需要做一个 app&#xff0c;而这个 app 是用 uniapp 做的&#xff0c;里面用到了一个依赖 dom 的库&…

winscp显示隐藏文件

当前目录下有被隐藏的文件时&#xff0c;会在右下角看到 “已隐藏” 的字样&#xff0c;双击这个字样&#xff0c;就会显示被隐藏的文件和文件夹

私有云:【3】NFS存储服务器的安装

私有云&#xff1a;【3】NFS存储服务器的安装 1、使用vmwork创建虚拟机2、配置NFS服务器3、安装NFS存储服务4、配置NFS服务及创建存储共享 1、使用vmwork创建虚拟机 新建虚拟机NFS 分配400G硬盘&#xff0c;可以更高【用作存储】 自定义硬件 选择win2012的iso文件 设置登录密码…

数组与链表算法-矩阵算法

目录 数组与链表算法-矩阵算法 矩阵相加 C代码 矩阵相乘 C代码 转置矩阵 C代码 稀疏矩阵 C代码 数组与链表算法-矩阵算法 矩阵相加 矩阵的相加运算较为简单&#xff0c;前提是相加的两个矩阵对应的行数与列数必须相等&#xff0c;而相加后矩阵的行数与列数也是相同的。…

Notepad-- 轻量级文本编辑器的安装及基本使用

Notepad-- 轻量级文本编辑器的安装及基本使用 一、notepad--介绍1.1 notepad--简介1.2 notepad--特点 二、安装Notepad--2.1 下载Notepad--软件包2.2 解压软件包2.3 运行Notepad-- 三、Notepad-- 的日常使用3.1 编写yaml文件3.2 编写shell脚本文件3.3 编写python测试文件 四、文…