044-多数据源&读写分离
在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。在springboot中配置多个数据源,推荐dynamic-datasource-spring-boot-starter依赖组件,它适用于读写分离,一主多从的环境。如果是更复杂的多数据源环境,建议使用sharding-jdbc 。
首先介绍pom依赖:

可以看到,除了原来的ssm配置,只增加了一个dynamic-datasource-spring-boot-starter依赖。
然后介绍项目配置,配置过程分为以下五步:
1 禁止默认的druid数据源配置
2 在配置文件中配置多个数据源
3 写业务代码。
4 测试
5 查看druid监控工具
第一步
springboot有很多默认的自动化配置,数据源就是其中一个。要配置多数据源需要把默认的单数据源配置禁止掉springboot自带的DataSourceAutoConfiguration。加入druid依赖后,使用的是DruidDataSourceAutoConfigure,因为它会默认会读取application.properties文件的spring.datasource.*属性并自动配置单数据源。
需要在启动类上加个注解就可以禁止掉:
@SpringBootApplication(exclude= {DruidDataSourceAutoConfigure.class})
第二步
在配置文件中配置多个数据库的数据源,此处简单配置一主三从四个数据库的数据源。

第三步
开始写业务代码,首先在启动类配置mapper接口的扫描:
@MapperScan("many.datasource.mp.mapper")
然后是实体类:

mapper接口:

service类:

注意,@DS("slave")注解放在类上面,说明整个类的方法默认使用三个从库数据源操作数据库,第一个insertUser方法在方法上面加了@DS("master")注解,表示此方法使用主库数据源,凡是在方法上注明的会覆盖默认的,第四个方法selectUser3上面并没有注明,会随机使用三个从库中的默认一个。
注意,@DS注解建议使用在service层,不建议使用在mapper层!
接下来是controller类:

可以看到控制器并没有什么特别之处。只是单纯的调用。
第四步
接下来进行测试,首先启动项目,可以看到数据源加载:

打开postman,测试几个接口,首先测试新增:

控制台:

数据库:

接下来在三个从库分别加入一条数据:



执行selectUser3接口会发现查询结果会在三个从库之间轮训,这也是实现了负载均衡。
第五步
查看druid监控工具



上面就是springboot整合多数据源的一个简单版本。
读写分离
上面的例子中,每个对数据库的操作方法可以任意选择数据源,下面看一个实现读写分离的例子,首先创建项目:

上面的依赖中,前面都是熟悉的,项目使用mybatisplus和sharding-jdbc-core这两个第三方starter实现读写分离,关于mybatis plus,可以查看本系列教程的第045篇。
接下来看配置,

上面简单配置了一主二从三个数据源,其中 round_robin 表示负载均衡使用循环的策略。
接下来看一下启动类:

启动类要取消默认数据源的配置,并加上mapper的扫描注解。其它基本没变。
这样配置就基本完成了,使用starter就是这么简单,接下来看业务代码,首先是实体类:

然后是mapper:

mapper实现了一个新增和查询功能,测试读写分离足够了。接下来看service代码:

可以看到读写分离的service与上面多数据源的不同,这只是个普通的service,没有多余的配置和注解,这是因为读和写的操作已经自动实现了,只往主库写,在读库读。
最后看一下controller类:

可以看到也没有什么不同。
接下来启动项目测试:




可以看到只往主库中写数据了,从库中并没有。
注意:客户端实现的读写分离,都没有实现主从同步,需要配置数据库本身的主从同步使用!!!!!
接下来往从库中手动加一条数据:


然后调用查询接口:


自己手动多执行几次,可以发现实现了负载均衡,策略是轮训。
代码地址: https://gitee.com/blueses/spring-boot-demo