00:00
Hello,伙伴们大家好,我是世根,那么今天给大家带来的分享是频BOO加my BA plus实现读写分离,那么在这之前呢,我们已经有过一期的教程,讲的是这个MYSQL储存服务的搭建过程,那么在这篇文章里面,我也详细的介绍了如何使用这个docker combos文件去搭建MYS库的储存啊,包括他们的储存复制怎么搭建的好,包括后期我们自己去这个用数据库连接工具去测试,发现数据是成功的,同步的。这个就是之前讲到的一些教程,大家可以去参考一下,那么我们把这个主从服务搭建起来了,我们如何在这个项目里面使用的,那么今天这篇文章就会告诉大家,就是如何实现这种读写分离的使用。那么首先我们需要知道读写分离的原理,其实读写分离它就是当我们用户去请求的时候,它如果是读请求我们就去主服务器,然后是写请求我们就去从服务器,就这么简单,其实我画出来展示的时候我也觉得很不可思议,那么我们要怎么去实现这些呢?首先我们需要在本地的把我们之前的docker comp docker的compos把它启动起来,嗯,那么在我本地的,我首先给大家推出一下,这是我连接到的MYS,我们去这个docker上看一下,我们都cker PS啊,J1PMYS,我发现现在是有两个机器开着在的,嗯,就是我们的master和都开的,那么开完之后我们是就需要自己新建项目了,就用这个使用,使用的是spring BOO加这个my Betty plus,那么项目中引入的依赖呢?我们需要有这个AOPP,包括notebook,我。
01:48
我们常用的这些注册常用的这个,呃,生成实体内的什么get set属性,包括这个MYSQL的驱动啊,还有这个DRUID,就是阿里的这个数据库连接池工具,之后呢,我们需要去配置这个数据源,嗯,配置数据源包括这个配置内,我们需要把它给注入进去,那么可能在这个教程里面讲的不太详细,那么我们现在带大家进入这个代码里面去看一下,在我本地呢,有这样的一个项目,就是它是我首先给大家看一下它的一个项目结构嘛,和我们常见的一样,Resource下面放的是这个application差文件啊,包括这个use my plus的文件,然后这个是我们的主启动内。
02:38
啊,下面的这是一些注解,包括切片page内啊,Control service deal,我们首先一部分来看,首先我在我本地的定义那个接口。那和我们常见都一样,我们首先这个是有增生改查一些接口嘛,直接是调的这个预测service,因为我们这个有service层,它继承了这个my BA plus的带的一些默认接口,所以我们这里面可以直接去调用,并没有具体的一些实现,嗯,接下来呢,我们就需要在这个配置文件里面去配置一下我们这个。
03:13
Master master节点的配置和这个slave的配置啊,这里面就是我们把这个配置给加上来了之后呢,这下面是my be plus的一些配置,那么这也是,呃,都有详细的注释,大家可以参照我的文档或者代码来看哦,核心点呢,现在就在于这个我们配置的这个master和silver,我们如何让spring BOO去读到呢?那我们就需要一个config注解,那么我们看一下data source config,我们首先定义的两个ban,一个叫master,一个叫一,那么这里面呢,它的就是根据些前缀去读到它的这个配置,然后把它用,呃,把它构造一个这个数据库连接池,就这样下面呢,其实我们定义的一个这个数据库的路由,因为我们定义的两个数据数据源一个是只读的,一个是只写的,那么我们什么时候用只读的,什么时候用只写的,那我们就需要自己去构造一个这个路由啊,去选取它对应的这个数据的节点。
04:14
那么这里面我是用一个哈map把它给存储进去的啊,我们有这个啊主节点和存节点之后呢,我注入我之后,我放进去我一个路由的data source,我们可以看一下它具体的实现,其实它就是继承了这个抽象类的这个呃,Abstract routine data source,然后它这个也是这个spring BOO提供的,就是spring BOO底层提供的,它有一个lookup,嗯,这个包里面啊,我们去重写一下它的就是决定哪哪个路由啊,我们就用到这个data source content holder.get方法去得到这个数据库的这个类型啊,类型里面我们是有两个媒,是用两个枚举嘛,一个是节点,一个是从节点,那么我们看到的这个data source content holder,我们就应该想到这个数据库啊,这个这个现成的上下文,对吧,像数据库的上下文,这个我们其实建到的很普遍的,那么它主要是构做成了这种数据的隔离,数据的同步,我们去看一下它的get方法。
05:14
啊,Get的方法,其实我们就是从这个contest holder里面去拿到的,那么它怎么拿的呢?这个我们就涉及到底层的,我们先不讲,那么这个contest holder里面呢,我放的是什么东西呢?我放的就是这个DD type,就是这个枚举,枚举我就是从这个里面拿的,那么具体的他拿的是什么东西呢?我们可以看到这里有个master和silver,那么这里面我们是从什么时候让他去切换的呢?啊,我们这里边是有一个set方法,其实就是切换,我们什么时候切换呢?我们先稍等一下,好,我们看到这样有一个配置内的时候,我们就有两个数据源,并且决定了数据源的路由,接下来我们就需要。我我们就需要通过这个a op机制把这个把这把这个动态的切换,这个数据源,我们首先定义的我们的读切面,读切面呢,其实就是对应的我们这个service方法里面呢,因为我们刚才讲的service继承的my plus的这些接口,那么它我们一般的查询的语句有这个select get find list,对吧,它这个是匹配这个前缀的,就是说正如我这个注解里面所说,这个需要读的方法,切面选择service这些子包中select list开头的方法,但是要排除带有master注解方法。
06:37
OK,现在我们看到了现效果是这样的,就是我们如果读到这样的,嗯,符合这样的service呢,我们就去进行只读的point啊,就是我们去进行只读的,只读的是什么样的,它就是去让这个啊count hold里面改成这个slave方法就是去让它把它切换到silver,那么之前呢,其实我已我写了这些这些这些代码。
07:07
那么这个代码呢,它因为我们之前是考虑到了它silver可能有多高,那么这个二其实代表silver的数量,我们做一个人群人群算法,但是我现在是单节点,所以我这些代码啊,我先把它省略掉,嗯,所以我们就是通过切面的方式啊,包括我们去找这个写的方法,我们就是写的方法,我们叫ex save update edit delete remove,这些都是对数据库写操作的,那么写操作的话,我们就需要经过主节点啊吧,主节点也有,我们这边也有。Red point我们进入写,进入写切点,其那么写的话,我们就需要把它这个切换到master master的话也是一样的,我们把这个holder里面那个DB tab我们改一下就可以了,那么他拿到就是他拿到的时候永远就是从这个content hold里面拿的,所以我们现在就实现了根据切点去啊,动态的改这个数据,呃,动态的改这个数据源。
08:07
那其他的没有什么好讲的,我们现在来测试一下,嗯,我们先根据我之前的数据吧,比方说我要去呃查询这个user ID是二的数据,那么我这个是查,那么它日志应该打印的是什么呢?打印的是应该是从到这个从节点serve,我们回头看一下,那好,这个时候我们这个断点已经进来了,我们看到这进进入到这个读切点啊,我们继续往下执行,我们会发现此时我们到了这个轮行的方法了啊,我们再往下走走,会发现这个时候已经把这个level已经切换了。早。走好,下面这就进入到别的方法了,我们直接让断点跳跳过,那么这个时候呢,我们发现数据反回出来了,并且是对应优节点切入到LEVEL1,这是我们进行的这个读操作,那我们现在进行一个写操作,写操作呢,我们一样根据之前的我们在通过这个接口之,嗯,我们通过这个写的接口啊,我们看一下看出。
09:11
Controller呢,这里面有一个写接口啊,就是insert,我们直接把这个传入个user进去,那么user属性呢,我们有啊Le,呃,有这个user name和password,我们首先要user LA我们叫就叫test,那password我们就叫123456吧,123456 OK,我们现在敲回车,我们看一下会实现什么效果,为了方便呢,我们先把它控控制台清除清空,我们进入斜切点了,我们发现它已经到这里面来了,我们继续往下走。好,他已经切换到master了,我们直接直接直接让他跳过,那么跳过之后我们发现它输入的数位处,我们再看一下日志啊,切换到master,点成管的切换到master那已经写了。好,那么现在我们看到控制控制台里面这样已经实现了这种读写的切换,那我们看一下数据库呢,我们不是通过这个设置的,有这个主层节点嘛,我们首先看一下这个是主节点,我们看一下啊,我直接超出之前的命令啊,好看到刚才的test这个数据已经。
10:17
加入进来了,我们再看一下这个从节点,从节点一样,我们之前是执行的这样的一个命令,我们直接进到MYSQL里面,我们MYL-U杠七。啊,我们用户名输错了啊,好,现在我们进入到MYSQL里面了,进入MYSQL里面了,我们要和之前的运命令一样啊,我们首先use test用到这个数据库,然后我们用到查询到数据表from user,那么这个时候我们看到数据,呃,稍微有一点同步延迟啊。嗯。
11:00
稍微有一点同步延迟。好,我们看一下这个同步的结果。然刚才我排查了一下,就是我们发现数据库里面,我的主数据库是这样的数据,从数据库只有这样的,只有这样的四条数据,我发现之间少一条数据,那我们第一时间我就怀疑到可能是我们这个主从同步的问题出问题了,那们最后我执行的这条命令就是看一下这个,呃,从今人的状态,我发现呢,有这样的一个问题,就是嗯,尝试了十次去连接MYSQL的master节点,但是我发现连不上。
12:02
完了之后呢,我就去退出这个MYL执行的这二命令,看看我的主机,我的master节点的3306端口是否能够嗯,通,我发现是可以通的,是可以通的,然后我又进入到我的这个MYSQL里面,我再去执行了这样一个命令,叫做。Start slave就是把这个slave线程启动,然后发现呢,这个时候它的数据已经同步过来了,就是我们现在是已经逐从同步把它给砌起来了,我们这个时候为了方便测试,我们再去启动一条数据啊,我们回到我们的idea里面。那么一样的,我们再去执行一条数据,我们变成叫test,我们这个时候叫TEST01,好,这个时候肯定是写入,写入写切点,写切点,那么肯定就是切换到master对吧?这个时候我们回到数据已经写入成功了,那我们再回到我们的masterql里面,我们先看一下我的主数据库啊,已经有1DID ID是11的数据,我们再看一下从数据库这个时候也有ID等于11的数据,说明这个时候MYSQL已经启动成功了,那么基于这个问题呢,我也去看了一下我的多comps文件啊,这就是我多comps文件,就是首先我定一个master节点,然后这个下面是serve节点。
13:13
嗯,他们应该有一个先后顺序的,就是我的master节点启动完之后再去启动,再去启动这个在节点啊,保证他们之间的一个先后的顺序关系,这样的话就可以保证它能注册通过了,那么这个样文件呢,我也会后期改一下,今天就是给大家分享的是这个马SQ的这个my be plus啊,实现这种读写分离的全部的内容呢,觉得不错的话,希望大家多多管点赞支持好,谢谢大家。
我来说两句