spring boot使用shard-jdbc读写分离功能

参考:这是shard-jdbc2.x的
官网:https://shardingsphere.apache.org/document/current/cn/overview/

环境
框架 版本
shard-jdbc 4.0.0-RC2
spring boot 2.1.7
mybatis-plus 3.2.0
druid 1.1.18
mysql 8.x
shard-jdbc依赖

当当网开源的组件,现在收录到apache
官网提供多种部署方式,这里我是用spring boot风格的依赖

<!-- sharding-jdbc驱动 -->
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>${sharding-sphere.version}</version>
            </dependency>

            <!-- sharding-jdbc驱动 -->
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-namespace</artifactId>
                <version>${sharding-sphere.version}</version>
            </dependency>
druid依赖

druid依赖不要使用spring boot starter自动配置的依赖,因为shard-jdbc的配置不需要配spring.datasource,而使用druid-spring-boot-starter,由于auto configuration一直读不到spring.datasource,导致启动一直报错。查了很久才发现是使用这个依赖导致

不要用这种spring boot风格依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.20</version>
</dependency>

用这种maven风格的依赖

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid</artifactId>
    <version>${druid.version}</version>
</dependency>
配置如下
spring:
  # shard-jdbc 读写分离配置(仅支持一主多从的结构)
  shardingsphere:
    # 主从配置
    masterslave:
      name: ms # 主从数据源名称
      load-balance-algorithm-type: round_robin # 负载均衡算法 ROUND_ROBIN,RANDOM
      master-data-source-name: master # 主库名称
      slave-data-source-names: slave0,slave1 # 从库名称列表
    # 其他属性
    props:
      # 是否在启动时检查分表元数据一致性,默认值: false
      check:
        table:
          metadata:
            enabled: false
      # 工作线程数量,默认值: CPU核数
      # executor:
      #  size: 8
      # 是否开启SQL显示,默认值: false
      sql:
        show: true
    # 数据源配置
    datasource:
      # 数据源名称,多数据源以逗号分隔
      names: master,slave0,slave1
      # 主库的datasource配置
      master:
        # 指定使用druid连接池
        type: com.alibaba.druid.pool.DruidDataSource
        # 默认连接配置
        url: jdbc:mysql://ip1:3306/iif_user?useUnicode=true&useSSL=false&characterEncoding=utf8
        username: root
        password: 123456
        # driver-class-name: com.mysql.jdbc.Driver
        driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8 包路径变了
        # druid专属的属性配置
        platform: mysql
        #    type: com.alibaba.druid.pool.DruidDataSource
        # 下面为连接池的补充设置,应用到上面所有数据源中
        # 初始化大小,最小,最大
        initialSize: 5
        minIdle: 5
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 30000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 合并多个DruidDataSource的监控数据
        #useGlobalDataSourceStat: true
        web-stat-filter:
          enabled: false
          url-pattern: /*
          exclusions: '*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*'
        # Druid StatViewServlet配置 可视化web界面
        stat-view-servlet:
          enabled: false
          url-pattern: /druid/*
          reset-enable: true
          login-username: admin
          login-password: admin
          # 配置日志输出
        filter:
          slf4j:
            enabled: false
            statement-create-after-log-enabled: false
            statement-close-after-log-enabled: false
            result-set-open-after-log-enabled: false
            result-set-close-after-log-enabled: false
      # 从库0的datasource配置
      slave0:
        # 指定使用druid连接池
        type: com.alibaba.druid.pool.DruidDataSource
        # 默认连接配置
        url: jdbc:mysql://ip2:3307/iif_user?useUnicode=true&useSSL=false&characterEncoding=utf8
        username: root
        password: 123456
        # driver-class-name: com.mysql.jdbc.Driver
        driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8 包路径变了
        # druid专属的属性配置
        platform: mysql
        #    type: com.alibaba.druid.pool.DruidDataSource
        # 下面为连接池的补充设置,应用到上面所有数据源中
        # 初始化大小,最小,最大
        initialSize: 5
        minIdle: 5
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 30000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 合并多个DruidDataSource的监控数据
        #useGlobalDataSourceStat: true
        web-stat-filter:
          enabled: false
          url-pattern: /*
          exclusions: '*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*'
        # Druid StatViewServlet配置 可视化web界面
        stat-view-servlet:
          enabled: false
          url-pattern: /druid/*
          reset-enable: true
          login-username: admin
          login-password: admin
          # 配置日志输出
        filter:
          slf4j:
            enabled: false
            statement-create-after-log-enabled: false
            statement-close-after-log-enabled: false
            result-set-open-after-log-enabled: false
            result-set-close-after-log-enabled: false
      # 从库1
      slave1:
        # 指定使用druid连接池
        type: com.alibaba.druid.pool.DruidDataSource
        # 默认连接配置
        url: jdbc:mysql://ip3:3308/iif_user?useUnicode=true&useSSL=false&characterEncoding=utf8
        username: root
        password: mysql@dongri
        # driver-class-name: com.mysql.jdbc.Driver
        driver-class-name: com.mysql.cj.jdbc.Driver # mysql 8 包路径变了
        # druid专属的属性配置
        platform: mysql
        #    type: com.alibaba.druid.pool.DruidDataSource
        # 下面为连接池的补充设置,应用到上面所有数据源中
        # 初始化大小,最小,最大
        initialSize: 5
        minIdle: 5
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 30000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 合并多个DruidDataSource的监控数据
        #useGlobalDataSourceStat: true
        web-stat-filter:
          enabled: false
          url-pattern: /*
          exclusions: '*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*'
        # Druid StatViewServlet配置 可视化web界面
        stat-view-servlet:
          enabled: false
          url-pattern: /druid/*
          reset-enable: true
          login-username: admin
          login-password: admin
          # 配置日志输出
        filter:
          slf4j:
            enabled: false
            statement-create-after-log-enabled: false
            statement-close-after-log-enabled: false
            result-set-open-after-log-enabled: false
            result-set-close-after-log-enabled: false
    # 读写分离规则
    sharding:
      master-slave-rules:
        ms: # 主从数据源名称
          master-data-source-name: master  #主库数据源名称
          slave-data-source-names[0]: slave0 #从库数据源名称列表
          slave-data-source-names[1]: slave1 #从库数据源名称列表
          # load-balance-algorithm-class-name: #从库负载均衡算法类名称。该类需实现MasterSlaveLoadBalanceAlgorithm接口且提供无参数构造器
          load-balance-algorithm-type: round_robin #从库负载均衡算法类型,可选值:轮询 ROUND_ROBIN,随机 RANDOM。若`load-balance-algorithm-class-name`存在则忽略该配置
测试效果如下

spring boot使用shard-jdbc读写分离功能_第1张图片因为在配置项设置打印sql
可以看到写操作都在主库:master
读操作在从库(指定轮询策略):slave0,slave1

目前看到功能是正常的,后续使用过程中,再发现下是否稳定?是否有坑?

你可能感兴趣的:(springboot,java)