ShardingSphere 讀寫分離-代碼零入侵

前言

上文我們介紹Sharding-JDBC  分庫分表(ShardingSphere 數據分片 ||鏈接:https://blog.csdn.net/weixin_38003389/article/details/90518112),我是用的是 java的配置方式,缺點就是有代碼入侵性,其實我也完全可以用配置實現的。本文就給大家介紹一下 Sharding-JDBC 基於 配置進行讀寫分離。

 

正文

 

開始之前我們有兩項很重要的準備工作

 

第一項是在兩臺網絡互通的 Centos7服務器安裝mysql 5.7,請點我寫好的安裝步驟:https://blog.csdn.net/weixin_38003389/article/details/90696337

第二項是把這兩臺 mysql 配置成主從,請點我寫好的配置步驟:

https://blog.csdn.net/weixin_38003389/article/details/90717879

 

以上工作都做好了之後我們來看一下怎麼用 sharding-jdbc 配置來實現讀寫分離的。

創建一個maven 工程,pom文件如下

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>sharding-master-slave</groupId>
    <artifactId>sharding-master-slave</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-sharding-table</name>
    <description>基於 Spring Boot 2.1.5 使用sharding-sphere + JdbcTemplate 實現讀寫分離</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>

 

核心配置類

 

# 配置真實數據源
sharding.jdbc.datasource.names=master,slave
#主數據庫
sharding.jdbc.datasource.master.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.master.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.master.jdbc-url=jdbc:mysql://10.8.18.73:3306/master?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

sharding.jdbc.datasource.master.username=root
sharding.jdbc.datasource.master.password=123456

# 從數據庫
sharding.jdbc.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.slave.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.slave.jdbc-url=jdbc:mysql://10.8.18.74:3306/master?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true


sharding.jdbc.datasource.slave.username=root
sharding.jdbc.datasource.slave.password=123456

# 配置讀寫分離
# 配置從庫選擇策略,提供輪詢與隨機,這裏選擇用輪詢
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=master
sharding.jdbc.config.masterslave.slave-data-source-names=slave

# 開啓SQL顯示,默認值: false,注意:僅配置讀寫分離時不會打印日誌
sharding.jdbc.config.props.sql.show=true
spring.main.allow-bean-definition-overriding=true

 

 

測試

 

下面的類均是爲了測試讀寫分離寫的

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}


@RestController
public class OrderController {
    @Autowired
    private OrderDao orderDao;

    @RequestMapping(path = "/createOrder/{userId}/{orderId}", method = {RequestMethod.GET})
    public String createOrder(@PathVariable("userId") Integer userId, @PathVariable("orderId") Integer orderId) {
        Order order = new Order();
        order.setOrderId(orderId);
        order.setUserId(userId);
        orderDao.createOrder(order);
        return "success";
    }

    @RequestMapping(path = "/{userId}", method = {RequestMethod.GET})
    public List<Order> getOrderListByUserId(@PathVariable("userId") Integer userId) {
        return orderDao.getOrderListByUserId(userId);
    }

    @RequestMapping(path = "/", method = {RequestMethod.GET})
    public List<Order> getOrderListByUserId() {
        return orderDao.getOrderList();
    }
}




public interface OrderDao {
    List<Order> getOrderListByUserId(Integer userId);

    List<Order> getOrderList();

    void createOrder(Order order);
}




@Service
public class OrderDaoImpl implements OrderDao {
    @Autowired
    JdbcTemplate jdbcTemplate;


    @Override
    public List<Order> getOrderListByUserId(Integer userId) {
//        StringBuilder sqlBuilder = new StringBuilder();
//        sqlBuilder
//                .append("select order_id, user_id from order where user_id=? ");
//        return jdbcTemplate.query(sqlBuilder.toString(), new Object[]{userId},
//                new int[]{Types.INTEGER}, new BeanPropertyRowMapper<Order>(
//                        Order.class));
        return null;

    }

    @Override
    public List<Order> getOrderList() {
        String sql = "select order_id, user_id from order_0 ";

        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<Order>(
                Order.class));
    }

    @Override
    public void createOrder(Order order) {
        StringBuffer sb = new StringBuffer();
        sb.append("insert into order_0(user_id, order_id)");
        sb.append("values(");
        sb.append(order.getUserId()).append(",");
        sb.append(order.getOrderId());
        sb.append(")");
        jdbcTemplate.update(sb.toString());
    }
}

 

 

下面我們啓動項目進行數據的增加和查詢就可以了,觀察控制檯的打印信息,即我增加的時候數據源連接 master,我查詢的時候數據源連接slave,讀寫分離成功。

 

 

 

在這個過程還碰到了很多坑,大多是在mysql配置問題,

首先拿到 root 是必須的,如果項目啓動報錯信息是與服務器連接超時時,我給定以下解決思路

  • 本地與服務器網絡是否通
  • 防火牆是否關閉
  • mysql 連接賬號是否允許外置連接

github 地址:https://github.com/362460453/sharding-master-slave

如果你們碰到其他的問題可以自行百度或加我微信   。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章