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

panjuan 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 1709499  Revert "Rename shardingsphere-primary-replica-replication 
module (#7565)" (#7568)
1709499 is described below

commit 17094993a7885e1d49af40a76f83b34fcf0bde95
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Sep 22 19:41:38 2020 +0800

    Revert "Rename shardingsphere-primary-replica-replication module (#7565)" 
(#7568)
    
    This reverts commit 9a7e4e305e10ddbd805a88420c8e31a40c33f8f1.
---
 shardingsphere-features/pom.xml                    |   2 +-
 .../pom.xml                                        |  10 ++-
 .../shardingsphere-master-slave-api}/pom.xml       |   4 +-
 .../api/config/MasterSlaveRuleConfiguration.java}  |  29 +++---
 .../MasterSlaveDataSourceRuleConfiguration.java}   |  29 +++---
 .../spi/MasterSlaveLoadBalanceAlgorithm.java       |   0
 .../shardingsphere-master-slave-common}/pom.xml    |  15 +++-
 .../RandomMasterSlaveLoadBalanceAlgorithm.java     |   0
 ...RoundRobinMasterSlaveLoadBalanceAlgorithm.java} |  16 ++--
 ...orithmProvidedMasterSlaveRuleConfiguration.java |   0
 .../masterslave/constant/MasterSlaveOrder.java     |   0
 .../rule/MasterSlaveDataSourceRule.java            |   0
 .../masterslave/rule/MasterSlaveRule.java          |   0
 .../AlgorithmProvidedMasterSlaveRuleBuilder.java   |   0
 .../rule/biulder/MasterSlaveRuleBuilder.java       |   0
 .../config/YamlMasterSlaveRuleConfiguration.java}  |  31 ++++---
 ...YamlMasterSlaveDataSourceRuleConfiguration.java |   0
 ...eAlgorithmProviderConfigurationYamlSwapper.java |   0
 .../MasterSlaveRuleConfigurationYamlSwapper.java}  |  43 +++++----
 ...dingsphere.infra.rule.ShardingSphereRuleBuilder |   0
 ...infra.yaml.swapper.YamlRuleConfigurationSwapper |   0
 ...asterslave.spi.MasterSlaveLoadBalanceAlgorithm} |   3 +-
 .../RandomMasterSlaveLoadBalanceAlgorithmTest.java |   0
 ...dRobinMasterSlaveLoadBalanceAlgorithmTest.java} |  13 +--
 .../rule/MasterSlaveDataSourceRuleTest.java        |   0
 .../masterslave/rule/MasterSlaveRuleTest.java      | 100 +++++++++++++++++++++
 ...lgorithmProvidedMasterSlaveRuleBuilderTest.java |   0
 .../rule/biulder/MasterSlaveRuleBuilderTest.java}  |   6 +-
 ...orithmProviderConfigurationYamlSwapperTest.java |   0
 ...asterSlaveRuleConfigurationYamlSwapperTest.java |   0
 ...onsForYamlMasterSlaveRuleConfigurationTest.java |  82 +++++++++++++++++
 .../src/test/resources/logback-test.xml            |   0
 .../src/test/resources/yaml/master-slave-rule.yaml |   0
 .../shardingsphere-master-slave-route}/pom.xml     |  11 ++-
 .../route/engine/MasterSlaveRouteDecorator.java    |  77 ++++++++++++++++
 .../engine/impl/MasterSlaveDataSourceRouter.java   |   0
 .../route/engine/impl/MasterVisitedManager.java}   |  31 +++++--
 ...dingsphere.infra.route.decorator.RouteDecorator |   0
 .../engine/MasterSlaveRouteDecoratorTest.java      |   0
 .../shardingsphere-master-slave-spring}/pom.xml    |   8 +-
 .../pom.xml                                        |   6 +-
 .../MasterSlaveRuleSpringbootConfiguration.java    |   0
 .../MasterSlaveAlgorithmProvidedBeanRegistry.java  |   0
 .../condition/MasterSlaveSpringBootCondition.java  |  38 ++++++++
 ...YamlMasterSlaveRuleSpringBootConfiguration.java |   0
 .../src/main/resources/META-INF/spring.factories}  |   3 +-
 .../src/main/resources/META-INF/spring.provides    |   2 +-
 .../boot/MasterSlaveSpringBootStarterTest.java     |  65 ++++++++++++++
 .../MasterSlaveSpringBootConditionTest.java        |  60 +++++++++++++
 .../resources/application-masterslave.properties}  |   6 +-
 .../src/test/resources/logback-test.xml            |   0
 .../pom.xml                                        |   6 +-
 ...asterSlaveLoadBalanceAlgorithmFactoryBean.java} |  26 ++----
 .../handler/MasterSlaveNamespaceHandler.java       |  37 ++++++++
 .../MasterSlaveRuleBeanDefinitionParser.java       |   0
 .../tag/LoadBalanceAlgorithmBeanDefinitionTag.java |   0
 .../tag/MasterSlaveRuleBeanDefinitionTag.java      |   0
 .../resources/META-INF/namespace/master-slave.xsd  |   0
 .../src/main/resources/META-INF/spring.handlers}   |   2 +-
 .../src/main/resources/META-INF/spring.schemas     |   0
 .../namespace/MasterSlaveSpringNamespaceTest.java  |  85 ++++++++++++++++++
 .../spring/master-slave-application-context.xml    |   0
 .../src/test/resources/logback-test.xml            |   0
 .../shardingsphere-governance-core-common/pom.xml  |   2 +-
 .../shardingsphere-jdbc-core/pom.xml               |   2 +-
 .../pom.xml                                        |   2 +-
 .../pom.xml                                        |   2 +-
 .../pom.xml                                        |   2 +-
 .../shardingsphere-proxy-backend/pom.xml           |   2 +-
 .../shardingsphere-proxy-common/pom.xml            |   2 +-
 70 files changed, 725 insertions(+), 135 deletions(-)

diff --git a/shardingsphere-features/pom.xml b/shardingsphere-features/pom.xml
index ff60577..8e136be 100644
--- a/shardingsphere-features/pom.xml
+++ b/shardingsphere-features/pom.xml
@@ -31,7 +31,7 @@
     
     <modules>
         <module>shardingsphere-sharding</module>
-        <module>shardingsphere-primary-replica-replication</module>
+        <module>shardingsphere-master-slave</module>
         <module>shardingsphere-encrypt</module>
         <module>shardingsphere-shadow</module>
         <module>shardingsphere-consensus-replication</module>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/pom.xml
 b/shardingsphere-features/shardingsphere-master-slave/pom.xml
similarity index 79%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/pom.xml
copy to shardingsphere-features/shardingsphere-master-slave/pom.xml
index febd4c2..74a8a7c 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/pom.xml
+++ b/shardingsphere-features/shardingsphere-master-slave/pom.xml
@@ -22,15 +22,17 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-primary-replica-replication</artifactId>
+        <artifactId>shardingsphere-features</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    <artifactId>shardingsphere-primary-replica-replication-spring</artifactId>
+    <artifactId>shardingsphere-master-slave</artifactId>
     <name>${project.artifactId}</name>
     <packaging>pom</packaging>
     
     <modules>
-        
<module>shardingsphere-primary-replica-replication-spring-namespace</module>
-        
<module>shardingsphere-primary-replica-replication-spring-boot-starter</module>
+        <module>shardingsphere-master-slave-api</module>
+        <module>shardingsphere-master-slave-common</module>
+        <module>shardingsphere-master-slave-route</module>
+        <module>shardingsphere-master-slave-spring</module>
     </modules>
 </project>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/pom.xml
similarity index 91%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/pom.xml
index 10e5918..f9c19e5 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/pom.xml
@@ -22,10 +22,10 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-primary-replica-replication</artifactId>
+        <artifactId>shardingsphere-master-slave</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    <artifactId>shardingsphere-primary-replica-replication-api</artifactId>
+    <artifactId>shardingsphere-master-slave-api</artifactId>
     <name>${project.artifactId}</name>
     
     <dependencies>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/api/config/MasterSlaveRuleConfiguration.java
similarity index 56%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/api/config/MasterSlaveRuleConfiguration.java
index 8dedecd..13aaf14 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/api/config/MasterSlaveRuleConfiguration.java
@@ -15,24 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.masterslave.spi;
+package org.apache.shardingsphere.masterslave.api.config;
 
-import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithm;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import 
org.apache.shardingsphere.masterslave.api.config.rule.MasterSlaveDataSourceRuleConfiguration;
 
-import java.util.List;
+import java.util.Collection;
+import java.util.Map;
 
 /**
- * Master-slave database load-balance algorithm.
+ * Master-slave rule configuration.
  */
-public interface MasterSlaveLoadBalanceAlgorithm extends 
ShardingSphereAlgorithm {
+@RequiredArgsConstructor
+@Getter
+public final class MasterSlaveRuleConfiguration implements RuleConfiguration {
     
-    /**
-     * Get data source.
-     * 
-     * @param name master-slave logic data source name
-     * @param masterDataSourceName name of master data sources
-     * @param slaveDataSourceNames names of slave data sources
-     * @return name of selected data source
-     */
-    String getDataSource(String name, String masterDataSourceName, 
List<String> slaveDataSourceNames);
+    private final Collection<MasterSlaveDataSourceRuleConfiguration> 
dataSources;
+    
+    private final Map<String, ShardingSphereAlgorithmConfiguration> 
loadBalancers;
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/api/config/rule/MasterSlaveDataSourceRuleConfiguration.java
similarity index 63%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/api/config/rule/MasterSlaveDataSourceRuleConfiguration.java
index 1f56303..32008fd 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/api/config/rule/MasterSlaveDataSourceRuleConfiguration.java
@@ -15,24 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.masterslave.constant;
+package org.apache.shardingsphere.masterslave.api.config.rule;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.List;
 
 /**
- * Master-slave order.
+ * Master-slave data source rule configuration.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class MasterSlaveOrder {
+@RequiredArgsConstructor
+@Getter
+public final class MasterSlaveDataSourceRuleConfiguration {
+    
+    private final String name;
+    
+    private final String masterDataSourceName;
     
-    /**
-     * Master-slave order.
-     */
-    public static final int ORDER = 10;
+    private final List<String> slaveDataSourceNames;
     
-    /**
-     * Algorithm provider master-slave order.
-     */
-    public static final int ALGORITHM_PROVIDER_MASTER_SLAVE_ORDER = 11;
+    private final String loadBalancerName;
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-api/src/main/java/org/apache/shardingsphere/masterslave/spi/MasterSlaveLoadBalanceAlgorithm.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/pom.xml
similarity index 76%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/pom.xml
index 10e5918..3e521d6 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/pom.xml
@@ -22,17 +22,26 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-primary-replica-replication</artifactId>
+        <artifactId>shardingsphere-master-slave</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    <artifactId>shardingsphere-primary-replica-replication-api</artifactId>
+    <artifactId>shardingsphere-master-slave-common</artifactId>
     <name>${project.artifactId}</name>
     
     <dependencies>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>shardingsphere-infra-common</artifactId>
+            <artifactId>shardingsphere-master-slave-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+        
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RoundRobinMasterSlaveLoadBalanceAlgorithm.java
similarity index 65%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RoundRobinMasterSlaveLoadBalanceAlgorithm.java
index 9b94076..6106213 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RoundRobinMasterSlaveLoadBalanceAlgorithm.java
@@ -23,24 +23,30 @@ import 
org.apache.shardingsphere.masterslave.spi.MasterSlaveLoadBalanceAlgorithm
 
 import java.util.List;
 import java.util.Properties;
-import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * Random slave database load-balance algorithm.
+ * Round-robin slave database load-balance algorithm.
  */
 @Getter
 @Setter
-public final class RandomMasterSlaveLoadBalanceAlgorithm implements 
MasterSlaveLoadBalanceAlgorithm {
+public final class RoundRobinMasterSlaveLoadBalanceAlgorithm implements 
MasterSlaveLoadBalanceAlgorithm {
+    
+    private static final ConcurrentHashMap<String, AtomicInteger> COUNTS = new 
ConcurrentHashMap<>();
     
     private Properties props = new Properties();
     
     @Override
     public String getDataSource(final String name, final String 
masterDataSourceName, final List<String> slaveDataSourceNames) {
-        return 
slaveDataSourceNames.get(ThreadLocalRandom.current().nextInt(slaveDataSourceNames.size()));
+        AtomicInteger count = COUNTS.containsKey(name) ? COUNTS.get(name) : 
new AtomicInteger(0);
+        COUNTS.putIfAbsent(name, count);
+        count.compareAndSet(slaveDataSourceNames.size(), 0);
+        return slaveDataSourceNames.get(Math.abs(count.getAndIncrement()) % 
slaveDataSourceNames.size());
     }
     
     @Override
     public String getType() {
-        return "RANDOM";
+        return "ROUND_ROBIN";
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/config/AlgorithmProvidedMasterSlaveRuleConfiguration.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/config/AlgorithmProvidedMasterSlaveRuleConfiguration.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/config/AlgorithmProvidedMasterSlaveRuleConfiguration.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/config/AlgorithmProvidedMasterSlaveRuleConfiguration.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRule.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRule.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRule.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRule.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRule.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRule.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRule.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRule.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilder.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilder.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilder.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilder.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/YamlMasterSlaveRuleConfiguration.java
similarity index 53%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/YamlMasterSlaveRuleConfiguration.java
index f39bc1f..40e0cf8 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/YamlMasterSlaveRuleConfiguration.java
@@ -15,32 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.masterslave.rule.biulder;
+package org.apache.shardingsphere.masterslave.yaml.config;
 
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.infra.yaml.config.YamlRuleConfiguration;
+import 
org.apache.shardingsphere.infra.yaml.config.algorithm.YamlShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.masterslave.api.config.MasterSlaveRuleConfiguration;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRuleBuilder;
-import org.apache.shardingsphere.masterslave.constant.MasterSlaveOrder;
-import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule;
+import 
org.apache.shardingsphere.masterslave.yaml.config.rule.YamlMasterSlaveDataSourceRuleConfiguration;
 
-import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 /**
- * Master-slave rule builder.
+ * Master-slave rule configuration for YAML.
  */
-public final class MasterSlaveRuleBuilder implements 
ShardingSphereRuleBuilder<MasterSlaveRule, MasterSlaveRuleConfiguration> {
+@Getter
+@Setter
+public final class YamlMasterSlaveRuleConfiguration implements 
YamlRuleConfiguration {
     
-    @Override
-    public MasterSlaveRule build(final MasterSlaveRuleConfiguration 
ruleConfiguration, final Collection<String> dataSourceNames) {
-        return new MasterSlaveRule(ruleConfiguration);
-    }
+    private Map<String, YamlMasterSlaveDataSourceRuleConfiguration> 
dataSources = new LinkedHashMap<>();
     
-    @Override
-    public int getOrder() {
-        return MasterSlaveOrder.ORDER;
-    }
+    private Map<String, YamlShardingSphereAlgorithmConfiguration> 
loadBalancers = new LinkedHashMap<>();
     
     @Override
-    public Class<MasterSlaveRuleConfiguration> getTypeClass() {
+    public Class<MasterSlaveRuleConfiguration> getRuleConfigurationType() {
         return MasterSlaveRuleConfiguration.class;
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/rule/YamlMasterSlaveDataSourceRuleConfiguration.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/rule/YamlMasterSlaveDataSourceRuleConfiguration.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/rule/YamlMasterSlaveDataSourceRuleConfiguration.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/config/rule/YamlMasterSlaveDataSourceRuleConfiguration.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapper.java
similarity index 69%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapper.java
index 8eb919d..c070ee8 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapper.java
@@ -17,31 +17,36 @@
 
 package org.apache.shardingsphere.masterslave.yaml.swapper;
 
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-import 
org.apache.shardingsphere.infra.yaml.config.algorithm.YamlShardingSphereAlgorithmConfiguration;
+import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapper;
-import 
org.apache.shardingsphere.masterslave.algorithm.config.AlgorithmProvidedMasterSlaveRuleConfiguration;
+import 
org.apache.shardingsphere.infra.yaml.swapper.algorithm.ShardingSphereAlgorithmConfigurationYamlSwapper;
+import 
org.apache.shardingsphere.masterslave.api.config.MasterSlaveRuleConfiguration;
 import 
org.apache.shardingsphere.masterslave.api.config.rule.MasterSlaveDataSourceRuleConfiguration;
 import org.apache.shardingsphere.masterslave.constant.MasterSlaveOrder;
 import 
org.apache.shardingsphere.masterslave.yaml.config.YamlMasterSlaveRuleConfiguration;
 import 
org.apache.shardingsphere.masterslave.yaml.config.rule.YamlMasterSlaveDataSourceRuleConfiguration;
 
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
 /**
  * Master-slave rule configuration YAML swapper.
  */
-public final class MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper 
implements YamlRuleConfigurationSwapper<YamlMasterSlaveRuleConfiguration, 
AlgorithmProvidedMasterSlaveRuleConfiguration> {
+public final class MasterSlaveRuleConfigurationYamlSwapper implements 
YamlRuleConfigurationSwapper<YamlMasterSlaveRuleConfiguration, 
MasterSlaveRuleConfiguration> {
+    
+    private final ShardingSphereAlgorithmConfigurationYamlSwapper 
algorithmSwapper = new ShardingSphereAlgorithmConfigurationYamlSwapper();
     
     @Override
-    public YamlMasterSlaveRuleConfiguration swapToYamlConfiguration(final 
AlgorithmProvidedMasterSlaveRuleConfiguration data) {
+    public YamlMasterSlaveRuleConfiguration swapToYamlConfiguration(final 
MasterSlaveRuleConfiguration data) {
         YamlMasterSlaveRuleConfiguration result = new 
YamlMasterSlaveRuleConfiguration();
         result.setDataSources(data.getDataSources().stream().collect(
                 
Collectors.toMap(MasterSlaveDataSourceRuleConfiguration::getName, 
this::swapToYamlConfiguration, (a, b) -> b, LinkedHashMap::new)));
-        if (null != data.getLoadBalanceAlgorithms()) {
-            data.getLoadBalanceAlgorithms().forEach((key, value) -> 
result.getLoadBalancers().put(key, 
YamlShardingSphereAlgorithmConfiguration.buildByTypedSPI(value)));
+        if (null != data.getLoadBalancers()) {
+            data.getLoadBalancers().forEach((key, value) -> 
result.getLoadBalancers().put(key, 
algorithmSwapper.swapToYamlConfiguration(value)));
         }
         return result;
     }
@@ -56,14 +61,16 @@ public final class 
MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper impl
     }
     
     @Override
-    public AlgorithmProvidedMasterSlaveRuleConfiguration swapToObject(final 
YamlMasterSlaveRuleConfiguration yamlConfig) {
+    public MasterSlaveRuleConfiguration swapToObject(final 
YamlMasterSlaveRuleConfiguration yamlConfig) {
         Collection<MasterSlaveDataSourceRuleConfiguration> dataSources = new 
LinkedList<>();
         for (Entry<String, YamlMasterSlaveDataSourceRuleConfiguration> entry : 
yamlConfig.getDataSources().entrySet()) {
             dataSources.add(swapToObject(entry.getKey(), entry.getValue()));
         }
-        AlgorithmProvidedMasterSlaveRuleConfiguration ruleConfiguration = new 
AlgorithmProvidedMasterSlaveRuleConfiguration();
-        ruleConfiguration.setDataSources(dataSources);
-        return ruleConfiguration;
+        Map<String, ShardingSphereAlgorithmConfiguration> loadBalancers = new 
LinkedHashMap<>(yamlConfig.getLoadBalancers().entrySet().size(), 1);
+        if (null != yamlConfig.getLoadBalancers()) {
+            yamlConfig.getLoadBalancers().forEach((key, value) -> 
loadBalancers.put(key, algorithmSwapper.swapToObject(value)));
+        }
+        return new MasterSlaveRuleConfiguration(dataSources, loadBalancers);
     }
     
     private MasterSlaveDataSourceRuleConfiguration swapToObject(final String 
name, final YamlMasterSlaveDataSourceRuleConfiguration 
yamlDataSourceRuleConfiguration) {
@@ -72,8 +79,8 @@ public final class 
MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper impl
     }
     
     @Override
-    public Class<AlgorithmProvidedMasterSlaveRuleConfiguration> getTypeClass() 
{
-        return AlgorithmProvidedMasterSlaveRuleConfiguration.class;
+    public Class<MasterSlaveRuleConfiguration> getTypeClass() {
+        return MasterSlaveRuleConfiguration.class;
     }
     
     @Override
@@ -83,6 +90,6 @@ public final class 
MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapper impl
     
     @Override
     public int getOrder() {
-        return MasterSlaveOrder.ALGORITHM_PROVIDER_MASTER_SLAVE_ORDER;
+        return MasterSlaveOrder.ORDER;
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.ShardingSphereRuleBuilder
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.ShardingSphereRuleBuilder
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.ShardingSphereRuleBuilder
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.rule.ShardingSphereRuleBuilder
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapper
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapper
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapper
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapper
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.masterslave.spi.MasterSlaveLoadBalanceAlgorithm
similarity index 81%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.masterslave.spi.MasterSlaveLoadBalanceAlgorithm
index f3fc6a9..aaa245d 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/main/resources/META-INF/services/org.apache.shardingsphere.masterslave.spi.MasterSlaveLoadBalanceAlgorithm
@@ -15,4 +15,5 @@
 # limitations under the License.
 #
 
-provides: shardingsphere-primary-replica-replication-spring-boot-starter
+org.apache.shardingsphere.masterslave.algorithm.RoundRobinMasterSlaveLoadBalanceAlgorithm
+org.apache.shardingsphere.masterslave.algorithm.RandomMasterSlaveLoadBalanceAlgorithm
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RoundRobinMasterSlaveLoadBalanceAlgorithmTest.java
similarity index 62%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RoundRobinMasterSlaveLoadBalanceAlgorithmTest.java
index d5d65f2..2d6b61e 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithmTest.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/algorithm/RoundRobinMasterSlaveLoadBalanceAlgorithmTest.java
@@ -22,11 +22,12 @@ import org.junit.Test;
 import java.util.Arrays;
 import java.util.List;
 
-import static org.junit.Assert.assertTrue;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
 
-public final class RandomMasterSlaveLoadBalanceAlgorithmTest {
+public final class RoundRobinMasterSlaveLoadBalanceAlgorithmTest {
     
-    private final RandomMasterSlaveLoadBalanceAlgorithm 
randomMasterSlaveLoadBalanceAlgorithm = new 
RandomMasterSlaveLoadBalanceAlgorithm();
+    private final RoundRobinMasterSlaveLoadBalanceAlgorithm 
roundRobinMasterSlaveLoadBalanceAlgorithm = new 
RoundRobinMasterSlaveLoadBalanceAlgorithm();
     
     @Test
     public void assertGetDataSource() {
@@ -34,8 +35,8 @@ public final class RandomMasterSlaveLoadBalanceAlgorithmTest {
         String slaveDataSourceName1 = "test_ds_slave_1";
         String slaveDataSourceName2 = "test_ds_slave_2";
         List<String> slaveDataSourceNames = 
Arrays.asList(slaveDataSourceName1, slaveDataSourceName2);
-        
assertTrue(slaveDataSourceNames.contains(randomMasterSlaveLoadBalanceAlgorithm.getDataSource("ds",
 masterDataSourceName, slaveDataSourceNames)));
-        
assertTrue(slaveDataSourceNames.contains(randomMasterSlaveLoadBalanceAlgorithm.getDataSource("ds",
 masterDataSourceName, slaveDataSourceNames)));
-        
assertTrue(slaveDataSourceNames.contains(randomMasterSlaveLoadBalanceAlgorithm.getDataSource("ds",
 masterDataSourceName, slaveDataSourceNames)));
+        
assertThat(roundRobinMasterSlaveLoadBalanceAlgorithm.getDataSource("ds", 
masterDataSourceName, slaveDataSourceNames), is(slaveDataSourceName1));
+        
assertThat(roundRobinMasterSlaveLoadBalanceAlgorithm.getDataSource("ds", 
masterDataSourceName, slaveDataSourceNames), is(slaveDataSourceName2));
+        
assertThat(roundRobinMasterSlaveLoadBalanceAlgorithm.getDataSource("ds", 
masterDataSourceName, slaveDataSourceNames), is(slaveDataSourceName1));
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRuleTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRuleTest.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRuleTest.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveDataSourceRuleTest.java
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRuleTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRuleTest.java
new file mode 100644
index 0000000..8bab229
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/MasterSlaveRuleTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.masterslave.rule;
+
+import com.google.common.collect.ImmutableMap;
+import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
+import 
org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent;
+import 
org.apache.shardingsphere.masterslave.api.config.MasterSlaveRuleConfiguration;
+import 
org.apache.shardingsphere.masterslave.api.config.rule.MasterSlaveDataSourceRuleConfiguration;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public final class MasterSlaveRuleTest {
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void assertNewWithEmptyDataSourceRule() {
+        new MasterSlaveRule(new 
MasterSlaveRuleConfiguration(Collections.emptyList(), Collections.emptyMap()));
+    }
+    
+    @Test
+    public void assertFindDataSourceRule() {
+        Optional<MasterSlaveDataSourceRule> actual = 
createMasterSlaveRule().findDataSourceRule("test_ms");
+        assertTrue(actual.isPresent());
+        assertDataSourceRule(actual.get());
+    }
+    
+    @Test
+    public void assertGetSingleDataSourceRule() {
+        
assertDataSourceRule(createMasterSlaveRule().getSingleDataSourceRule());
+    }
+    
+    private MasterSlaveRule createMasterSlaveRule() {
+        MasterSlaveDataSourceRuleConfiguration configuration = new 
MasterSlaveDataSourceRuleConfiguration("test_ms", "master_db", 
Arrays.asList("slave_db_0", "slave_db_1"), "random");
+        return new MasterSlaveRule(new MasterSlaveRuleConfiguration(
+                Collections.singleton(configuration), 
ImmutableMap.of("random", new ShardingSphereAlgorithmConfiguration("RANDOM", 
new Properties()))));
+    }
+    
+    private void assertDataSourceRule(final MasterSlaveDataSourceRule actual) {
+        assertThat(actual.getName(), is("test_ms"));
+        assertThat(actual.getMasterDataSourceName(), is("master_db"));
+        assertThat(actual.getSlaveDataSourceNames(), 
is(Arrays.asList("slave_db_0", "slave_db_1")));
+        assertThat(actual.getLoadBalancer().getType(), is("RANDOM"));
+    }
+    
+    @Test
+    public void assertUpdateRuleStatusWithNotExistDataSource() {
+        MasterSlaveRule masterSlaveRule = createMasterSlaveRule();
+        masterSlaveRule.updateRuleStatus(new 
DataSourceNameDisabledEvent("slave_db", true));
+        
assertThat(masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames(), 
is(Arrays.asList("slave_db_0", "slave_db_1")));
+    }
+    
+    @Test
+    public void assertUpdateRuleStatus() {
+        MasterSlaveRule masterSlaveRule = createMasterSlaveRule();
+        masterSlaveRule.updateRuleStatus(new 
DataSourceNameDisabledEvent("slave_db_0", true));
+        
assertThat(masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames(), 
is(Collections.singletonList("slave_db_1")));
+    }
+    
+    @Test
+    public void assertUpdateRuleStatusWithEnable() {
+        MasterSlaveRule masterSlaveRule = createMasterSlaveRule();
+        masterSlaveRule.updateRuleStatus(new 
DataSourceNameDisabledEvent("slave_db_0", true));
+        
assertThat(masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames(), 
is(Collections.singletonList("slave_db_1")));
+        masterSlaveRule.updateRuleStatus(new 
DataSourceNameDisabledEvent("slave_db_0", false));
+        
assertThat(masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames(), 
is(Arrays.asList("slave_db_0", "slave_db_1")));
+    }
+    
+    @Test
+    public void assertGetDataSourceMapper() {
+        MasterSlaveRule masterSlaveRule = createMasterSlaveRule();
+        Map<String, Collection<String>> actual = 
masterSlaveRule.getDataSourceMapper();
+        Map<String, Collection<String>> expected = ImmutableMap.of("test_ms", 
Arrays.asList("master_db", "slave_db_0", "slave_db_1"));
+        assertThat(actual, is(expected));
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilderTest.java
similarity index 88%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilderTest.java
index 177562a..e19a174 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/AlgorithmProvidedMasterSlaveRuleBuilderTest.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/rule/biulder/MasterSlaveRuleBuilderTest.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.masterslave.rule.biulder;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRuleBuilder;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.order.OrderedSPIRegistry;
-import 
org.apache.shardingsphere.masterslave.algorithm.config.AlgorithmProvidedMasterSlaveRuleConfiguration;
+import 
org.apache.shardingsphere.masterslave.api.config.MasterSlaveRuleConfiguration;
 import 
org.apache.shardingsphere.masterslave.api.config.rule.MasterSlaveDataSourceRuleConfiguration;
 import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule;
 import org.junit.Test;
@@ -32,7 +32,7 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-public final class AlgorithmProvidedMasterSlaveRuleBuilderTest {
+public final class MasterSlaveRuleBuilderTest {
     
     static {
         ShardingSphereServiceLoader.register(ShardingSphereRuleBuilder.class);
@@ -40,7 +40,7 @@ public final class 
AlgorithmProvidedMasterSlaveRuleBuilderTest {
     
     @Test
     public void assertBuild() {
-        AlgorithmProvidedMasterSlaveRuleConfiguration ruleConfig = 
mock(AlgorithmProvidedMasterSlaveRuleConfiguration.class);
+        MasterSlaveRuleConfiguration ruleConfig = 
mock(MasterSlaveRuleConfiguration.class);
         MasterSlaveDataSourceRuleConfiguration ruleConfiguration = new 
MasterSlaveDataSourceRuleConfiguration("name", "masterDataSourceName",
                 Collections.singletonList("name"), "loadBalancerName");
         
when(ruleConfig.getDataSources()).thenReturn(Collections.singletonList(ruleConfiguration));
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapperTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapperTest.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapperTest.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleAlgorithmProviderConfigurationYamlSwapperTest.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapperTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapperTest.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapperTest.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/MasterSlaveRuleConfigurationYamlSwapperTest.java
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/YamlRootRuleConfigurationsForYamlMasterSlaveRuleConfigurationTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/YamlRootRuleConfigurationsForYamlMasterSlaveRuleConfigurationTest.java
new file mode 100644
index 0000000..37b0b5c
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/java/org/apache/shardingsphere/masterslave/yaml/swapper/YamlRootRuleConfigurationsForYamlMasterSlaveRuleConfigurationTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.masterslave.yaml.swapper;
+
+import org.apache.shardingsphere.infra.yaml.config.YamlRootRuleConfigurations;
+import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
+import 
org.apache.shardingsphere.masterslave.yaml.config.YamlMasterSlaveRuleConfiguration;
+import org.junit.Test;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+public final class 
YamlRootRuleConfigurationsForYamlMasterSlaveRuleConfigurationTest {
+    
+    @Test
+    public void assertUnmarshalWithYamlFile() throws IOException {
+        URL url = 
getClass().getClassLoader().getResource("yaml/master-slave-rule.yaml");
+        assertNotNull(url);
+        YamlRootRuleConfigurations rootRuleConfigurations = 
YamlEngine.unmarshal(new File(url.getFile()), YamlRootRuleConfigurations.class);
+        assertThat(rootRuleConfigurations.getRules().size(), is(1));
+        assertMasterSlaveRule((YamlMasterSlaveRuleConfiguration) 
rootRuleConfigurations.getRules().iterator().next());
+    }
+    
+    @Test
+    public void assertUnmarshalWithYamlBytes() throws IOException {
+        URL url = 
getClass().getClassLoader().getResource("yaml/master-slave-rule.yaml");
+        assertNotNull(url);
+        StringBuilder yamlContent = new StringBuilder();
+        try (
+                FileReader fileReader = new FileReader(url.getFile());
+                BufferedReader reader = new BufferedReader(fileReader)) {
+            String line;
+            while (null != (line = reader.readLine())) {
+                yamlContent.append(line).append(System.lineSeparator());
+            }
+        }
+        YamlRootRuleConfigurations rootRuleConfigs = 
YamlEngine.unmarshal(yamlContent.toString().getBytes(), 
YamlRootRuleConfigurations.class);
+        assertThat(rootRuleConfigs.getRules().size(), is(1));
+        assertMasterSlaveRule((YamlMasterSlaveRuleConfiguration) 
rootRuleConfigs.getRules().iterator().next());
+    }
+    
+    private void assertMasterSlaveRule(final YamlMasterSlaveRuleConfiguration 
actual) {
+        assertThat(actual.getDataSources().size(), is(2));
+        assertMasterSlaveRuleForDs0(actual);
+        assertMasterSlaveRuleForDs1(actual);
+    }
+    
+    private void assertMasterSlaveRuleForDs0(final 
YamlMasterSlaveRuleConfiguration actual) {
+        
assertThat(actual.getDataSources().get("ds_0").getMasterDataSourceName(), 
is("master_ds_0"));
+        
assertThat(actual.getDataSources().get("ds_0").getSlaveDataSourceNames(), 
is(Arrays.asList("master_ds_0_slave_0", "master_ds_0_slave_1")));
+        assertThat(actual.getDataSources().get("ds_0").getLoadBalancerName(), 
is("roundRobin"));
+    }
+    
+    private void assertMasterSlaveRuleForDs1(final 
YamlMasterSlaveRuleConfiguration actual) {
+        
assertThat(actual.getDataSources().get("ds_1").getMasterDataSourceName(), 
is("master_ds_1"));
+        
assertThat(actual.getDataSources().get("ds_1").getSlaveDataSourceNames(), 
is(Arrays.asList("master_ds_1_slave_0", "master_ds_1_slave_1")));
+        assertThat(actual.getDataSources().get("ds_1").getLoadBalancerName(), 
is("random"));
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/resources/logback-test.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/resources/logback-test.xml
similarity index 100%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/resources/logback-test.xml
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/resources/logback-test.xml
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/resources/yaml/master-slave-rule.yaml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/resources/yaml/master-slave-rule.yaml
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/resources/yaml/master-slave-rule.yaml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-common/src/test/resources/yaml/master-slave-rule.yaml
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/pom.xml
similarity index 78%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/pom.xml
index 10e5918..3e18c9c 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-api/pom.xml
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/pom.xml
@@ -22,16 +22,21 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-primary-replica-replication</artifactId>
+        <artifactId>shardingsphere-master-slave</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    <artifactId>shardingsphere-primary-replica-replication-api</artifactId>
+    <artifactId>shardingsphere-master-slave-route</artifactId>
     <name>${project.artifactId}</name>
     
     <dependencies>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>shardingsphere-infra-common</artifactId>
+            <artifactId>shardingsphere-infra-route</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-master-slave-common</artifactId>
             <version>${project.version}</version>
         </dependency>
     </dependencies>
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecorator.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecorator.java
new file mode 100644
index 0000000..24f67ba
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecorator.java
@@ -0,0 +1,77 @@
+/*
+ * 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.masterslave.route.engine;
+
+import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.DefaultSchema;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.route.context.DefaultRouteStageContext;
+import org.apache.shardingsphere.infra.route.context.RouteContext;
+import org.apache.shardingsphere.infra.route.context.RouteMapper;
+import org.apache.shardingsphere.infra.route.context.RouteResult;
+import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.infra.route.decorator.RouteDecorator;
+import org.apache.shardingsphere.masterslave.constant.MasterSlaveOrder;
+import 
org.apache.shardingsphere.masterslave.route.engine.impl.MasterSlaveDataSourceRouter;
+import org.apache.shardingsphere.masterslave.rule.MasterSlaveDataSourceRule;
+import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.Optional;
+
+/**
+ * Route decorator for master-slave.
+ */
+public final class MasterSlaveRouteDecorator implements 
RouteDecorator<MasterSlaveRule> {
+    
+    @Override
+    public RouteContext decorate(final RouteContext routeContext, final 
ShardingSphereMetaData metaData, final MasterSlaveRule masterSlaveRule, final 
ConfigurationProperties props) {
+        if (routeContext.getRouteResult().getRouteUnits().isEmpty()) {
+            String dataSourceName = new 
MasterSlaveDataSourceRouter(masterSlaveRule.getSingleDataSourceRule()).route(routeContext.getSqlStatementContext().getSqlStatement());
+            RouteResult routeResult = new RouteResult();
+            routeResult.getRouteUnits().add(new RouteUnit(new 
RouteMapper(DefaultSchema.LOGIC_NAME, dataSourceName), 
Collections.emptyList()));
+            return new RouteContext(routeContext, routeResult, new 
DefaultRouteStageContext(), getTypeClass());
+        }
+        Collection<RouteUnit> toBeRemoved = new LinkedList<>();
+        Collection<RouteUnit> toBeAdded = new LinkedList<>();
+        for (RouteUnit each : routeContext.getRouteResult().getRouteUnits()) {
+            String dataSourceName = each.getDataSourceMapper().getLogicName();
+            Optional<MasterSlaveDataSourceRule> dataSourceRule = 
masterSlaveRule.findDataSourceRule(dataSourceName);
+            if (dataSourceRule.isPresent() && 
dataSourceRule.get().getName().equalsIgnoreCase(each.getDataSourceMapper().getActualName()))
 {
+                toBeRemoved.add(each);
+                String actualDataSourceName = new 
MasterSlaveDataSourceRouter(dataSourceRule.get()).route(routeContext.getSqlStatementContext().getSqlStatement());
+                toBeAdded.add(new RouteUnit(new 
RouteMapper(each.getDataSourceMapper().getLogicName(), actualDataSourceName), 
each.getTableMappers()));
+            }
+        }
+        routeContext.getRouteResult().getRouteUnits().removeAll(toBeRemoved);
+        routeContext.getRouteResult().getRouteUnits().addAll(toBeAdded);
+        return routeContext;
+    }
+    
+    @Override
+    public int getOrder() {
+        return MasterSlaveOrder.ORDER;
+    }
+    
+    @Override
+    public Class<MasterSlaveRule> getTypeClass() {
+        return MasterSlaveRule.class;
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterSlaveDataSourceRouter.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterSlaveDataSourceRouter.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterSlaveDataSourceRouter.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterSlaveDataSourceRouter.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterVisitedManager.java
similarity index 53%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterVisitedManager.java
index 1f56303..5b1b0df 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/constant/MasterSlaveOrder.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/java/org/apache/shardingsphere/masterslave/route/engine/impl/MasterVisitedManager.java
@@ -15,24 +15,41 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.masterslave.constant;
+package org.apache.shardingsphere.masterslave.route.engine.impl;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
 /**
- * Master-slave order.
+ * Master data source visited manager.
+ * 
+ * <p>Trace master data source visited or not in current thread.</p>
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class MasterSlaveOrder {
+public final class MasterVisitedManager {
+    
+    private static final ThreadLocal<Boolean> MASTER_VISITED = 
ThreadLocal.withInitial(() -> false);
+    
+    /**
+     * Judge master data source visited in current thread.
+     * 
+     * @return master data source visited or not in current thread
+     */
+    public static boolean isMasterVisited() {
+        return MASTER_VISITED.get();
+    }
     
     /**
-     * Master-slave order.
+     * Set master data source visited in current thread.
      */
-    public static final int ORDER = 10;
+    public static void setMasterVisited() {
+        MASTER_VISITED.set(true);
+    }
     
     /**
-     * Algorithm provider master-slave order.
+     * Clear master data source visited.
      */
-    public static final int ALGORITHM_PROVIDER_MASTER_SLAVE_ORDER = 11;
+    public static void clear() {
+        MASTER_VISITED.remove();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.route.decorator.RouteDecorator
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.route.decorator.RouteDecorator
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.route.decorator.RouteDecorator
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.route.decorator.RouteDecorator
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/test/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecoratorTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/test/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecoratorTest.java
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-route/src/test/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecoratorTest.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-route/src/test/java/org/apache/shardingsphere/masterslave/route/engine/MasterSlaveRouteDecoratorTest.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/pom.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/pom.xml
similarity index 80%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/pom.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/pom.xml
index febd4c2..9e3701b 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/pom.xml
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/pom.xml
@@ -22,15 +22,15 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        <artifactId>shardingsphere-primary-replica-replication</artifactId>
+        <artifactId>shardingsphere-master-slave</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    <artifactId>shardingsphere-primary-replica-replication-spring</artifactId>
+    <artifactId>shardingsphere-master-slave-spring</artifactId>
     <name>${project.artifactId}</name>
     <packaging>pom</packaging>
     
     <modules>
-        
<module>shardingsphere-primary-replica-replication-spring-namespace</module>
-        
<module>shardingsphere-primary-replica-replication-spring-boot-starter</module>
+        <module>shardingsphere-master-slave-spring-namespace</module>
+        <module>shardingsphere-master-slave-spring-boot-starter</module>
     </modules>
 </project>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/pom.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/pom.xml
similarity index 90%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/pom.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/pom.xml
index 5bdda6d..fd2c57f 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/pom.xml
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/pom.xml
@@ -22,16 +22,16 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        
<artifactId>shardingsphere-primary-replica-replication-spring</artifactId>
+        <artifactId>shardingsphere-master-slave-spring</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    
<artifactId>shardingsphere-primary-replica-replication-spring-boot-starter</artifactId>
+    <artifactId>shardingsphere-master-slave-spring-boot-starter</artifactId>
     <name>${project.artifactId}</name>
 
     <dependencies>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-common</artifactId>
+            <artifactId>shardingsphere-master-slave-common</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/MasterSlaveRuleSpringbootConfiguration.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spr
 [...]
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/MasterSlaveRuleSpringbootConfiguration.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/MasterSlaveRuleSpringbootConfiguration.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/algorithm/MasterSlaveAlgorithmProvidedBeanRegistry.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/mas
 [...]
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/algorithm/MasterSlaveAlgorithmProvidedBeanRegistry.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/algorithm/MasterSlaveAlgorithmProvidedBeanRegistry.java
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/condition/MasterSlaveSpringBootCondition.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/condition/MasterSlaveSpringBootCon
 [...]
new file mode 100644
index 0000000..5a31e26
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/condition/MasterSlaveSpringBootCondition.java
@@ -0,0 +1,38 @@
+/*
+ * 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.masterslave.spring.boot.condition;
+
+import org.apache.shardingsphere.spring.boot.util.PropertyUtil;
+import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
+import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+/**
+ * Spring boot condition for master-slave .
+ */
+public final class MasterSlaveSpringBootCondition extends SpringBootCondition {
+    
+    private static final String MASTER_SLAVE_PREFIX = 
"spring.shardingsphere.rules.master-slave";
+    
+    @Override
+    public ConditionOutcome getMatchOutcome(final ConditionContext 
conditionContext, final AnnotatedTypeMetadata annotatedTypeMetadata) {
+        return 
PropertyUtil.containPropertyPrefix(conditionContext.getEnvironment(), 
MASTER_SLAVE_PREFIX)
+                ? ConditionOutcome.match() : ConditionOutcome.noMatch("Can't 
find ShardingSphere master-slave rule configuration in local file.");
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/rule/YamlMasterSlaveRuleSpringBootConfiguration.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/master
 [...]
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/rule/YamlMasterSlaveRuleSpringBootConfiguration.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/java/org/apache/shardingsphere/masterslave/spring/boot/rule/YamlMasterSlaveRuleSpringBootConfiguration.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/resources/META-INF/spring.factories
similarity index 83%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/resources/META-INF/spring.factories
index f3fc6a9..769ba76 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -15,4 +15,5 @@
 # limitations under the License.
 #
 
-provides: shardingsphere-primary-replica-replication-spring-boot-starter
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.apache.shardingsphere.masterslave.spring.boot.MasterSlaveRuleSpringbootConfiguration
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/resources/META-INF/spring.provides
similarity index 91%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/resources/META-INF/spring.provides
index f3fc6a9..3e6b55f 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/main/resources/META-INF/spring.provides
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-provides: shardingsphere-primary-replica-replication-spring-boot-starter
+provides: shardingsphere-master-slave-spring-boot-starter
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/java/org/apache/shardingsphere/masterslave/spring/boot/MasterSlaveSpringBootStarterTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/java/org/apache/shardingsphere/masterslave/spring/boot/MasterSlaveSpringBootStarterTest.java
new file mode 100644
index 0000000..f1058aa
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/java/org/apache/shardingsphere/masterslave/spring/boot/MasterSlaveSpringBootStarterTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.masterslave.spring.boot;
+
+import 
org.apache.shardingsphere.masterslave.algorithm.RandomMasterSlaveLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.masterslave.algorithm.config.AlgorithmProvidedMasterSlaveRuleConfiguration;
+import 
org.apache.shardingsphere.masterslave.api.config.rule.MasterSlaveDataSourceRuleConfiguration;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import javax.annotation.Resource;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = MasterSlaveSpringBootStarterTest.class)
+@SpringBootApplication
+@ActiveProfiles("masterslave")
+public class MasterSlaveSpringBootStarterTest {
+    
+    @Resource
+    private RandomMasterSlaveLoadBalanceAlgorithm random;
+    
+    @Resource
+    private AlgorithmProvidedMasterSlaveRuleConfiguration 
masterSlaveRuleConfiguration;
+    
+    @Test
+    public void assertLoadBalanceAlgorithm() {
+        assertTrue(random.getProps().isEmpty());
+    }
+    
+    @Test
+    public void assertMasterSlaveRuleConfiguration() {
+        assertThat(masterSlaveRuleConfiguration.getDataSources().size(), 
is(1));
+        MasterSlaveDataSourceRuleConfiguration 
masterSlaveDataSourceRuleConfiguration = 
masterSlaveRuleConfiguration.getDataSources().stream().findFirst().get();
+        assertThat(masterSlaveDataSourceRuleConfiguration.getName(), 
is("ds_ms"));
+        
assertThat(masterSlaveDataSourceRuleConfiguration.getMasterDataSourceName(), 
is("ds_master"));
+        
assertThat(masterSlaveDataSourceRuleConfiguration.getLoadBalancerName(), 
is("random"));
+        
assertThat(masterSlaveDataSourceRuleConfiguration.getSlaveDataSourceNames().size(),
 is(2));
+        
assertTrue(masterSlaveRuleConfiguration.getDataSources().contains(masterSlaveDataSourceRuleConfiguration));
+        
assertThat(masterSlaveRuleConfiguration.getLoadBalanceAlgorithms().size(), 
is(1));
+        
assertTrue(masterSlaveRuleConfiguration.getLoadBalanceAlgorithms().containsKey("random"));
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/java/org/apache/shardingsphere/masterslave/spring/boot/condition/MasterSlaveSpringBootConditionTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/java/org/apache/shardingsphere/masterslave/spring/boot/condition/MasterSlaveSpringBoo
 [...]
new file mode 100644
index 0000000..3a7d43a
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/java/org/apache/shardingsphere/masterslave/spring/boot/condition/MasterSlaveSpringBootConditionTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.masterslave.spring.boot.condition;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+import org.springframework.mock.env.MockEnvironment;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class MasterSlaveSpringBootConditionTest {
+    
+    @Test
+    public void assertNotMatch() {
+        MockEnvironment mockEnvironment = new MockEnvironment();
+        
mockEnvironment.setProperty("spring.shardingsphere.rules.encrypt.encryptors.aes_encryptor.type",
 "AES");
+        
mockEnvironment.setProperty("spring.shardingsphere.rules.shadow.column", 
"user_id");
+        ConditionContext context = mock(ConditionContext.class);
+        AnnotatedTypeMetadata metadata = mock(AnnotatedTypeMetadata.class);
+        when(context.getEnvironment()).thenReturn(mockEnvironment);
+        MasterSlaveSpringBootCondition condition = new 
MasterSlaveSpringBootCondition();
+        ConditionOutcome matchOutcome = condition.getMatchOutcome(context, 
metadata);
+        assertFalse(matchOutcome.isMatch());
+    }
+    
+    @Test
+    public void assertMatch() {
+        MockEnvironment mockEnvironment = new MockEnvironment();
+        
mockEnvironment.setProperty("spring.shardingsphere.rules.master-slave.data-sources.ds_ms.master-data-source-name",
 "ds_master");
+        ConditionContext context = mock(ConditionContext.class);
+        AnnotatedTypeMetadata metadata = mock(AnnotatedTypeMetadata.class);
+        when(context.getEnvironment()).thenReturn(mockEnvironment);
+        MasterSlaveSpringBootCondition condition = new 
MasterSlaveSpringBootCondition();
+        ConditionOutcome matchOutcome = condition.getMatchOutcome(context, 
metadata);
+        assertTrue(matchOutcome.isMatch());
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/resources/application-masterslave.properties
similarity index 68%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/resources/application-masterslave.properties
index f3fc6a9..067dd1f 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-boot-starter/src/main/resources/META-INF/spring.provides
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/resources/application-masterslave.properties
@@ -15,4 +15,8 @@
 # limitations under the License.
 #
 
-provides: shardingsphere-primary-replica-replication-spring-boot-starter
+spring.shardingsphere.rules.master-slave.load-balancers.random.type=RANDOM
+
+spring.shardingsphere.rules.master-slave.data-sources.ds_ms.master-data-source-name=ds_master
+spring.shardingsphere.rules.master-slave.data-sources.ds_ms.slave-data-source-names=ds_slave_0,ds_slave_1
+spring.shardingsphere.rules.master-slave.data-sources.ds_ms.load-balancer-name=random
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/resources/logback-test.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/resources/logback-test.xml
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/test/resources/logback-test.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-boot-starter/src/test/resources/logback-test.xml
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/pom.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/pom.xml
similarity index 88%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/pom.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/pom.xml
index 1303f49..e2fb788 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/pom.xml
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/pom.xml
@@ -22,16 +22,16 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.shardingsphere</groupId>
-        
<artifactId>shardingsphere-primary-replica-replication-spring</artifactId>
+        <artifactId>shardingsphere-master-slave-spring</artifactId>
         <version>5.0.0-RC1-SNAPSHOT</version>
     </parent>
-    
<artifactId>shardingsphere-primary-replica-replication-spring-namespace</artifactId>
+    <artifactId>shardingsphere-master-slave-spring-namespace</artifactId>
     <name>${project.artifactId}</name>
     
     <dependencies>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-common</artifactId>
+            <artifactId>shardingsphere-master-slave-common</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/factorybean/MasterSlaveLoadBalanceAlgorithmFactoryBean.java
similarity index 57%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/factorybean/MasterSlaveLoadBalanceAlgorithmFactoryBean.java
index 9b94076..5c550cb 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-common/src/main/java/org/apache/shardingsphere/masterslave/algorithm/RandomMasterSlaveLoadBalanceAlgorithm.java
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/factorybean/MasterSlaveLoadBalanceAlgorithmFactoryBean.java
@@ -15,32 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.masterslave.algorithm;
+package org.apache.shardingsphere.masterslave.spring.namespace.factorybean;
 
-import lombok.Getter;
-import lombok.Setter;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import 
org.apache.shardingsphere.masterslave.spi.MasterSlaveLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.spring.namespace.factorybean.ShardingSphereAlgorithmFactoryBean;
 
-import java.util.List;
 import java.util.Properties;
-import java.util.concurrent.ThreadLocalRandom;
 
 /**
- * Random slave database load-balance algorithm.
+ * Master-slave load balance algorithm factory bean.
  */
-@Getter
-@Setter
-public final class RandomMasterSlaveLoadBalanceAlgorithm implements 
MasterSlaveLoadBalanceAlgorithm {
+public final class MasterSlaveLoadBalanceAlgorithmFactoryBean extends 
ShardingSphereAlgorithmFactoryBean<MasterSlaveLoadBalanceAlgorithm> {
     
-    private Properties props = new Properties();
-    
-    @Override
-    public String getDataSource(final String name, final String 
masterDataSourceName, final List<String> slaveDataSourceNames) {
-        return 
slaveDataSourceNames.get(ThreadLocalRandom.current().nextInt(slaveDataSourceNames.size()));
+    static {
+        
ShardingSphereServiceLoader.register(MasterSlaveLoadBalanceAlgorithm.class);
     }
     
-    @Override
-    public String getType() {
-        return "RANDOM";
+    public MasterSlaveLoadBalanceAlgorithmFactoryBean(final String type, final 
Properties props) {
+        super(MasterSlaveLoadBalanceAlgorithm.class, type, props);
     }
 }
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/handler/MasterSlaveNamespaceHandler.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/handler/MasterSlaveNamespaceHandler.java
new file mode 100644
index 0000000..2eaf491
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/handler/MasterSlaveNamespaceHandler.java
@@ -0,0 +1,37 @@
+/*
+ * 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.masterslave.spring.namespace.handler;
+
+import 
org.apache.shardingsphere.masterslave.spring.namespace.factorybean.MasterSlaveLoadBalanceAlgorithmFactoryBean;
+import 
org.apache.shardingsphere.masterslave.spring.namespace.parser.MasterSlaveRuleBeanDefinitionParser;
+import 
org.apache.shardingsphere.masterslave.spring.namespace.tag.LoadBalanceAlgorithmBeanDefinitionTag;
+import 
org.apache.shardingsphere.masterslave.spring.namespace.tag.MasterSlaveRuleBeanDefinitionTag;
+import 
org.apache.shardingsphere.spring.namespace.parser.ShardingSphereAlgorithmBeanDefinitionParser;
+import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
+
+/**
+ * Spring namespace handler for master-slave.
+ */
+public final class MasterSlaveNamespaceHandler extends NamespaceHandlerSupport 
{
+    
+    @Override
+    public void init() {
+        
registerBeanDefinitionParser(MasterSlaveRuleBeanDefinitionTag.ROOT_TAG, new 
MasterSlaveRuleBeanDefinitionParser());
+        
registerBeanDefinitionParser(LoadBalanceAlgorithmBeanDefinitionTag.ROOT_TAG, 
new 
ShardingSphereAlgorithmBeanDefinitionParser(MasterSlaveLoadBalanceAlgorithmFactoryBean.class));
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/parser/MasterSlaveRuleBeanDefinitionParser.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/
 [...]
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/parser/MasterSlaveRuleBeanDefinitionParser.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/parser/MasterSlaveRuleBeanDefinitionParser.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/tag/LoadBalanceAlgorithmBeanDefinitionTag.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/s
 [...]
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/tag/LoadBalanceAlgorithmBeanDefinitionTag.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/tag/LoadBalanceAlgorithmBeanDefinitionTag.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/tag/MasterSlaveRuleBeanDefinitionTag.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring
 [...]
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/tag/MasterSlaveRuleBeanDefinitionTag.java
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/java/org/apache/shardingsphere/masterslave/spring/namespace/tag/MasterSlaveRuleBeanDefinitionTag.java
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/namespace/master-slave.xsd
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/namespace/master-slave.xsd
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/namespace/master-slave.xsd
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/namespace/master-slave.xsd
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/spring.schemas
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/spring.handlers
similarity index 89%
copy from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/spring.schemas
copy to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/spring.handlers
index 847cd0c..2b51f38 100644
--- 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/spring.schemas
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/spring.handlers
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-http\://shardingsphere.apache.org/schema/shardingsphere/masterslave/master-slave.xsd=META-INF/namespace/master-slave.xsd
+http\://shardingsphere.apache.org/schema/shardingsphere/masterslave=org.apache.shardingsphere.masterslave.spring.namespace.handler.MasterSlaveNamespaceHandler
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/spring.schemas
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/spring.schemas
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/main/resources/META-INF/spring.schemas
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/main/resources/META-INF/spring.schemas
diff --git 
a/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/java/org/apache/shardingsphere/masterslave/spring/namespace/MasterSlaveSpringNamespaceTest.java
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/java/org/apache/shardingsphere/masterslave/spring/namespace/MasterSlaveSpringNamespaceTest.java
new file mode 100644
index 0000000..f449ec4
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/java/org/apache/shardingsphere/masterslave/spring/namespace/MasterSlaveSpringNamespaceTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.masterslave.spring.namespace;
+
+import 
org.apache.shardingsphere.masterslave.algorithm.RandomMasterSlaveLoadBalanceAlgorithm;
+import 
org.apache.shardingsphere.masterslave.algorithm.config.AlgorithmProvidedMasterSlaveRuleConfiguration;
+import 
org.apache.shardingsphere.masterslave.api.config.rule.MasterSlaveDataSourceRuleConfiguration;
+import 
org.apache.shardingsphere.masterslave.spi.MasterSlaveLoadBalanceAlgorithm;
+import org.junit.Test;
+import org.springframework.test.context.ContextConfiguration;
+import 
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+@ContextConfiguration(locations = 
"classpath:META-INF/spring/master-slave-application-context.xml")
+public final class MasterSlaveSpringNamespaceTest extends 
AbstractJUnit4SpringContextTests {
+    
+    @Resource
+    private MasterSlaveLoadBalanceAlgorithm randomLoadbalancer;
+    
+    @Resource
+    private AlgorithmProvidedMasterSlaveRuleConfiguration 
defaultMasterSlaveRule;
+    
+    @Resource
+    private AlgorithmProvidedMasterSlaveRuleConfiguration 
randomMasterSlaveRule;
+    
+    @Test
+    public void assertRandomLoadbalancer() {
+        assertThat(randomLoadbalancer.getType(), is("RANDOM"));
+    }
+    
+    @Test
+    public void assertDefaultMaserSlaveDataSource() {
+        assertLoadBalancers(defaultMasterSlaveRule.getLoadBalanceAlgorithms());
+        assertThat(defaultMasterSlaveRule.getDataSources().size(), is(1));
+        
assertDefaultMasterSlaveDataSourceRule(defaultMasterSlaveRule.getDataSources().iterator().next());
+    }
+    
+    private void assertLoadBalancers(final Map<String, 
MasterSlaveLoadBalanceAlgorithm> loadBalances) {
+        assertThat(loadBalances.size(), is(1));
+        assertThat(loadBalances.get("randomLoadbalancer"), 
instanceOf(RandomMasterSlaveLoadBalanceAlgorithm.class));
+    }
+    
+    private void assertDefaultMasterSlaveDataSourceRule(final 
MasterSlaveDataSourceRuleConfiguration dataSourceRuleConfig) {
+        assertThat(dataSourceRuleConfig.getName(), is("default_ds"));
+        assertThat(dataSourceRuleConfig.getMasterDataSourceName(), 
is("master_ds"));
+        assertThat(dataSourceRuleConfig.getSlaveDataSourceNames(), 
is(Arrays.asList("slave_ds_0", "slave_ds_1")));
+        assertThat(dataSourceRuleConfig.getLoadBalancerName(), is(""));
+    }
+    
+    @Test
+    public void assertRandomMaserSlaveDataSource() {
+        assertLoadBalancers(randomMasterSlaveRule.getLoadBalanceAlgorithms());
+        assertThat(randomMasterSlaveRule.getDataSources().size(), is(1));
+        
assertRandomMasterSlaveDataSourceRule(randomMasterSlaveRule.getDataSources().iterator().next());
+    }
+    
+    private void assertRandomMasterSlaveDataSourceRule(final 
MasterSlaveDataSourceRuleConfiguration dataSourceRuleConfig) {
+        assertThat(dataSourceRuleConfig.getName(), is("random_ds"));
+        assertThat(dataSourceRuleConfig.getMasterDataSourceName(), 
is("master_ds"));
+        assertThat(dataSourceRuleConfig.getSlaveDataSourceNames(), 
is(Arrays.asList("slave_ds_0", "slave_ds_1")));
+        assertThat(dataSourceRuleConfig.getLoadBalancerName(), 
is("randomLoadbalancer"));
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/test/resources/META-INF/spring/master-slave-application-context.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/resources/META-INF/spring/master-slave-application-context.xml
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/test/resources/META-INF/spring/master-slave-application-context.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/resources/META-INF/spring/master-slave-application-context.xml
diff --git 
a/shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/test/resources/logback-test.xml
 
b/shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/resources/logback-test.xml
similarity index 100%
rename from 
shardingsphere-features/shardingsphere-primary-replica-replication/shardingsphere-primary-replica-replication-spring/shardingsphere-primary-replica-replication-spring-namespace/src/test/resources/logback-test.xml
rename to 
shardingsphere-features/shardingsphere-master-slave/shardingsphere-master-slave-spring/shardingsphere-master-slave-spring-namespace/src/test/resources/logback-test.xml
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-common/pom.xml
 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-common/pom.xml
index f691a91..b894242 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-common/pom.xml
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/shardingsphere-governance-core-common/pom.xml
@@ -39,7 +39,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-common</artifactId>
+            <artifactId>shardingsphere-master-slave-common</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml
index 9d02d8a..c736f30 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/pom.xml
@@ -69,7 +69,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-route</artifactId>
+            <artifactId>shardingsphere-master-slave-route</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
index 906c589..2f26129 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/pom.xml
@@ -44,7 +44,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-spring-boot-starter</artifactId>
+            
<artifactId>shardingsphere-master-slave-spring-boot-starter</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
index 86ef15c..43292b5 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-namespace/pom.xml
@@ -40,7 +40,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-spring-namespace</artifactId>
+            
<artifactId>shardingsphere-master-slave-spring-namespace</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/pom.xml
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/pom.xml
index a54a7d4..c0184b4 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/pom.xml
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-governance-spring/shardingsphere-jdbc-governance-spring-boot-starter/pom.xml
@@ -44,7 +44,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-spring-boot-starter</artifactId>
+            
<artifactId>shardingsphere-master-slave-spring-boot-starter</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml 
b/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml
index 4f8c70e..caa5b9e 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/pom.xml
@@ -79,7 +79,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-route</artifactId>
+            <artifactId>shardingsphere-master-slave-route</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git a/shardingsphere-proxy/shardingsphere-proxy-common/pom.xml 
b/shardingsphere-proxy/shardingsphere-proxy-common/pom.xml
index 3e28017..68575c7 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-common/pom.xml
+++ b/shardingsphere-proxy/shardingsphere-proxy-common/pom.xml
@@ -49,7 +49,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            
<artifactId>shardingsphere-primary-replica-replication-common</artifactId>
+            <artifactId>shardingsphere-master-slave-common</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>

Reply via email to