jdk:1.8
framework: spring boot, sharding jdbc
database: MySQLhtml
<dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core-spring-boot-starter</artifactId> <version>2.0.3</version> </dependency>
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
sharding jdbc 的連接 shardingjdbc.io 訪問是不可用的,在碼雲上找到了一份文檔,地址是sharding-jdbc-docnode
看了一下 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; } }