Skip to content

Support Etcd datasource #1018

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 36 commits into from
Oct 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
11dba5e
com.alibaba.csp.sentinel.node.StatisticNode#curThreadNum
May 9, 2019
362f326
reformat the code according to Alibaba Java Coding Guideline
May 11, 2019
50d2a5a
reformat the code according to Alibaba Java Coding Guideline
May 11, 2019
509ecf2
Merge pull request #1 from alibaba/master
linlinisme May 25, 2019
01bda6b
Remove the one redundant space....
May 28, 2019
ce717e9
fix issue 62 : Support customized log directory and configuration pro…
May 31, 2019
b8e66b8
use System.getProperty to get the property
May 31, 2019
5c6600d
Merge pull request #2 from alibaba/master
linlinisme Jun 14, 2019
9999154
merge master latest code
Jun 14, 2019
8f9339b
using SentinelConfigLocator to load sentinel-core config, LogConfigLo…
Jun 19, 2019
2f485b4
Merge pull request #3 from alibaba/master
linlinisme Jun 19, 2019
c6dd24d
merge remote master
Jun 19, 2019
810d40a
fix typo
Jun 19, 2019
3f98b62
add null judge
Jun 19, 2019
23244e9
Reorganize the code
Jun 20, 2019
bd8a481
Reorganize the code
Jun 20, 2019
e6bbf79
add config test cases
Jun 25, 2019
c91b963
ConfigUtil.loadPropertiesFromFile when file not exist return null
Jun 25, 2019
d401c2f
rename classname and method name
Jun 27, 2019
85173a5
rename classname and method name
Jun 27, 2019
4510234
using File.separator to replace "/"
Jun 27, 2019
c068edd
support retrieve properties from classpath file
Jun 27, 2019
9af06c9
support retrieve properties from classpath file
Jun 27, 2019
014cda3
add feature support : retrieve properties from relative file
Jul 1, 2019
a899dc6
reformat code
Jul 1, 2019
419d97f
Merge pull request #4 from alibaba/master
linlinisme Jul 1, 2019
80f283e
Merge remote-tracking branch 'remotes/origin/master' into 20190531-fi…
Jul 1, 2019
14a1d5b
Revert "rename classname and method name"
Jul 5, 2019
ea18020
add copy right doc
Jul 5, 2019
c562474
reset commit
Jul 6, 2019
c71759f
remove unused code
Jul 6, 2019
d387b47
merge alibaba master
Jul 10, 2019
56d5df0
Merge pull request #6 from alibaba/master
linlinisme Jul 24, 2019
22cafd2
Merge pull request #7 from alibaba/master
linlinisme Aug 22, 2019
29519e9
Sentinel DataSource Etcd provides integration with Etcd
Aug 25, 2019
55d0b08
etcd source demo add linked url
Sep 8, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@
<artifactId>sentinel-datasource-apollo</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-etcd</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
Expand Down
1 change: 1 addition & 0 deletions sentinel-demo/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<module>sentinel-demo-apache-dubbo</module>
<module>sentinel-demo-spring-cloud-gateway</module>
<module>sentinel-demo-zuul-gateway</module>
<module>sentinel-demo-etcd-datasource</module>
</modules>

<dependencies>
Expand Down
48 changes: 48 additions & 0 deletions sentinel-demo/sentinel-demo-etcd-datasource/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?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.7.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>sentinel-demo-etcd-datasource</artifactId>

<dependencies>

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-etcd</artifactId>
</dependency>


<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${java.encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/*
* 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.datasource.etcd;


import io.etcd.jetcd.ByteSequence;
import io.etcd.jetcd.Client;

/**
* Etcd config sender for demo.
*
* @author lianglin
* @since 1.7.0
*/
public class EtcdConfigSender {

public static void main(String[] args) throws InterruptedException {


String rule_key = "sentinel_demo_rule_key";

Client client = Client.builder()
.endpoints("http://127.0.0.1:2379")
.user(ByteSequence.from("root".getBytes()))
.password(ByteSequence.from("12345".getBytes()))
.build();
final String rule = "[\n"
+ " {\n"
+ " \"resource\": \"TestResource\",\n"
+ " \"controlBehavior\": 0,\n"
+ " \"count\": 5.0,\n"
+ " \"grade\": 1,\n"
+ " \"limitApp\": \"default\",\n"
+ " \"strategy\": 0\n"
+ " }\n"
+ "]";
client.getKVClient()
.put(ByteSequence.from(rule_key.getBytes()), ByteSequence.from(rule.getBytes()));

System.out.println("setting rule success");
Thread.sleep(10000);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* 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.datasource.etcd;

import com.alibaba.csp.sentinel.config.SentinelConfig;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.etcd.EtcdConfig;
import com.alibaba.csp.sentinel.datasource.etcd.EtcdDataSource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;

import java.util.List;

/**
* @author lianglin
* @since 1.7.0
*/
public class EtcdDataSourceDemo {

public static void main(String[] args) {

String rule_key = "sentinel_demo_rule_key";
String yourUserName = "root";
String yourPassWord = "12345";
String endPoints = "http://127.0.0.1:2379";
SentinelConfig.setConfig(EtcdConfig.END_POINTS, endPoints);
SentinelConfig.setConfig(EtcdConfig.USER, yourUserName);
SentinelConfig.setConfig(EtcdConfig.PASSWORD, yourPassWord);
SentinelConfig.setConfig(EtcdConfig.CHARSET, "utf-8");
SentinelConfig.setConfig(EtcdConfig.AUTH_ENABLE, "true");

ReadableDataSource<String, List<FlowRule>> flowRuleEtcdDataSource = new EtcdDataSource<>(rule_key, (rule) -> JSON.parseArray(rule, FlowRule.class));
FlowRuleManager.register2Property(flowRuleEtcdDataSource.getProperty());
List<FlowRule> rules = FlowRuleManager.getRules();
System.out.println(rules);
}

}
1 change: 1 addition & 0 deletions sentinel-extension/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<module>sentinel-parameter-flow-control</module>
<module>sentinel-datasource-spring-cloud-config</module>
<module>sentinel-datasource-consul</module>
<module>sentinel-datasource-etcd</module>
</modules>

</project>
40 changes: 40 additions & 0 deletions sentinel-extension/sentinel-datasource-etcd/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Sentinel DataSource Etcd

Sentinel DataSource Etcd provides integration with Etcd so that Etcd
can be the dynamic rule data source of Sentinel. The data source uses push model (watcher).

To use Sentinel DataSource Etcd, you should add the following dependency:

```xml
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-etcd</artifactId>
<version>x.y.z</version>
</dependency>
```
Configure Etcd Connect Properties By Config File (for example sentinel.properties)

```
csp.sentinel.etcd.end.points=http://ip1:port1,http://ip2:port2
csp.sentinel.etcd.user=your_user
csp.sentinel.etcd.password=your_password
csp.sentinel.etcd.charset=your_charset
csp.sentinel.etcd.auth.enable=true //if ture open user/password or ssl check
csp.sentinel.etcd.authority=authority //ssl
```
or JVM args(Add -D prefix)


Then you can create an `EtcdDataSource` and register to rule managers.
For instance:

```java
//`rule_key` is the rule config key
ReadableDataSource<String, List<FlowRule>> flowRuleEtcdDataSource = new EtcdDataSource<>(rule_key, (rule) -> JSON.parseArray(rule, FlowRule.class));
FlowRuleManager.register2Property(flowRuleEtcdDataSource.getProperty());
```

> Note: It needs to update JDK version to JDK8


We've also provided an example: [sentinel-demo-etcd-datasource](https://github.com/alibaba/Sentinel/tree/master/sentinel-demo/sentinel-demo-etcd-datasource)
63 changes: 63 additions & 0 deletions sentinel-extension/sentinel-datasource-etcd/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?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-extension</artifactId>
<groupId>com.alibaba.csp</groupId>
<version>1.7.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>sentinel-datasource-etcd</artifactId>
<packaging>jar</packaging>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<jetcd.version>0.3.0</jetcd.version>
</properties>

<dependencies>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-extension</artifactId>
</dependency>

<dependency>
<groupId>io.etcd</groupId>
<artifactId>jetcd-core</artifactId>
<version>${jetcd.version}</version>
</dependency>


<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>



</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* 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.datasource.etcd;

import com.alibaba.csp.sentinel.config.SentinelConfig;
import com.alibaba.csp.sentinel.util.StringUtil;

/**
* Configure Etcd Connect Properties
*
* @author lianglin
* @since 1.7.0
*/
public final class EtcdConfig {


public final static String END_POINTS = "csp.sentinel.etcd.end.points";
public final static String USER = "csp.sentinel.etcd.user";
public final static String PASSWORD = "csp.sentinel.etcd.password";
public final static String CHARSET = "csp.sentinel.etcd.charset";
public final static String AUTH_ENABLE = "csp.sentinel.etcd.auth.enable";
public final static String AUTHORITY = "csp.sentinel.etcd.authority";

private final static String ENABLED = "true";


public static String getEndPoints() {
return SentinelConfig.getConfig(END_POINTS);
}

public static String getUser() {
return SentinelConfig.getConfig(USER);
}

public static String getPassword() {
return SentinelConfig.getConfig(PASSWORD);
}

public static String getCharset() {
String etcdCharSet = SentinelConfig.getConfig(CHARSET);
if (StringUtil.isNotBlank(etcdCharSet)) {
return etcdCharSet;
}
return SentinelConfig.charset();
}

public static boolean isAuthEnable() {
if (ENABLED.equalsIgnoreCase(SentinelConfig.getConfig(AUTH_ENABLE))) {
return true;
}
return false;
}

public static String getAuthority() {
return SentinelConfig.getConfig(AUTHORITY);
}

private EtcdConfig() {
};

}
Loading