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()); } }