You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/06/10 11:00:09 UTC

[shardingsphere] branch master updated: Revert "Refactor database rule config refresh logic (#26252)" (#26253)

This is an automated email from the ASF dual-hosted git repository.

zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new b0596f8a776 Revert "Refactor database rule config refresh logic (#26252)" (#26253)
b0596f8a776 is described below

commit b0596f8a77699910ca95396a9bf7b874d92902ce
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Sat Jun 10 19:00:01 2023 +0800

    Revert "Refactor database rule config refresh logic (#26252)" (#26253)
    
    This reverts commit b5b9451962b07f9efff8ed93b66f2117c8ae6bff.
---
 ...riteSplittingRuleConfigurationEventBuilder.java |  45 ++++++++-
 .../AddReadwriteSplittingConfigurationEvent.java}  |  10 +-
 ...AlterReadwriteSplittingConfigurationEvent.java} |  12 ++-
 ...eleteReadwriteSplittingConfigurationEvent.java} |   8 +-
 .../AddLoadBalanceEvent.java}                      |  12 ++-
 .../AlterLoadBalanceEvent.java}                    |  12 ++-
 .../DeleteLoadBalanceEvent.java}                   |   8 +-
 .../ReadwriteSplittingConfigurationSubscriber.java |  65 +++++++++++--
 .../ReadwriteSplittingLoadBalanceSubscriber.java   | 101 +++++++++++++++++++++
 ...nfra.rule.RuleConfigurationSubscribeCoordinator |   1 +
 10 files changed, 246 insertions(+), 28 deletions(-)

diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java
index 0b13737ca88..df689860622 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationEventBuilder.java
@@ -18,10 +18,19 @@
 package org.apache.shardingsphere.readwritesplitting.event;
 
 import com.google.common.base.Strings;
-
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
 import org.apache.shardingsphere.mode.event.config.RuleConfigurationEventBuilder;
+import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.event.config.AddReadwriteSplittingConfigurationEvent;
+import org.apache.shardingsphere.readwritesplitting.event.config.AlterReadwriteSplittingConfigurationEvent;
+import org.apache.shardingsphere.readwritesplitting.event.config.DeleteReadwriteSplittingConfigurationEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AddLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AlterLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.DeleteLoadBalanceEvent;
 import org.apache.shardingsphere.readwritesplitting.metadata.converter.ReadwriteSplittingNodeConverter;
 
 import java.util.Optional;
@@ -36,6 +45,38 @@ public final class ReadwriteSplittingRuleConfigurationEventBuilder implements Ru
         if (!ReadwriteSplittingNodeConverter.isReadwriteSplittingPath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        return Optional.of(new ReadwriteSplittingRuleConfigurationChangedEvent(databaseName));
+        Optional<String> groupName = ReadwriteSplittingNodeConverter.getGroupName(event.getKey());
+        if (groupName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
+            return createReadwriteSplittingConfigEvent(databaseName, groupName.get(), event);
+        }
+        Optional<String> loadBalancerName = ReadwriteSplittingNodeConverter.getLoadBalancerName(event.getKey());
+        if (loadBalancerName.isPresent() && !Strings.isNullOrEmpty(event.getValue())) {
+            return createLoadBalanceEvent(databaseName, loadBalancerName.get(), event);
+        }
+        return Optional.empty();
+    }
+    
+    private Optional<GovernanceEvent> createReadwriteSplittingConfigEvent(final String databaseName, final String groupName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return Optional.of(new AddReadwriteSplittingConfigurationEvent<>(databaseName,
+                    YamlEngine.unmarshal(event.getValue(), ReadwriteSplittingDataSourceRuleConfiguration.class)));
+        }
+        if (Type.UPDATED == event.getType()) {
+            return Optional.of(new AlterReadwriteSplittingConfigurationEvent<>(databaseName, groupName,
+                    YamlEngine.unmarshal(event.getValue(), ReadwriteSplittingDataSourceRuleConfiguration.class)));
+        }
+        return Optional.of(new DeleteReadwriteSplittingConfigurationEvent(databaseName, groupName));
+    }
+    
+    private Optional<GovernanceEvent> createLoadBalanceEvent(final String databaseName, final String loadBalanceName, final DataChangedEvent event) {
+        if (Type.ADDED == event.getType()) {
+            return Optional.of(new AddLoadBalanceEvent<>(databaseName, loadBalanceName,
+                    YamlEngine.unmarshal(event.getValue(), AlgorithmConfiguration.class)));
+        }
+        if (Type.UPDATED == event.getType()) {
+            return Optional.of(new AlterLoadBalanceEvent<>(databaseName, loadBalanceName,
+                    YamlEngine.unmarshal(event.getValue(), AlgorithmConfiguration.class)));
+        }
+        return Optional.of(new DeleteLoadBalanceEvent(databaseName, loadBalanceName));
     }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/AddReadwriteSplittingConfigurationEvent.java
similarity index 77%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/AddReadwriteSplittingConfigurationEvent.java
index ed8914d07c2..92dfa6010a6 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/AddReadwriteSplittingConfigurationEvent.java
@@ -15,18 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event;
+package org.apache.shardingsphere.readwritesplitting.event.config;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Readwrite-splitting rule configuration changed event.
+ * Add readwrite-splitting configuration event.
+ *
+ * @param <T> readwrite-splitting configuration
  */
 @RequiredArgsConstructor
 @Getter
-public final class ReadwriteSplittingRuleConfigurationChangedEvent implements GovernanceEvent {
+public final class AddReadwriteSplittingConfigurationEvent<T> implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final T config;
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/AlterReadwriteSplittingConfigurationEvent.java
similarity index 75%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/AlterReadwriteSplittingConfigurationEvent.java
index ed8914d07c2..71f4eae8242 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/AlterReadwriteSplittingConfigurationEvent.java
@@ -15,18 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event;
+package org.apache.shardingsphere.readwritesplitting.event.config;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Readwrite-splitting rule configuration changed event.
+ * Alter readwrite-splitting configuration event.
+ *
+ * @param <T> readwrite-splitting configuration
  */
 @RequiredArgsConstructor
 @Getter
-public final class ReadwriteSplittingRuleConfigurationChangedEvent implements GovernanceEvent {
+public final class AlterReadwriteSplittingConfigurationEvent<T> implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final String groupName;
+    
+    private final T config;
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/DeleteReadwriteSplittingConfigurationEvent.java
similarity index 80%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/DeleteReadwriteSplittingConfigurationEvent.java
index ed8914d07c2..02ef1fe1e19 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/config/DeleteReadwriteSplittingConfigurationEvent.java
@@ -15,18 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event;
+package org.apache.shardingsphere.readwritesplitting.event.config;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Readwrite-splitting rule configuration changed event.
+ * Delete readwrite-splitting configuration event.
  */
 @RequiredArgsConstructor
 @Getter
-public final class ReadwriteSplittingRuleConfigurationChangedEvent implements GovernanceEvent {
+public final class DeleteReadwriteSplittingConfigurationEvent implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final String groupName;
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AddLoadBalanceEvent.java
similarity index 77%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AddLoadBalanceEvent.java
index ed8914d07c2..3f7e7dc2977 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AddLoadBalanceEvent.java
@@ -15,18 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event;
+package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Readwrite-splitting rule configuration changed event.
+ * Add load-balance event.
+ *
+ * @param <T> algorithm configuration
  */
 @RequiredArgsConstructor
 @Getter
-public final class ReadwriteSplittingRuleConfigurationChangedEvent implements GovernanceEvent {
+public final class AddLoadBalanceEvent<T> implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final String loadBalanceName;
+    
+    private final T config;
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
similarity index 77%
copy from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
copy to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
index ed8914d07c2..16520928fc5 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/AlterLoadBalanceEvent.java
@@ -15,18 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event;
+package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Readwrite-splitting rule configuration changed event.
+ * Alter load-balance event.
+ *
+ * @param <T> algorithm configuration
  */
 @RequiredArgsConstructor
 @Getter
-public final class ReadwriteSplittingRuleConfigurationChangedEvent implements GovernanceEvent {
+public final class AlterLoadBalanceEvent<T> implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final String loadBalanceName;
+    
+    private final T config;
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
similarity index 82%
rename from features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
rename to features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
index ed8914d07c2..99397c8b4f0 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/ReadwriteSplittingRuleConfigurationChangedEvent.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/event/loadbalance/DeleteLoadBalanceEvent.java
@@ -15,18 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.event;
+package org.apache.shardingsphere.readwritesplitting.event.loadbalance;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 
 /**
- * Readwrite-splitting rule configuration changed event.
+ * Delete load-balance event.
  */
 @RequiredArgsConstructor
 @Getter
-public final class ReadwriteSplittingRuleConfigurationChangedEvent implements GovernanceEvent {
+public final class DeleteLoadBalanceEvent implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final String loadBalanceName;
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingConfigurationSubscriber.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingConfigurationSubscriber.java
index d1fb5234aa2..5b3de785325 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingConfigurationSubscriber.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingConfigurationSubscriber.java
@@ -19,15 +19,23 @@ package org.apache.shardingsphere.readwritesplitting.subscriber;
 
 import com.google.common.eventbus.Subscribe;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator;
 import org.apache.shardingsphere.mode.event.config.RuleConfigurationChangedEvent;
-import org.apache.shardingsphere.readwritesplitting.event.ReadwriteSplittingRuleConfigurationChangedEvent;
+import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.event.config.AddReadwriteSplittingConfigurationEvent;
+import org.apache.shardingsphere.readwritesplitting.event.config.AlterReadwriteSplittingConfigurationEvent;
+import org.apache.shardingsphere.readwritesplitting.event.config.DeleteReadwriteSplittingConfigurationEvent;
 import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Optional;
 import java.util.Map;
+import java.util.LinkedList;
 
 /**
  * Readwrite-splitting configuration subscriber.
@@ -48,17 +56,58 @@ public final class ReadwriteSplittingConfigurationSubscriber implements RuleConf
     }
     
     /**
-     * Renew readwrite-splitting configuration.
+     * Renew with add readwrite-splitting configuration.
      *
-     * @param event readwrite-splitting configuration changed event
+     * @param event add readwrite-splitting configuration event
      */
     @Subscribe
-    public synchronized void renew(final ReadwriteSplittingRuleConfigurationChangedEvent event) {
+    public synchronized void renew(final AddReadwriteSplittingConfigurationEvent<ReadwriteSplittingDataSourceRuleConfiguration> event) {
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
-        Optional<ReadwriteSplittingRule> readwriteSplittingRule = database.getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
-        if (!readwriteSplittingRule.isPresent()) {
-            return;
+        ReadwriteSplittingDataSourceRuleConfiguration needToAddedConfig = event.getConfig();
+        Collection<RuleConfiguration> ruleConfigs = new LinkedList<>(database.getRuleMetaData().getConfigurations());
+        Optional<ReadwriteSplittingRule> rule = database.getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
+        ReadwriteSplittingRuleConfiguration config;
+        if (rule.isPresent()) {
+            config = (ReadwriteSplittingRuleConfiguration) rule.get().getConfiguration();
+            config.getDataSources().add(needToAddedConfig);
+        } else {
+            config = new ReadwriteSplittingRuleConfiguration(Collections.singletonList(needToAddedConfig), Collections.emptyMap());
         }
-        instanceContext.getEventBusContext().post(new RuleConfigurationChangedEvent(event.getDatabaseName(), readwriteSplittingRule.get().getConfiguration()));
+        ruleConfigs.add(config);
+        database.getRuleMetaData().getConfigurations().addAll(ruleConfigs);
+        instanceContext.getEventBusContext().post(new RuleConfigurationChangedEvent(event.getDatabaseName(), config));
+    }
+    
+    /**
+     * Renew with alter readwrite-splitting configuration.
+     *
+     * @param event alter readwrite-splitting configuration event
+     */
+    @Subscribe
+    public synchronized void renew(final AlterReadwriteSplittingConfigurationEvent<ReadwriteSplittingDataSourceRuleConfiguration> event) {
+        ShardingSphereDatabase database = databases.get(event.getDatabaseName());
+        ReadwriteSplittingDataSourceRuleConfiguration needToAlteredConfig = event.getConfig();
+        Collection<RuleConfiguration> ruleConfigs = new LinkedList<>(database.getRuleMetaData().getConfigurations());
+        ReadwriteSplittingRuleConfiguration config = (ReadwriteSplittingRuleConfiguration) database.getRuleMetaData().getSingleRule(ReadwriteSplittingRule.class).getConfiguration();
+        config.getDataSources().removeIf(each -> each.getName().equals(event.getGroupName()));
+        ruleConfigs.add(new ReadwriteSplittingRuleConfiguration(Collections.singletonList(needToAlteredConfig), Collections.emptyMap()));
+        database.getRuleMetaData().getConfigurations().addAll(ruleConfigs);
+        instanceContext.getEventBusContext().post(new RuleConfigurationChangedEvent(event.getDatabaseName(), config));
+    }
+    
+    /**
+     * Renew with delete readwrite-splitting configuration.
+     *
+     * @param event delete readwrite-splitting configuration event
+     */
+    @Subscribe
+    public synchronized void renew(final DeleteReadwriteSplittingConfigurationEvent event) {
+        ShardingSphereDatabase database = databases.get(event.getDatabaseName());
+        Collection<RuleConfiguration> ruleConfigs = new LinkedList<>(database.getRuleMetaData().getConfigurations());
+        ReadwriteSplittingRuleConfiguration config = (ReadwriteSplittingRuleConfiguration) database.getRuleMetaData().getSingleRule(ReadwriteSplittingRule.class).getConfiguration();
+        config.getDataSources().removeIf(each -> each.getName().equals(event.getGroupName()));
+        ruleConfigs.add(config);
+        database.getRuleMetaData().getConfigurations().addAll(ruleConfigs);
+        instanceContext.getEventBusContext().post(new RuleConfigurationChangedEvent(event.getDatabaseName(), config));
     }
 }
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java
new file mode 100644
index 00000000000..c17bfab355f
--- /dev/null
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/subscriber/ReadwriteSplittingLoadBalanceSubscriber.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.readwritesplitting.subscriber;
+
+import com.google.common.eventbus.Subscribe;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.instance.InstanceContext;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator;
+import org.apache.shardingsphere.mode.event.config.RuleConfigurationChangedEvent;
+import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AddLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.AlterLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.event.loadbalance.DeleteLoadBalanceEvent;
+import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
+
+import java.util.Map;
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * Readwrite-splitting load-balance subscriber.
+ */
+@SuppressWarnings("UnstableApiUsage")
+@RequiredArgsConstructor
+public final class ReadwriteSplittingLoadBalanceSubscriber implements RuleConfigurationSubscribeCoordinator {
+    
+    private Map<String, ShardingSphereDatabase> databases;
+    
+    private InstanceContext instanceContext;
+    
+    @Override
+    public void registerRuleConfigurationSubscriber(final Map<String, ShardingSphereDatabase> databases, final InstanceContext instanceContext) {
+        this.databases = databases;
+        this.instanceContext = instanceContext;
+        instanceContext.getEventBusContext().register(this);
+    }
+    
+    /**
+     * Renew with add load-balance.
+     *
+     * @param event add load-balance event
+     */
+    @Subscribe
+    public synchronized void renew(final AddLoadBalanceEvent<AlgorithmConfiguration> event) {
+        renew(event.getDatabaseName(), event.getLoadBalanceName(), event.getConfig());
+    }
+    
+    /**
+     * Renew with alter load-balance.
+     *
+     * @param event alter load-balance event
+     */
+    @Subscribe
+    public synchronized void renew(final AlterLoadBalanceEvent<AlgorithmConfiguration> event) {
+        renew(event.getDatabaseName(), event.getLoadBalanceName(), event.getConfig());
+    }
+    
+    private void renew(final String databaseName, final String loadBalanceName, final AlgorithmConfiguration algorithmConfig) {
+        ShardingSphereDatabase database = databases.get(databaseName);
+        Collection<RuleConfiguration> ruleConfigs = new LinkedList<>(database.getRuleMetaData().getConfigurations());
+        ReadwriteSplittingRuleConfiguration config = (ReadwriteSplittingRuleConfiguration) database.getRuleMetaData().getSingleRule(ReadwriteSplittingRule.class).getConfiguration();
+        config.getLoadBalancers().put(loadBalanceName, algorithmConfig);
+        ruleConfigs.add(config);
+        database.getRuleMetaData().getConfigurations().addAll(ruleConfigs);
+        instanceContext.getEventBusContext().post(new RuleConfigurationChangedEvent(databaseName, config));
+    }
+    
+    /**
+     * Renew with delete load-balance.
+     *
+     * @param event delete load-balance event
+     */
+    @Subscribe
+    public synchronized void renew(final DeleteLoadBalanceEvent event) {
+        ShardingSphereDatabase database = databases.get(event.getDatabaseName());
+        Collection<RuleConfiguration> ruleConfigs = new LinkedList<>(database.getRuleMetaData().getConfigurations());
+        ReadwriteSplittingRuleConfiguration config = (ReadwriteSplittingRuleConfiguration) database.getRuleMetaData().getSingleRule(ReadwriteSplittingRule.class).getConfiguration();
+        config.getLoadBalancers().remove(event.getLoadBalanceName());
+        ruleConfigs.add(config);
+        database.getRuleMetaData().getConfigurations().addAll(ruleConfigs);
+        instanceContext.getEventBusContext().post(new RuleConfigurationChangedEvent(event.getDatabaseName(), config));
+    }
+}
diff --git a/features/readwrite-splitting/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator b/features/readwrite-splitting/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator
index 78fba8cec1a..9e8adc24813 100644
--- a/features/readwrite-splitting/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator
+++ b/features/readwrite-splitting/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator
@@ -16,3 +16,4 @@
 #
 
 org.apache.shardingsphere.readwritesplitting.subscriber.ReadwriteSplittingConfigurationSubscriber
+org.apache.shardingsphere.readwritesplitting.subscriber.ReadwriteSplittingLoadBalanceSubscriber