未验证 提交 34cbbeaf 编写于 作者: Z Zhang Yonglun 提交者: GitHub

#7318, add route switch (#8041)

上级 37651f3a
......@@ -36,4 +36,6 @@ public final class HADataSourceRuleConfiguration {
private final List<String> replicaDataSourceNames;
private final String loadBalancerName;
private final Boolean readWriteSplit;
}
......@@ -46,6 +46,8 @@ public final class HADataSourceRule {
private final ReplicaLoadBalanceAlgorithm loadBalancer;
private final Boolean readWriteSplit;
@Getter(AccessLevel.NONE)
private final Collection<String> disabledDataSourceNames = new HashSet<>();
......@@ -55,6 +57,7 @@ public final class HADataSourceRule {
primaryDataSourceName = config.getPrimaryDataSourceName();
replicaDataSourceNames = config.getReplicaDataSourceNames();
this.loadBalancer = loadBalancer;
this.readWriteSplit = config.getReadWriteSplit();
}
private void checkConfiguration(final HADataSourceRuleConfiguration config) {
......
......@@ -40,5 +40,7 @@ public final class YamlHADataSourceRuleConfiguration implements YamlConfiguratio
private String loadBalancerName;
private Boolean readWriteSplit;
private Properties props = new Properties();
}
......@@ -54,6 +54,7 @@ public final class HARuleAlgorithmProviderConfigurationYamlSwapper
result.setPrimaryDataSourceName(dataSourceRuleConfig.getPrimaryDataSourceName());
result.setReplicaDataSourceNames(dataSourceRuleConfig.getReplicaDataSourceNames());
result.setLoadBalancerName(dataSourceRuleConfig.getLoadBalancerName());
result.setReadWriteSplit(dataSourceRuleConfig.getReadWriteSplit());
return result;
}
......@@ -69,8 +70,8 @@ public final class HARuleAlgorithmProviderConfigurationYamlSwapper
}
private HADataSourceRuleConfiguration swapToObject(final String name, final YamlHADataSourceRuleConfiguration yamlDataSourceRuleConfig) {
return new HADataSourceRuleConfiguration(name,
yamlDataSourceRuleConfig.getPrimaryDataSourceName(), yamlDataSourceRuleConfig.getReplicaDataSourceNames(), yamlDataSourceRuleConfig.getLoadBalancerName());
return new HADataSourceRuleConfiguration(name, yamlDataSourceRuleConfig.getPrimaryDataSourceName(), yamlDataSourceRuleConfig.getReplicaDataSourceNames(),
yamlDataSourceRuleConfig.getLoadBalancerName(), yamlDataSourceRuleConfig.getReadWriteSplit());
}
@Override
......
......@@ -58,6 +58,7 @@ public final class HARuleConfigurationYamlSwapper
result.setPrimaryDataSourceName(dataSourceRuleConfig.getPrimaryDataSourceName());
result.setReplicaDataSourceNames(dataSourceRuleConfig.getReplicaDataSourceNames());
result.setLoadBalancerName(dataSourceRuleConfig.getLoadBalancerName());
result.setReadWriteSplit(dataSourceRuleConfig.getReadWriteSplit());
return result;
}
......@@ -75,8 +76,8 @@ public final class HARuleConfigurationYamlSwapper
}
private HADataSourceRuleConfiguration swapToObject(final String name, final YamlHADataSourceRuleConfiguration yamlDataSourceRuleConfig) {
return new HADataSourceRuleConfiguration(name,
yamlDataSourceRuleConfig.getPrimaryDataSourceName(), yamlDataSourceRuleConfig.getReplicaDataSourceNames(), yamlDataSourceRuleConfig.getLoadBalancerName());
return new HADataSourceRuleConfiguration(name, yamlDataSourceRuleConfig.getPrimaryDataSourceName(), yamlDataSourceRuleConfig.getReplicaDataSourceNames(),
yamlDataSourceRuleConfig.getLoadBalancerName(), yamlDataSourceRuleConfig.getReadWriteSplit());
}
@Override
......
......@@ -34,26 +34,26 @@ import static org.junit.Assert.assertThat;
public final class HADataSourceRuleTest {
private final HADataSourceRule haDataSourceRule = new HADataSourceRule(
new HADataSourceRuleConfiguration("test_pr", "primary_ds", Arrays.asList("replica_ds_0", "replica_ds_1"), "random"), new RandomReplicaLoadBalanceAlgorithm());
new HADataSourceRuleConfiguration("test_pr", "primary_ds", Arrays.asList("replica_ds_0", "replica_ds_1"), "random", true), new RandomReplicaLoadBalanceAlgorithm());
@Test(expected = IllegalArgumentException.class)
public void assertNewHADataSourceRuleWithoutName() {
new HADataSourceRule(new HADataSourceRuleConfiguration("", "primary_ds", Collections.singletonList("replica_ds"), null), new RoundRobinReplicaLoadBalanceAlgorithm());
new HADataSourceRule(new HADataSourceRuleConfiguration("", "primary_ds", Collections.singletonList("replica_ds"), null, true), new RoundRobinReplicaLoadBalanceAlgorithm());
}
@Test(expected = IllegalArgumentException.class)
public void assertNewHADataSourceRuleWithoutPrimaryDataSourceName() {
new HADataSourceRule(new HADataSourceRuleConfiguration("ds", "", Collections.singletonList("replica_ds"), null), new RoundRobinReplicaLoadBalanceAlgorithm());
new HADataSourceRule(new HADataSourceRuleConfiguration("ds", "", Collections.singletonList("replica_ds"), null, true), new RoundRobinReplicaLoadBalanceAlgorithm());
}
@Test(expected = IllegalArgumentException.class)
public void assertNewHADataSourceRuleWithNullReplicaDataSourceName() {
new HADataSourceRule(new HADataSourceRuleConfiguration("ds", "primary_ds", null, null), new RoundRobinReplicaLoadBalanceAlgorithm());
new HADataSourceRule(new HADataSourceRuleConfiguration("ds", "primary_ds", null, null, true), new RoundRobinReplicaLoadBalanceAlgorithm());
}
@Test(expected = IllegalArgumentException.class)
public void assertNewHADataSourceRuleWithEmptyReplicaDataSourceName() {
new HADataSourceRule(new HADataSourceRuleConfiguration("ds", "primary_ds", Collections.emptyList(), null), new RoundRobinReplicaLoadBalanceAlgorithm());
new HADataSourceRule(new HADataSourceRuleConfiguration("ds", "primary_ds", Collections.emptyList(), null, true), new RoundRobinReplicaLoadBalanceAlgorithm());
}
@Test
......
......@@ -56,7 +56,7 @@ public final class HARuleTest {
private HARule createHARule() {
HADataSourceRuleConfiguration config =
new HADataSourceRuleConfiguration("test_pr", "primary_ds", Arrays.asList("replica_ds_0", "replica_ds_1"), "random");
new HADataSourceRuleConfiguration("test_pr", "primary_ds", Arrays.asList("replica_ds_0", "replica_ds_1"), "random", true);
return new HARule(new HARuleConfiguration(
Collections.singleton(config), ImmutableMap.of("random", new ShardingSphereAlgorithmConfiguration("RANDOM", new Properties()))));
}
......
......@@ -43,7 +43,7 @@ public final class AlgorithmProvidedHARuleBuilderTest {
public void assertBuild() {
AlgorithmProvidedHARuleConfiguration algorithmProvidedRuleConfig = mock(AlgorithmProvidedHARuleConfiguration.class);
HADataSourceRuleConfiguration ruleConfig = new HADataSourceRuleConfiguration(
"name", "primaryDataSourceName", Collections.singletonList("name"), "loadBalancerName");
"name", "primaryDataSourceName", Collections.singletonList("name"), "loadBalancerName", true);
when(algorithmProvidedRuleConfig.getDataSources()).thenReturn(Collections.singletonList(ruleConfig));
ShardingSphereRuleBuilder builder = OrderedSPIRegistry.getRegisteredServices(
Collections.singletonList(algorithmProvidedRuleConfig), ShardingSphereRuleBuilder.class).get(algorithmProvidedRuleConfig);
......
......@@ -43,7 +43,7 @@ public final class HARuleBuilderTest {
public void assertBuild() {
HARuleConfiguration ruleConfig = mock(HARuleConfiguration.class);
HADataSourceRuleConfiguration dataSourceRuleConfig = new HADataSourceRuleConfiguration(
"name", "primaryDataSourceName", Collections.singletonList("name"), "loadBalancerName");
"name", "primaryDataSourceName", Collections.singletonList("name"), "loadBalancerName", true);
when(ruleConfig.getDataSources()).thenReturn(Collections.singletonList(dataSourceRuleConfig));
ShardingSphereRuleBuilder builder = OrderedSPIRegistry.getRegisteredServices(Collections.singletonList(ruleConfig), ShardingSphereRuleBuilder.class).get(ruleConfig);
assertThat(builder.build(ruleConfig, Collections.emptyList()), instanceOf(HARule.class));
......
......@@ -85,7 +85,7 @@ public final class HARuleAlgorithmProviderConfigurationYamlSwapperTest {
private YamlHARuleConfiguration createYamlHARuleConfiguration() {
HADataSourceRuleConfiguration ruleConfig = new HADataSourceRuleConfiguration("name", "primaryDataSourceName",
Collections.singletonList("replicaDataSourceName"), "loadBalancerName");
Collections.singletonList("replicaDataSourceName"), "loadBalancerName", true);
return swapper.swapToYamlConfiguration(
new AlgorithmProvidedHARuleConfiguration(Collections.singletonList(ruleConfig), ImmutableMap.of("name", new RandomReplicaLoadBalanceAlgorithm())));
}
......
......@@ -50,7 +50,7 @@ public final class HARuleConfigurationYamlSwapperTest {
@Test
public void assertSwapToYamlWithLoadBalanceAlgorithm() {
HADataSourceRuleConfiguration dataSourceConfig =
new HADataSourceRuleConfiguration("ds", "primary", Collections.singletonList("replica"), "roundRobin");
new HADataSourceRuleConfiguration("ds", "primary", Collections.singletonList("replica"), "roundRobin", true);
YamlHARuleConfiguration actual = getHARuleConfigurationYamlSwapper().swapToYamlConfiguration(new HARuleConfiguration(
Collections.singleton(dataSourceConfig), ImmutableMap.of("roundRobin", new ShardingSphereAlgorithmConfiguration("ROUND_ROBIN", new Properties()))));
assertThat(actual.getDataSources().get("ds").getName(), is("ds"));
......@@ -61,7 +61,7 @@ public final class HARuleConfigurationYamlSwapperTest {
@Test
public void assertSwapToYamlWithoutLoadBalanceAlgorithm() {
HADataSourceRuleConfiguration dataSourceConfig = new HADataSourceRuleConfiguration("ds", "primary", Collections.singletonList("replica"), null);
HADataSourceRuleConfiguration dataSourceConfig = new HADataSourceRuleConfiguration("ds", "primary", Collections.singletonList("replica"), null, true);
YamlHARuleConfiguration actual = getHARuleConfigurationYamlSwapper().swapToYamlConfiguration(
new HARuleConfiguration(Collections.singleton(dataSourceConfig), Collections.emptyMap()));
assertThat(actual.getDataSources().get("ds").getName(), is("ds"));
......
......@@ -56,12 +56,14 @@ rules:
- primary_ds_0_replica_0
- primary_ds_0_replica_1
loadBalancerName: roundRobin
readWriteSplit: true
ds_1:
primaryDataSourceName: primary_ds_1
replicaDataSourceNames:
- primary_ds_1_replica_0
- primary_ds_1_replica_1
loadBalancerName: random
readWriteSplit: false
loadBalancers:
roundRobin:
type: ROUND_ROBIN
......
......@@ -39,7 +39,7 @@ public final class HADataSourceRouter {
* @return data source name
*/
public String route(final SQLStatement sqlStatement) {
if (isPrimaryRoute(sqlStatement)) {
if (isPrimaryRoute(sqlStatement) || !rule.getReadWriteSplit()) {
PrimaryVisitedManager.setPrimaryVisited();
return rule.getPrimaryDataSourceName();
}
......
......@@ -80,7 +80,7 @@ public final class HASQLRouterTest {
@Before
public void setUp() {
rule = new HARule(new HARuleConfiguration(Collections.singleton(
new HADataSourceRuleConfiguration(DATASOURCE_NAME, PRIMARY_DATASOURCE, Collections.singletonList(REPLICA_DATASOURCE), null)), Collections.emptyMap()));
new HADataSourceRuleConfiguration(DATASOURCE_NAME, PRIMARY_DATASOURCE, Collections.singletonList(REPLICA_DATASOURCE), null, true)), Collections.emptyMap()));
sqlRouter = (HASQLRouter) OrderedSPIRegistry.getRegisteredServices(Collections.singleton(rule), SQLRouter.class).get(rule);
}
......
......@@ -57,6 +57,7 @@ public class HASpringBootStarterTest {
assertThat(dataSourceRuleConfig.getName(), is("pr_ds"));
assertThat(dataSourceRuleConfig.getPrimaryDataSourceName(), is("primary_ds"));
assertThat(dataSourceRuleConfig.getLoadBalancerName(), is("random"));
assertTrue(dataSourceRuleConfig.getReadWriteSplit());
assertThat(dataSourceRuleConfig.getReplicaDataSourceNames().size(), is(2));
assertTrue(config.getDataSources().contains(dataSourceRuleConfig));
assertThat(config.getLoadBalanceAlgorithms().size(), is(1));
......
......@@ -20,3 +20,4 @@ spring.shardingsphere.rules.ha.load-balancers.random.type=RANDOM
spring.shardingsphere.rules.ha.data-sources.pr_ds.primary-data-source-name=primary_ds
spring.shardingsphere.rules.ha.data-sources.pr_ds.replica-data-source-names=replica_ds_0,replica_ds_1
spring.shardingsphere.rules.ha.data-sources.pr_ds.load-balancer-name=random
spring.shardingsphere.rules.ha.data-sources.pr_ds.read-write-split=true
......@@ -63,6 +63,7 @@ public final class HARuleBeanDefinitionParser extends AbstractBeanDefinitionPars
factory.addConstructorArgValue(element.getAttribute(HARuleBeanDefinitionTag.PRIMARY_DATA_SOURCE_NAME_ATTRIBUTE));
factory.addConstructorArgValue(parseReplicaDataSourcesRef(element));
factory.addConstructorArgValue(element.getAttribute(HARuleBeanDefinitionTag.LOAD_BALANCE_ALGORITHM_REF_ATTRIBUTE));
factory.addConstructorArgValue(element.getAttribute(HARuleBeanDefinitionTag.READ_WRITE_SPLIT_ATTRIBUTE));
return factory.getBeanDefinition();
}
......
......@@ -37,4 +37,6 @@ public final class HARuleBeanDefinitionTag {
public static final String REPLICA_DATA_SOURCE_NAMES_ATTRIBUTE = "replica-data-source-names";
public static final String LOAD_BALANCE_ALGORITHM_REF_ATTRIBUTE = "load-balance-algorithm-ref";
public static final String READ_WRITE_SPLIT_ATTRIBUTE = "read-write-split";
}
......@@ -38,6 +38,7 @@
<xsd:attribute name="primary-data-source-name" type="xsd:string" use="required" />
<xsd:attribute name="replica-data-source-names" type="xsd:string" use="required" />
<xsd:attribute name="load-balance-algorithm-ref" type="xsd:string" />
<xsd:attribute name="read-write-split" type="xsd:boolean" />
</xsd:complexType>
</xsd:element>
......
......@@ -32,6 +32,7 @@ import java.util.Map;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@ContextConfiguration(locations = "classpath:META-INF/spring/ha-application-context.xml")
public final class HASpringNamespaceTest extends AbstractJUnit4SpringContextTests {
......@@ -81,5 +82,6 @@ public final class HASpringNamespaceTest extends AbstractJUnit4SpringContextTest
assertThat(dataSourceRuleConfig.getPrimaryDataSourceName(), is("primary_ds"));
assertThat(dataSourceRuleConfig.getReplicaDataSourceNames(), is(Arrays.asList("replica_ds_0", "replica_ds_1")));
assertThat(dataSourceRuleConfig.getLoadBalancerName(), is("randomLoadbalancer"));
assertTrue(dataSourceRuleConfig.getReadWriteSplit());
}
}
......@@ -31,6 +31,6 @@
</ha:rule>
<ha:rule id="randomRule">
<ha:data-source-rule id="random_ds" primary-data-source-name="primary_ds" replica-data-source-names="replica_ds_0, replica_ds_1" load-balance-algorithm-ref="randomLoadbalancer" />
<ha:data-source-rule id="random_ds" primary-data-source-name="primary_ds" replica-data-source-names="replica_ds_0, replica_ds_1" load-balance-algorithm-ref="randomLoadbalancer" read-write-split="true"/>
</ha:rule>
</beans>
......@@ -72,6 +72,11 @@
<artifactId>shardingsphere-replica-query-route</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-ha-route</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-sharding-rewrite</artifactId>
......
......@@ -77,6 +77,11 @@
<artifactId>shardingsphere-replica-query-route</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-ha-route</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-sharding-rewrite</artifactId>
......
......@@ -87,3 +87,4 @@
# replicaDataSourceNames:
# - replica_ds_0
# - replica_ds_1
# readWriteSplit: false
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册