diff --git a/sentinel-extension/sentinel-datasource-etcd/README.md b/sentinel-extension/sentinel-datasource-etcd/README.md index 083f63ac..23d6129d 100644 --- a/sentinel-extension/sentinel-datasource-etcd/README.md +++ b/sentinel-extension/sentinel-datasource-etcd/README.md @@ -1,8 +1,10 @@ # Sentinel DataSource Etcd -Sentinel DataSource Etcd provides integration with Etcd so that 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). +> **NOTE**: This module requires JDK 1.8 or later. + To use Sentinel DataSource Etcd, you should add the following dependency: ```xml @@ -12,29 +14,26 @@ To use Sentinel DataSource Etcd, you should add the following dependency: x.y.z ``` -Configure Etcd Connect Properties By Config File (for example sentinel.properties) + +We could configure Etcd connection configuration by config file (for example `sentinel.properties`): ``` -csp.sentinel.etcd.end.points=http://ip1:port1,http://ip2:port2 +csp.sentinel.etcd.endpoints=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 +csp.sentinel.etcd.auth.enable=true # if ture, then open user/password or ssl check +csp.sentinel.etcd.authority=authority # ssl ``` -or JVM args(Add -D prefix) +Or we could configure via JVM -D args or via `SentinelConfig.setConfig(key, value)`. -Then you can create an `EtcdDataSource` and register to rule managers. -For instance: +Then we can create an `EtcdDataSource` and register to rule managers. For instance: ```java - //`rule_key` is the rule config key - ReadableDataSource> flowRuleEtcdDataSource = new EtcdDataSource<>(rule_key, (rule) -> JSON.parseArray(rule, FlowRule.class)); - FlowRuleManager.register2Property(flowRuleEtcdDataSource.getProperty()); +// `rule_key` is the rule config key +ReadableDataSource> 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) \ No newline at end of file diff --git a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdConfig.java b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdConfig.java index 387f5850..8977dfb0 100644 --- a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdConfig.java +++ b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdConfig.java @@ -19,15 +19,14 @@ import com.alibaba.csp.sentinel.config.SentinelConfig; import com.alibaba.csp.sentinel.util.StringUtil; /** - * Configure Etcd Connect Properties + * Etcd connection configuration. * * @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 END_POINTS = "csp.sentinel.etcd.endpoints"; 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"; @@ -36,7 +35,6 @@ public final class EtcdConfig { private final static String ENABLED = "true"; - public static String getEndPoints() { return SentinelConfig.getConfig(END_POINTS); } @@ -50,25 +48,21 @@ public final class EtcdConfig { } public static String getCharset() { - String etcdCharSet = SentinelConfig.getConfig(CHARSET); - if (StringUtil.isNotBlank(etcdCharSet)) { - return etcdCharSet; + 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; + return ENABLED.equalsIgnoreCase(SentinelConfig.getConfig(AUTH_ENABLE)); } public static String getAuthority() { return SentinelConfig.getConfig(AUTHORITY); } - private EtcdConfig() { - }; + private EtcdConfig() {} } diff --git a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java index 7b7e3795..48e503ef 100644 --- a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java +++ b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java @@ -18,6 +18,7 @@ package com.alibaba.csp.sentinel.datasource.etcd; import com.alibaba.csp.sentinel.datasource.AbstractDataSource; import com.alibaba.csp.sentinel.datasource.Converter; import com.alibaba.csp.sentinel.log.RecordLog; + import io.etcd.jetcd.ByteSequence; import io.etcd.jetcd.Client; import io.etcd.jetcd.KeyValue; @@ -38,48 +39,46 @@ import java.util.concurrent.CompletableFuture; */ public class EtcdDataSource extends AbstractDataSource { - - private Client client; + private final Client client; private Watch.Watcher watcher; - private String key; + private final String key; private Charset charset = Charset.forName(EtcdConfig.getCharset()); /** - * Create Etcd Data Source, Retrieve Connect Config Properties from ${@link EtcdConfig} + * Create an etcd data-source. The connection configuration will be retrieved from {@link EtcdConfig}. * - * @param key Config key - * @param parser Value Parser + * @param key config key + * @param parser data parser */ public EtcdDataSource(String key, Converter parser) { super(parser); if (!EtcdConfig.isAuthEnable()) { this.client = Client.builder() - .endpoints(EtcdConfig.getEndPoints().split(",")).build(); + .endpoints(EtcdConfig.getEndPoints().split(",")).build(); } else { this.client = Client.builder() - .endpoints(EtcdConfig.getEndPoints().split(",")) - .user(ByteSequence.from(EtcdConfig.getUser(), charset)) - .password(ByteSequence.from(EtcdConfig.getPassword(), charset)) - .authority(EtcdConfig.getAuthority()) - .build(); + .endpoints(EtcdConfig.getEndPoints().split(",")) + .user(ByteSequence.from(EtcdConfig.getUser(), charset)) + .password(ByteSequence.from(EtcdConfig.getPassword(), charset)) + .authority(EtcdConfig.getAuthority()) + .build(); } this.key = key; loadInitialConfig(); initWatcher(); - } - private void loadInitialConfig() { try { T newValue = loadConfig(); if (newValue == null) { - RecordLog.warn("[EtcdDataSource] WARN: initial application is null, you may have to check your data source"); + RecordLog.warn( + "[EtcdDataSource] Initial configuration is null, you may have to check your data source"); } getProperty().updateValue(newValue); } catch (Exception ex) { - RecordLog.warn("[EtcdDataSource] Error when loading initial application", ex); + RecordLog.warn("[EtcdDataSource] Error when loading initial configuration", ex); } } @@ -92,17 +91,16 @@ public class EtcdDataSource extends AbstractDataSource { T newValue = loadConfig(); getProperty().updateValue(newValue); } catch (Exception e) { - RecordLog.warn("[EtcdDataSource] update rule config error: ", e); + RecordLog.warn("[EtcdDataSource] Failed to update config", e); } } else if (eventType == WatchEvent.EventType.DELETE) { + RecordLog.info("[EtcdDataSource] Cleaning config for key <{0}>", key); getProperty().updateValue(null); - RecordLog.info("[EtcdDataSource] clean rule config of {0}", key); } } }); } - @Override public String readSource() throws Exception { CompletableFuture responseFuture = client.getKVClient().get(ByteSequence.from(key, charset)); @@ -116,7 +114,7 @@ public class EtcdDataSource extends AbstractDataSource { try { watcher.close(); } catch (Exception ex) { - RecordLog.info("[EtcdDataSource] close watcher error", ex); + RecordLog.info("[EtcdDataSource] Failed to close watcher", ex); } } if (client != null) {