Add demo module for Sentinel cluster flow control
Signed-off-by: Eric Zhao <sczyh16@gmail.com>
This commit is contained in:
parent
2735954afd
commit
f01fe2b437
|
|
@ -28,6 +28,7 @@
|
|||
<module>sentinel-demo-annotation-spring-aop</module>
|
||||
<module>sentinel-demo-parameter-flow-control</module>
|
||||
<module>sentinel-demo-slot-chain-spi</module>
|
||||
<module>sentinel-demo-cluster</module>
|
||||
</modules>
|
||||
|
||||
<dependencies>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>sentinel-demo</artifactId>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<version>1.4.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>sentinel-demo-cluster</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<artifactId>sentinel-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<artifactId>sentinel-transport-simple-http</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<artifactId>sentinel-parameter-flow-control</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<artifactId>sentinel-cluster-client-default</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<artifactId>sentinel-cluster-server-default</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba.csp</groupId>
|
||||
<artifactId>sentinel-datasource-nacos</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed 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 com.alibaba.csp.sentinel.demo.cluster;
|
||||
|
||||
import com.alibaba.csp.sentinel.Entry;
|
||||
import com.alibaba.csp.sentinel.EntryType;
|
||||
import com.alibaba.csp.sentinel.SphU;
|
||||
import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
|
||||
import com.alibaba.csp.sentinel.init.InitExecutor;
|
||||
import com.alibaba.csp.sentinel.slots.block.BlockException;
|
||||
|
||||
/**
|
||||
* <p>Run this demo with the following args: -Dproject.name=appA</p>
|
||||
*
|
||||
* @author Eric Zhao
|
||||
*/
|
||||
public class ClusterClientDemo {
|
||||
|
||||
public static void main(String[] args) {
|
||||
InitExecutor.doInit();
|
||||
|
||||
// Manually schedule the cluster mode to client.
|
||||
// In common, we need a scheduling system to modify the cluster mode automatically.
|
||||
// Command HTTP API: http://<ip>:<port>/setClusterMode?mode=<xxx>
|
||||
ClusterStateManager.setToClient();
|
||||
|
||||
String resourceName = "cluster-demo-entry";
|
||||
|
||||
// Assume we have a cluster flow rule for `demo-resource`: QPS = 5 in AVG_LOCAL mode.
|
||||
for (int i = 0; i < 10; i++) {
|
||||
tryEntry(resourceName);
|
||||
}
|
||||
}
|
||||
|
||||
private static void tryEntry(String res) {
|
||||
Entry entry = null;
|
||||
try {
|
||||
entry = SphU.entry(res, EntryType.IN, 1, "abc", "def");
|
||||
System.out.println("Passed");
|
||||
} catch (BlockException ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
if (entry != null) {
|
||||
entry.exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed 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 com.alibaba.csp.sentinel.demo.cluster;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import com.alibaba.csp.sentinel.cluster.server.ClusterTokenServer;
|
||||
import com.alibaba.csp.sentinel.cluster.server.SentinelDefaultTokenServer;
|
||||
import com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager;
|
||||
import com.alibaba.csp.sentinel.cluster.server.config.ServerTransportConfig;
|
||||
|
||||
/**
|
||||
* Cluster server demo (alone mode).
|
||||
*
|
||||
* Here we init the cluster server dynamic data sources in {@link com.alibaba.csp.sentinel.demo.cluster.init.DemoClusterServerInitFunc}.
|
||||
*
|
||||
* @author Eric Zhao
|
||||
* @since 1.4.0
|
||||
*/
|
||||
public class ClusterServerDemo {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// Not embedded mode by default (alone mode).
|
||||
ClusterTokenServer tokenServer = new SentinelDefaultTokenServer();
|
||||
|
||||
// A sample for manually load config for cluster server.
|
||||
// It's recommended to use dynamic data source to cluster manage config and rules.
|
||||
// See the sample in DemoClusterServerInitFunc for detail.
|
||||
ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig()
|
||||
.setIdleSeconds(600)
|
||||
.setPort(11111));
|
||||
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(DemoConstants.APP_NAME));
|
||||
|
||||
// Start the server.
|
||||
tokenServer.start();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed 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 com.alibaba.csp.sentinel.demo.cluster;
|
||||
|
||||
/**
|
||||
* @author Eric Zhao
|
||||
*/
|
||||
public final class DemoConstants {
|
||||
|
||||
public static final String APP_NAME = "appA";
|
||||
|
||||
public static final String FLOW_POSTFIX = "-flow-rules";
|
||||
public static final String PARAM_FLOW_POSTFIX = "-param-rules";
|
||||
|
||||
private DemoConstants() {}
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed 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 com.alibaba.csp.sentinel.demo.cluster.init;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfig;
|
||||
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfigManager;
|
||||
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
|
||||
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
|
||||
import com.alibaba.csp.sentinel.demo.cluster.DemoConstants;
|
||||
import com.alibaba.csp.sentinel.init.InitFunc;
|
||||
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
|
||||
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
|
||||
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
|
||||
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
|
||||
/**
|
||||
* @author Eric Zhao
|
||||
*/
|
||||
public class DemoClusterClientInitFunc implements InitFunc {
|
||||
|
||||
@Override
|
||||
public void init() throws Exception {
|
||||
final String remoteAddress = "localhost";
|
||||
final String groupId = "SENTINEL_GROUP";
|
||||
final String flowDataId = DemoConstants.APP_NAME + DemoConstants.FLOW_POSTFIX;
|
||||
final String paramDataId = DemoConstants.APP_NAME + DemoConstants.PARAM_FLOW_POSTFIX;
|
||||
final String configDataId = DemoConstants.APP_NAME + "-cluster-client-config";
|
||||
|
||||
ReadableDataSource<String, List<FlowRule>> ruleSource = new NacosDataSource<>(remoteAddress, groupId,
|
||||
flowDataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
|
||||
FlowRuleManager.register2Property(ruleSource.getProperty());
|
||||
ReadableDataSource<String, List<ParamFlowRule>> paramRuleSource = new NacosDataSource<>(remoteAddress, groupId,
|
||||
paramDataId, source -> JSON.parseObject(source, new TypeReference<List<ParamFlowRule>>() {}));
|
||||
ParamFlowRuleManager.register2Property(paramRuleSource.getProperty());
|
||||
|
||||
ReadableDataSource<String, ClusterClientConfig> dataSource = new NacosDataSource<>(remoteAddress, groupId,
|
||||
configDataId, source -> JSON.parseObject(source, new TypeReference<ClusterClientConfig>() {}));
|
||||
ClusterClientConfigManager.register2Property(dataSource.getProperty());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed 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 com.alibaba.csp.sentinel.demo.cluster.init;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.alibaba.csp.sentinel.cluster.flow.rule.ClusterFlowRuleManager;
|
||||
import com.alibaba.csp.sentinel.cluster.flow.rule.ClusterParamFlowRuleManager;
|
||||
import com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager;
|
||||
import com.alibaba.csp.sentinel.cluster.server.config.ServerTransportConfig;
|
||||
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
|
||||
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
|
||||
import com.alibaba.csp.sentinel.demo.cluster.DemoConstants;
|
||||
import com.alibaba.csp.sentinel.init.InitFunc;
|
||||
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
|
||||
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
|
||||
/**
|
||||
* @author Eric Zhao
|
||||
*/
|
||||
public class DemoClusterServerInitFunc implements InitFunc {
|
||||
|
||||
private final String remoteAddress = "localhost";
|
||||
private final String groupId = "SENTINEL_GROUP";
|
||||
private final String namespaceSetDataId = "cluster-server-namespace-set";
|
||||
private final String serverTransportDataId = "cluster-server-transport-config";
|
||||
|
||||
@Override
|
||||
public void init() throws Exception {
|
||||
// Register cluster flow rule property supplier which creates data source by namespace.
|
||||
ClusterFlowRuleManager.setPropertySupplier(namespace -> {
|
||||
ReadableDataSource<String, List<FlowRule>> ds = new NacosDataSource<>(remoteAddress, groupId,
|
||||
namespace + DemoConstants.FLOW_POSTFIX,
|
||||
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
|
||||
return ds.getProperty();
|
||||
});
|
||||
// Register cluster parameter flow rule property supplier.
|
||||
ClusterParamFlowRuleManager.setPropertySupplier(namespace -> {
|
||||
ReadableDataSource<String, List<ParamFlowRule>> ds = new NacosDataSource<>(remoteAddress, groupId,
|
||||
namespace + DemoConstants.PARAM_FLOW_POSTFIX,
|
||||
source -> JSON.parseObject(source, new TypeReference<List<ParamFlowRule>>() {}));
|
||||
return ds.getProperty();
|
||||
});
|
||||
|
||||
// Server namespace set (scope) data source.
|
||||
ReadableDataSource<String, Set<String>> namespaceDs = new NacosDataSource<>(remoteAddress, groupId,
|
||||
namespaceSetDataId, source -> JSON.parseObject(source, new TypeReference<Set<String>>() {}));
|
||||
ClusterServerConfigManager.registerNamespaceSetProperty(namespaceDs.getProperty());
|
||||
// Server transport configuration data source.
|
||||
ReadableDataSource<String, ServerTransportConfig> transportConfigDs = new NacosDataSource<>(remoteAddress,
|
||||
groupId, serverTransportDataId,
|
||||
source -> JSON.parseObject(source, new TypeReference<ServerTransportConfig>() {}));
|
||||
ClusterServerConfigManager.registerServerTransportProperty(transportConfigDs.getProperty());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
com.alibaba.csp.sentinel.demo.cluster.init.DemoClusterClientInitFunc
|
||||
com.alibaba.csp.sentinel.demo.cluster.init.DemoClusterServerInitFunc
|
||||
Loading…
Reference in New Issue