ibcadmin 发表于 2019-10-12 10:22:35

分库分表(3) ---SpringBoot + ShardingSphere 实现读写分离

<h1 id="分库分表3---shardingsphere实现读写分离"><center>分库分表(3)---ShardingSphere实现读写分离 </center></h1>
<p>有关ShardingSphere概念前面写了两篇博客:</p>
<p>1、分库分表(1) --- 理论</p>
<p>2、 分库分表(2) --- ShardingSphere(理论)</p>
<p>下面就这个项目做个团体简单介绍,并在文章最下方附上项目<code>Github地址</code>。</p>
<h2 id="一项目概述"><font color=#FFD700> 一、项目概述 </font></h2>
<h4 id="技能架构">1、技能架构</h4>
<p>项目总体技能选型</p>
<code>SpringBoot2.0.6 + shardingsphere4.0.0-RC1 + Maven3.5.4+ MySQL + lombok(插件)</code>
<h4 id="项目阐明">2、项目阐明</h4>
<p><code>场景</code> 如果实际项目中Mysql是 <strong>Master-Slave</strong> (主从)摆设的,那么数据生存到Master库,Master库数据同步数据到Slave库,数据读取到Slave库,</p>
<p>如许可以减缓数据库的压力。</p>
<h4 id="数据库设计">3、数据库设计</h4>
<p>我们这个项目中Mysql服务器并没有实现主从摆设,而是同一个服务器创建两个库,一个当做Master库,一个当做Slave库。所以这里是不能实现的功能就是Master库</p>
<p>新增数据自动同步到Slave库。如许也更有利于我们测试看结果。</p>
<p><code>Master库</code></p>
<p><div align="center"></div></p>
<p><code>Slave库</code></p>
<p><div align="center"></div></p>
<p>从两幅图中可以看出,我这里在同一个服务器建两个数据库来模仿主从数据库。为了方便看测试结果,这里<code>主从数据库中的数据是不一样的</code>。</p>
<p><br></p>
<h2 id="二焦点代码"><font color=#FFD700>二、焦点代码 </font></h2>
<p><code>阐明</code> 完整的代码会放到GitHub上,这里只放一些焦点代码。</p>
<h4 id="pom.xml">1、pom.xml</h4>
<code>    <properties>
      <java.version>1.8</java.version>
      <mybatis-spring-boot>2.0.1</mybatis-spring-boot>
      <druid>1.1.16</druid>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot}</version>
      </dependency>
      <!--mybatis驱动-->
      <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
      </dependency>
      <!--druid数据源-->
      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid}</version>
      </dependency>
      <!--shardingsphere最新版本-->
      <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
      </dependency>
      <!--lombok实体工具-->
      <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
      </dependency>
    </dependencies></code>
<h4 id="application.properties">2、application.properties</h4>
<code>server.port=8088
#指定mybatis信息
mybatis.config-location=classpath:mybatis-config.xml

spring.shardingsphere.datasource.names=master,slave0
# 数据源 主库
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/master?characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456
# 数据源 从库
spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://localhost:3306/slave?characterEncoding=utf-8
spring.shardingsphere.datasource.slave0.username=root
spring.shardingsphere.datasource.slave0.password=123456

# 读写分离
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
spring.shardingsphere.masterslave.name=ms
spring.shardingsphere.masterslave.master-data-source-name=master
spring.shardingsphere.masterslave.slave-data-source-names=slave0
#打印sql
spring.shardingsphere.props.sql.show=true
</code>
<p>Sharding-JDBC可以通过<code>Java</code>,<code>YAML</code>,<code>Spring定名空间</code>和<code>Spring Boot Starter</code>四种方式设置,开发者可根据场景选择适合的设置方式。详细可以看官网。</p>
<h4 id="usercontroller">3、UserController</h4>
<code>@RestController
public class UserController {

    @Autowired
    private UserService userService;
    /**
   * @Description: 生存用户
   */
    @PostMapping("save-user")
    public Object saveUser() {
      return userService.saveOne(new User("小小", "女", 3));
    }
    /**
   * @Description: 获取用户列表
   */
    @GetMapping("list-user")
    public Object listUser() {
      return userService.list();
    }
}</code>
<p><br></p>
<h2 id="三测试验证"><font color=#FFD700>三、测试验证 </font></h2>
<h4 id="读数据">1、读数据</h4>
<p><div align="center"></div></p>
<p>我们可以发现读取的数据是Slave库的数据。我们再来看控制台打印的SQL。可以看到读操作是Slave库。</p>
<p><div align="center"></div></p>
<h4 id="写数据">2、写数据</h4>
<p><code>哀求</code></p>
<code>localhost:8088/save-user?name=小小&sex=女&age=3</code>
<p><strong>查看Mater数据库</strong></p>
<p><div align="center"></div></p>
<p>发现Master数据库已经多了一条数据了,再看控制台打印的SQL。</p>
<p><div align="center"></div></p>
<p>这个时间如果去看Slave库的话这条新增的数据是没有的,由于没有同步已往。</p>
<p><code>Github地址</code>:https://github.com/yudiandemingzi/spring-boot-sharding-sphere<br />
<br></p>
<h3 id="参考"><font color=#FFD700> 参考</font></h3>
<p>1、ShardingSphere中文文档</p>
<p>2、ShardingSphere官网</p>
<p>3、Shardingsphere Github库<br />
<br><br />
<br></p>
<code> 我信赖,无论今后的门路多么崎岖,只要捉住本日,迟早会在奋斗中尝到人生的甘甜。捉住人生中的一分一秒,胜过虚度中的一月一年!(18)</code>
<p><br></p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/qdhxhz/p/11656205.html" target="_blank">https://www.cnblogs.com/qdhxhz/p/11656205.html</a>
页: [1]
查看完整版本: 分库分表(3) ---SpringBoot + ShardingSphere 实现读写分离