上篇文章我们搭建了 MySQL 数据库主从复制集群 MySQL 搭建主从复制集群~~~
本篇文章我们利用搭建好的主从复制集群,使用 SpringBoot 结合 Sharding-JDBC 搭建一个小的 登录 Demo,测试实现数据库的读写分离
项目源码地址https://gitee.com/liuwanqing520/login-sharding

一、Sharding-JDBC 是什么?

Apache ShardingSphere 是一款分布式的数据库生态系统(关系型数据库中间件),可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。而ShardingSphere-JDBC 就是它的一个重要产品。

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。其具有如下特点:

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等;
  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库。

Sharding-JDBC 的工作方式如下:

二、SpringBoot 整合 Sharding-JDBC

1. 导入 Sharding-JDBC 依赖

在 pom.xml 文件中,加入如下依赖

<!-- sharding jdbc 依赖 -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version>
</dependency>
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-core-common</artifactId><version>4.0.0-RC1</version>
</dependency>
<!-- 数据源依赖 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.14</version>
</dependency>
<!-- mybatis-plus依赖 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version>
</dependency>

2. 配置主从数据源地址

在 application.yml 配置文件中加入如下数据源配置

# DataSource Config
spring:shardingsphere:# 配置数据源datasource:# 给每个数据源取别名,任意取names: master, slave# 配置主数据源数据库连接信息(只写)master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.244.130:3306/survey?characterEncoding=utf-8&serverTimezone=GMT%2B8username: rootpassword: 5201314love# 配置从数据源数据库连接信息(只读)slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.244.131:3306/survey?characterEncoding=utf-8&serverTimezone=GMT%2B8username: rootpassword: 5201314lovemasterslave:# 配置 slave 节点的负载均衡策略 :轮询机制 (我这里只有一个从数据库,有没有这句没啥用)load-balance-algorithm-type: round_robinname: dataSource# 配置主库 ,负责数据的写入master-data-source-name: master# 配置从库slave-data-source-names: slave# 显示SQL,方便我们查看 SQL 语句在那个数据源中执行props:sql:show: true

3. 编写 User 类

后面我会放完整项目链接,这里大家就当看个热闹

@Data
public class User implements Serializable {private Long id;private String username;private String avatar;private String email;private String password;private Integer status;// 用户的权限 —— 0 系统管理员 1 租户 2 普通用户private Integer permission;
}

4. 封装 Result 返回类

@Data
public class Result implements Serializable { //序列化private int code; //200是正常 400表示异常private String msg;private Object data; //返回数据//成功public static Result succ( Object data){return succ(200,"操作成功",data);}//成功public static Result succ(int code,String msg,Object data){Result r = new Result();r.setCode(code);r.setMsg(msg);r.setData(data);return r;}//失败public static Result fail(String msg){return fail(400,msg,null);}//失败public static Result fail(String msg,Object data){return fail(400,msg,data);}//失败public static Result fail(int code,String msg,Object data){Result r = new Result();r.setCode(code);r.setMsg(msg);r.setData(data);return r;}
}

5. 编写 UserController 实现登录注册逻辑

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;// 登录方法@RequestMapping("/login")public Result login(@RequestBody Map<String, String> map) {String name = map.get("username");log.info(name);String password = map.get("password");// 是否存在改用户名的用户User user = userService.getOne(new QueryWrapper<User>().eq("username", name));if (user == null) {return Result.fail("用户名不存在");}if(!user.getPassword().equals(password )){return Result.fail("密码错误");}return Result.succ(user);}// 注册方法@PostMapping("/save")public  Result save(@Validated @RequestBody User user){// 判断是否用户名已经存在User userTemp = userService.getOne(new QueryWrapper<User>().eq("username", user.getUsername()));if (userTemp != null) {return Result.fail("用户名已经存在");}if(user.getUsername() == null || user.getPassword() == null || user.getUsername().length()==0 || user.getPassword().length() == 0){return Result.fail("用户名和密码不能为空");}return userService.save(user) ? Result.succ(user) : Result.succ("新增失败");}
}

6. 启动项目,访问接口,进行测试

  1. 访问登录的 URL,可以看到该操作在 Slave 库中进行,因为我们设置读操作在从库中进行。

  1. 访问注册的 URL,可以看到该操作在 Master 库中进行,因为我们设置写操作在主库中进行。

三、总结与项目源码地址

通过上述步骤我们也可以发现,结合 SpringBoot 实现数据库的读写分离,在业务逻辑代码上并无什么改动,主要是导入好依赖,配置好各数据库访问操作在那个库上执行。下面是完整项目地址 ,供大家下载参考学习使用,在使用过程中如有问题,欢迎评论区和我交流 ~~

源码地址:https://gitee.com/liuwanqing520/login-sharding

注: 这里包括完整前后端的代码,其实如果只是想测试读写分离,只有后端就够了,为了完善一点,我把前端也加上了

【MySQL 读写分离】Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo相关推荐

  1. Spring Boot——基于OkHTTP的GitHub第三方登录DEMO

    基本概念 OkHTTP:HTTP是现代应用程序网络的方式.这就是我们交换数据和媒体的方式.有效地执行HTTP可使您的内容加载更快并节省带宽. OkHttp是默认情况下有效的HTTP客户端: HTTP ...

  2. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置

    java相关:mysql+spring+mybatis实现数据库读写分离的代码配置 发布于 2020-4-4| 复制链接 分享一篇关于关于mysql+spring+mybatis实现数据库读写分离的代 ...

  3. phython在file同时写入两个_喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  4. Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证

    Springboot快速搭建oauth2 内存版身份认证 环境准备 点击[Create New Project]创建一个新的项目 项目环境配置 配置Thymeleaf 搭建oauth2认证,加入两个依 ...

  5. spring boot+iview 前后端分离架构之文件上传的实现(三十一)

    spring boot 与 iview 前后端分离架构之文件上传的实现(三十一) 公众号 文件上传 前端改造 main.js引入配置的全局变量 编写baseImgUpload图片上传组件 baseIm ...

  6. spring boot+iview 前后端分离架构之用户管理的实现(三十)

    spring boot 与 iview 前后端分离架构之用户管理的实现(三十) 公众号 用户管理 相关工具类的实现 User实体改造 UserOrg实体改造 UserRole实体改造 UserRole ...

  7. 第五章 Spring Boot的数据库编程

    若有错,请指出 第二章 搭建Springboot环境,配置视图解析器jsp页面 第三章 全注解下的Spring Ioc 第四章 约定编程-Spring AOP 第五章 Spring Boot的数据库编 ...

  8. hibernate mysql 读写分离_SpringBoot集成Spring Data JPA及读写分离

    JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理Java应用中的关系数据.它包括以下几方面 ...

  9. mysql读写分离java配置方法_springboot配置数据库读写分离

    为什么要做数据库读写分离 大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用 ...

最新文章

  1. C++ 接口(抽象类)的概念
  2. VHD(Virtual Hard Disk)的解析(上篇)——PyVinil的使用
  3. 机房系统(七)——【报表】
  4. 一个托盘程序演示 -闹钟 Alert
  5. 前端学习(1391):多人管理项目11邮箱地址查询信息
  6. 欧姆龙变频器MX2参数_第442期丨【源程序】基于三菱西门子欧姆龙松下PLC实现喷水池控制系统;欧姆龙PLC编程软件更新步骤...
  7. js浏览器页面生命周期
  8. linux gpart 用法,gpart 使用笔记
  9. 关于“工作组管理员”
  10. 计算机视觉基础:图像处理Task01-图像插值算法
  11. NUC1474 Ants【水题】
  12. 复杂纹理复制及纹理叠加效果
  13. [ActiveForm] -- ActiveForm::begin表单用法
  14. python读取手机通讯录_利用python解析手机通讯录
  15. 用Python怎么多赚钱?6种办法用上 让你过上挣钱的好日子
  16. “ 骗 ”分指南——对于蓝桥你不得不知的应试技巧(文末发送礼包)
  17. vue 简单实现上一题下一题问答效果
  18. 微信小程序仿网易云音乐(使用云开发,提供源码)
  19. UVM response_handler和get_response机制
  20. SQLMap的基本使用-靶场墨者学院(DB2数据库)

热门文章

  1. c 语言浮点数向上取整,(转)C/C++ 取整函数ceil(),floor(),向上取整,向下取整...
  2. 项目运行时一直运行的是修改之前的旧代码?可能是浏览器的问题
  3. iOS开发屏幕自动旋转与调整大小
  4. 为什么视频网站的视频链接地址是blob?
  5. 毕业季闲鱼发布租房大数据:700万套房和1800万租客
  6. 方舟php服务器控制,方舟生存进化怎么设置服务器 私人服务器设置方法
  7. 不关闭防火墙 投屏方法
  8. mongo数据同步的三种方案
  9. 服务器硬件的介绍以及分析
  10. 无论 iPhone 还是 Android 手机,散热已成为「最大瓶颈」