一:mysql的读写分离+一主二仆
技术点:springboot+mysql+dynamic-datasource-spring-boot-starter(多数据源)
理解:先说下单台服务器的缺点
1.服务宕机后没得玩了,
2.读写在一个库造成数据库压力大
3.因操作不当造成了单表被锁,影响查询
读写分离优点:
需要应用2台服务
1.缓解服务器访问压力
2.用数据库查询会多,将一个库用作查询,一个库用作 增,删,改
一主二仆
需要应用3台服务 1.极大缓解了服务器的访问压力,2.需要注意两台从库访问是采用轮询机制,
1.业务场景
客户给了3台MySQL数据库服务器,一主二从,程序需要集成读写分离,充分提升数据处理能力
数据层使用了MyBatis-Plus,它有一个多数据源的中间件 dynamic-datasource-spring-boot-starter;
步骤一:pom.xml核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
<!-- 多数据源配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- mybatis generator 自动生成代码插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
步骤二: 多数据源约定在yml中配置, 配置好主库,从库连接地址
1. 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
2. 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
3. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
4.默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
5. 方法上的注解优先于类上注解。
6. 强烈建议只在service的类和方法上添加注解,不建议在mapper上添加注解。
#数据源
datasource:
druid:
stat-view-servlet:
enabled: true
dynamic:
primary: 'master'
p6spy: false
# 配置Druid全局默认值
druid:
initial-size: 5
max-active: 8
min-idle: 3
max-wait: 1000
validation-query: 'select 1'
datasource:
master:
username: root
password: "******"
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
slave_1:
username: root
password: "******"
url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
slave_2:
username: root
password: "******"
url: jdbc:mysql://localhost:3306/test3?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${file.uploadFolder}
步骤三:在实现层对方法进行 @DS(“slave”) 指向 , ds可以指向组名,也可以是具体名称
到此已配置完成可以测试了!!!