Spring boot項目集成Sharding Jdbc

環境

jdk:1.8
framework: spring boot, sharding jdbc
database: MySQLhtml

搭建步驟

  1. 在pom 中加入sharding 依賴
<dependency>
    <groupId>io.shardingjdbc</groupId>
    <artifactId>sharding-jdbc-core-spring-boot-starter</artifactId>
    <version>2.0.3</version>
</dependency>
  1. 將原來的 spring DataSource 註釋掉,加入 sharding 的配置
sharding:
  jdbc:
    datasource:
      names: ds_0,ds_1
      ds_0:
           type: com.zaxxer.hikari.HikariDataSource
           driver-class-name: com.mysql.jdbc.Driver
           jdbc-url: jdbc:mysql://sharding0
           username: mams_test
           password: mams_test
      ds_1:
           type: com.zaxxer.hikari.HikariDataSource
           driver-class-name: com.mysql.jdbc.Driver
           jdbc-url: jdbc:mysql://sharding1
           username: mams_test
           password: mams_test
    config:
      sharding:
        default-data-source-name: ds_0
        tables:
            task:
                actual-data-nodes: ds_${0..1}.task
                database-strategy:
                    inline:
                        sharding-column: id
                        algorithm-expression: ds_${id % 2}
                key-generator-column-name: id
            reverse_display:
                actual-data-nodes: ds_${0..1}.reverse_display
                database-strategy:
                    inline:
                        sharding-column: task_id
                        algorithm-expression: ds_${task_id % 2}
                key-generator-column-name: id
        props:
            sql.show: true

注:
這個配置只是針對分庫,sharding jdbc 還支持讀寫分離,主從等模式,具體能夠看文檔sharding jdbc configurationjava

faq

  1. 只有網友的分享例子,沒有文檔

sharding jdbc 的連接 shardingjdbc.io 訪問是不可用的,在碼雲上找到了一份文檔,地址是sharding-jdbc-docnode

  1. spring boot的 health check 顯示爲down

看了一下 DataSourceHealthIndicator 類的實現,要求 select 1 返回的大小爲 1才認爲數據庫是健康的,可是通過分庫以後,這個list size 應該了是數據庫的數量,因此顯示數據庫爲down。mysql

能夠將db 個health check關掉,配置management.health.db.enabled=false 便可。git

不過這種狀況下數據庫若是掛掉的話註冊中心是不知道的,須要定製一個本身的數據庫檢查類github

@Component
public class CustomDataSourceHealthCheck extends AbstractHealthIndicator {
    private JdbcTemplate jdbcTemplate;
    private String databases;
    private int databaseCount;
    private String query = "SELECT 1 ";

    @PostConstruct
    public void init() {
        databaseCount = databases.split(",").length;
    }

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        try {
            List<Map<String, Object>> result = jdbcTemplate.queryForList(query);

            if (result.size() == databaseCount) {
                builder.up();
            } else {
                builder.down();
            }
        } catch (Exception e) {
            builder.down(e);
        }
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    @Autowired
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public String getDatabases() {
        return databases;
    }

    @Value("${sharding.jdbc.datasource.names}")
    public void setDatabases(String databases) {
        this.databases = databases;
    }

    public int getDatabaseCount() {
        return databaseCount;
    }

    public void setDatabaseCount(int databaseCount) {
        this.databaseCount = databaseCount;
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }
}

參考資料

  1. Spring Boot Actuator: Health check, Auditing, Metrics gathering and Monitoring
  2. Spring Boot Actuator Database Health Check
  3. Spring Boot+MyBatis+MySql+Sharding-JDBC實現分庫分表
相關文章
相關標籤/搜索