Signed-off-by: Eric Zhao <sczyh16@gmail.com>master
@@ -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 |