混合规则

背景信息

ShardingSphere 涵盖了很多功能,例如,分库分片、读写分离、高可用、数据加密等。这些功能用户可以单独进行使用,也可以配合一起使用,下面是基于 JAVA API 的配置示例。

配置示例

  1. // 分片配置
  2. private ShardingRuleConfiguration createShardingRuleConfiguration() {
  3. ShardingRuleConfiguration result = new ShardingRuleConfiguration();
  4. result.getTables().add(getOrderTableRuleConfiguration());
  5. result.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("user_id", "inline"));
  6. result.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "standard_test_tbl"));
  7. Properties props = new Properties();
  8. props.setProperty("algorithm-expression", "demo_ds_${user_id % 2}");
  9. result.getShardingAlgorithms().put("inline", new AlgorithmConfiguration("INLINE", props));
  10. result.getShardingAlgorithms().put("standard_test_tbl", new AlgorithmConfiguration("STANDARD_TEST_TBL", new Properties()));
  11. result.getKeyGenerators().put("snowflake", new AlgorithmConfiguration("SNOWFLAKE", new Properties()));
  12. return result;
  13. }
  14. private ShardingTableRuleConfiguration getOrderTableRuleConfiguration() {
  15. ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_order", "demo_ds_${0..1}.t_order_${[0, 1]}");
  16. result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake"));
  17. return result;
  18. }
  19. // 动态读写分离配置
  20. private static ReadwriteSplittingRuleConfiguration createReadwriteSplittingConfiguration() {
  21. ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfiguration1 = new ReadwriteSplittingDataSourceRuleConfiguration("replica_ds_0", new DynamicReadwriteSplittingStrategyConfiguration("readwrite_ds_0", true), "");
  22. ReadwriteSplittingDataSourceRuleConfiguration dataSourceConfiguration2 = new ReadwriteSplittingDataSourceRuleConfiguration("replica_ds_1", new DynamicReadwriteSplittingStrategyConfiguration("readwrite_ds_1", true), "");
  23. Collection<ReadwriteSplittingDataSourceRuleConfiguration> dataSources = new LinkedList<>();
  24. dataSources.add(dataSourceRuleConfiguration1);
  25. dataSources.add(dataSourceRuleConfiguration2);
  26. return new ReadwriteSplittingRuleConfiguration(dataSources, Collections.emptyMap());
  27. }
  28. // 数据库发现配置
  29. private static DatabaseDiscoveryRuleConfiguration createDatabaseDiscoveryConfiguration() {
  30. DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfiguration1 = new DatabaseDiscoveryDataSourceRuleConfiguration("readwrite_ds_0", Arrays.asList("ds_0, ds_1, ds_2"), "mgr-heartbeat", "mgr");
  31. DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfiguration2 = new DatabaseDiscoveryDataSourceRuleConfiguration("readwrite_ds_1", Arrays.asList("ds_3, ds_4, ds_5"), "mgr-heartbeat", "mgr");
  32. Collection<DatabaseDiscoveryDataSourceRuleConfiguration> dataSources = new LinkedList<>();
  33. dataSources.add(dataSourceRuleConfiguration1);
  34. dataSources.add(dataSourceRuleConfiguration2);
  35. return new DatabaseDiscoveryRuleConfiguration(configs, createDiscoveryHeartbeats(), createDiscoveryTypes());
  36. }
  37. private static DatabaseDiscoveryRuleConfiguration createDatabaseDiscoveryConfiguration() {
  38. DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfiguration = new DatabaseDiscoveryDataSourceRuleConfiguration("readwrite_ds_1", Arrays.asList("ds_3, ds_4, ds_5"), "mgr-heartbeat", "mgr");
  39. return new DatabaseDiscoveryRuleConfiguration(Collections.singleton(dataSourceRuleConfiguration), createDiscoveryHeartbeats(), createDiscoveryTypes());
  40. }
  41. private static Map<String, AlgorithmConfiguration> createDiscoveryTypes() {
  42. Map<String, AlgorithmConfiguration> result = new HashMap<>(1 1);
  43. Properties props = new Properties();
  44. props.put("group-name", "558edd3c-02ec-11ea-9bb3-080027e39bd2");
  45. discoveryTypes.put("mgr", new AlgorithmConfiguration("MGR", props));
  46. return result;
  47. }
  48. private static Map<String, DatabaseDiscoveryHeartBeatConfiguration> createDiscoveryHeartbeats() {
  49. Map<String, DatabaseDiscoveryHeartBeatConfiguration> result = new HashMap<>(1 1);
  50. Properties props = new Properties();
  51. props.put("keep-alive-cron", "0/5 * * * * ?");
  52. discoveryHeartBeatConfiguration.put("mgr-heartbeat", new DatabaseDiscoveryHeartBeatConfiguration(props));
  53. return result;
  54. }
  55. // 数据加密配置
  56. public EncryptRuleConfiguration createEncryptRuleConfiguration() {
  57. Properties props = new Properties();
  58. props.setProperty("aes-key-value", "123456");
  59. EncryptColumnRuleConfiguration columnConfigAes = new EncryptColumnRuleConfiguration("username", "username", "", "", "username_plain", "name_encryptor", null);
  60. EncryptColumnRuleConfiguration columnConfigTest = new EncryptColumnRuleConfiguration("pwd", "pwd", "assisted_query_pwd", "like_pwd", "", "pwd_encryptor", null);
  61. EncryptTableRuleConfiguration encryptTableRuleConfig = new EncryptTableRuleConfiguration("t_user", Arrays.asList(columnConfigAes, columnConfigTest), null);
  62. Map<String, AlgorithmConfiguration> encryptAlgorithmConfigs = new LinkedHashMap<>(2, 1);
  63. encryptAlgorithmConfigs.put("name_encryptor", new AlgorithmConfiguration("AES", props));
  64. encryptAlgorithmConfigs.put("pwd_encryptor", new AlgorithmConfiguration("assistedTest", props));
  65. encryptAlgorithmConfigs.put("like_encryptor", new AlgorithmConfiguration("CHAR_DIGEST_LIKE", new Properties()));
  66. EncryptRuleConfiguration result = new EncryptRuleConfiguration(Collections.singleton(encryptTableRuleConfig), encryptAlgorithmConfigs);
  67. return result;
  68. }