From 9f2678eb6c401f1fcefdbcfeea5e5e8199e8d217 Mon Sep 17 00:00:00 2001 From: Eric Zhao Date: Sun, 9 Dec 2018 21:42:29 +0800 Subject: [PATCH] Update token client interface in sentinel-core - Add `start` and `stop` method for automatic control - Update TokenClientProvider using SpiLoader Signed-off-by: Eric Zhao --- .../{ => client}/ClusterTokenClient.java | 19 +++++++++++++- .../{ => client}/TokenClientProvider.java | 26 +++++++------------ 2 files changed, 27 insertions(+), 18 deletions(-) rename sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/{ => client}/ClusterTokenClient.java (68%) rename sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/{ => client}/TokenClientProvider.java (62%) diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/ClusterTokenClient.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/client/ClusterTokenClient.java similarity index 68% rename from sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/ClusterTokenClient.java rename to sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/client/ClusterTokenClient.java index c0243974..743bfcda 100644 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/ClusterTokenClient.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/client/ClusterTokenClient.java @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.cluster; +package com.alibaba.csp.sentinel.cluster.client; + +import com.alibaba.csp.sentinel.cluster.TokenServerDescriptor; +import com.alibaba.csp.sentinel.cluster.TokenService; /** * Token client interface for distributed flow control. @@ -29,4 +32,18 @@ public interface ClusterTokenClient extends TokenService { * @return current token server if connected, otherwise null */ TokenServerDescriptor currentServer(); + + /** + * Start the token client. + * + * @throws Exception some error occurs + */ + void start() throws Exception; + + /** + * Stop the token client. + * + * @throws Exception some error occurs + */ + void stop() throws Exception; } \ No newline at end of file diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/TokenClientProvider.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/client/TokenClientProvider.java similarity index 62% rename from sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/TokenClientProvider.java rename to sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/client/TokenClientProvider.java index 592046c9..c46a75ec 100644 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/TokenClientProvider.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/client/TokenClientProvider.java @@ -13,13 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.csp.sentinel.cluster; - -import java.util.ArrayList; -import java.util.List; -import java.util.ServiceLoader; +package com.alibaba.csp.sentinel.cluster.client; import com.alibaba.csp.sentinel.log.RecordLog; +import com.alibaba.csp.sentinel.util.SpiLoader; /** * Provider for a universal {@link ClusterTokenClient} instance. @@ -31,8 +28,6 @@ public final class TokenClientProvider { private static ClusterTokenClient client = null; - private static final ServiceLoader LOADER = ServiceLoader.load(ClusterTokenClient.class); - static { // Not strictly thread-safe, but it's OK since it will be resolved only once. resolveTokenClientInstance(); @@ -43,17 +38,14 @@ public final class TokenClientProvider { } private static void resolveTokenClientInstance() { - List clients = new ArrayList(); - for (ClusterTokenClient client : LOADER) { - clients.add(client); - } - - if (!clients.isEmpty()) { - // Get first. - client = clients.get(0); - RecordLog.info("[TokenClientProvider] Token client resolved: " + client.getClass().getCanonicalName()); + ClusterTokenClient resolvedClient = SpiLoader.loadFirstInstance(ClusterTokenClient.class); + if (resolvedClient == null) { + RecordLog.info( + "[TokenClientProvider] No existing cluster token client, cluster client mode will not be activated"); } else { - RecordLog.warn("[TokenClientProvider] No existing token client, resolve failed"); + client = resolvedClient; + RecordLog.info( + "[TokenClientProvider] Cluster token client resolved: " + client.getClass().getCanonicalName()); } }