springcloud: 使用dynamic-datasource组件配置多数据源、一主多从、读写分离(十)
0. 引言
微服务架构中,分库分表是常有的操作。在多个数据源的情况下,我们如何在代码中灵活切换成为问题。今天我们就利用dynamic-datasource-spring-boot-starter
组件来实现多数据源配置
1. 介绍
dynamic-datasource-spring-boot-starter
是一个基于springboot的快速集成多数据源的启动器。
环境要求:
jdk 1.7+
springboot 1.4.x或1.5.x或2.x.x
特性:
更多特性参考官方文档
2. 使用
引入依赖
com.baomidou dynamic-datasource-spring-boot-starter 3.4.1
2.1 配置主从库
修改配置文件
spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://ip1:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置slave_1:url: jdbc:mysql://ip2:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: jdbc:mysql://ip3:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver
使用时,在方法或者类上使用@DS
注解切换
如下我们在类上添加了@DS("slave")
,表示当我们访问这个类中的方法时会从slave这个数据源组里获取数据源,根据我们上述配置的,有slave_1,slave_2两个数据源,那么就会根据负载均衡策略选择同组下的数据源
同时我们又在listOrder2
方法中添加了@DS("slave_1")
,那么当我们访问listOrder2
方法的时候,就会优先识别方法上的@DS注解,于是就会去slave_1
查询数据
当我们只有一个@DS
注解时,表示默认数据源
@Service
@DS("slave")
public class OrderServiceImpl extends ServiceImpl implements IOrderService {@Overridepublic List listOrder(){return this.list();}@Override@DS("slave_1")public List listOrder2(){return this.list();}
}
2.2 读写分离
dynamic-datasource
配置读写分离也很方便,只需要我们配置好对应的读库和写库,比如如下的配置,我们在主库master中写入,在从库slave中读取
spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://ip1:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置slave_1:url: jdbc:mysql://ip2:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: jdbc:mysql://ip3:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver
那么就需要我们在方法或者类上标注,将写入的方法或者类都标注上@DS("master")
,在读取的方法或者类上标注@DS("slave")
如此就实现了我们的读写分离,当然这里我们还没有做数据同步的配置,可以使用canal等组件来实现,因为不属于我们本章讲解的主题,所以不做过多扩展了。
@Service
@DS("slave")
public class OrderServiceImpl extends ServiceImpl implements IOrderService {@Overridepublic List listOrder(){return this.list();}@Overridepublic Order getByOrderId(Long id){return this.getById(id);}@Override@DS("master")public boolean updateOrder(Order order){return this.update(order);}
}
2.3 多数据源
当我们涉及到不同类型的数据库时,也可以通过dynamic-datasource
来统一配置,其支持mysql,oracle,sqlserver,postgresql,h2等数据库。如下所示
datasource:# 数据源1db1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: oracle.jdbc.OracleDriverurl: jdbc:oracle:thin:@ip:1525:order_testusername: rootpassword: 123456 # 数据源2 db2:url: jdbc:mysql://ip2:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver
dynamic-datasource
的使用非常简单,更多的需要我们在实际项目中去实操体会,那么我们这一期的内容也就到此结束了。
关注公众号,了解更多新鲜内容
标签:
相关文章
-
无相关信息