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