0
点赞
收藏
分享

微信扫一扫

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

特性:

  • 支持数据分组,适用于多库、读写分离、一主多从或其他混合模式
  • 配置文件所有以下划线分割的数据源,其首部就是分组的名称,相同组名称的数据源回放在一组下。比如slave_1,slave_2,都会放到slave组下
  • 方法上的注解优于类上的注解
  • 支持使用​​ENC()​​方法对数据库配置信息进行加密。

更多特性参考​​官方文档​​

2. 使用

引入依赖

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>

2.1 配置主从库

修改配置文件

spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://ip1:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://ip2:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: jdbc:mysql://ip3:3306/dynamic
username: root
password: 123456
driver-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<OrderMapper, Order> implements IOrderService {

@Override
public List<Order> listOrder(){
return this.list();
}

@Override
@DS("slave_1")
public List<Order> listOrder2(){
return this.list();
}
}

2.2 读写分离

​dynamic-datasource​​配置读写分离也很方便,只需要我们配置好对应的读库和写库,比如如下的配置,我们在主库master中写入,在从库slave中读取

spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://ip1:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://ip2:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: jdbc:mysql://ip3:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver

那么就需要我们在方法或者类上标注,将写入的方法或者类都标注上​​@DS("master")​​​,在读取的方法或者类上标注​​@DS("slave")​

如此就实现了我们的读写分离,当然这里我们还没有做数据同步的配置,可以使用canal等组件来实现,因为不属于我们本章讲解的主题,所以不做过多扩展了。

@Service
@DS("slave")
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {

@Override
public List<Order> listOrder(){
return this.list();
}

@Override
public 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:
# 数据源1
db1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@ip:1525:order_test
username: root
password: 123456
# 数据源2
db2:
url: jdbc:mysql://ip2:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver

​dynamic-datasource​​的使用非常简单,更多的需要我们在实际项目中去实操体会,那么我们这一期的内容也就到此结束了。

关注公众号,了解更多新鲜内容


举报

相关推荐

0 条评论