Default cluster client implementation for Sentinel cluster flow control
npx @tessl/cli install tessl/maven-com-alibaba-csp--sentinel-cluster-client-default@1.8.0The Sentinel Cluster Client Default provides the default cluster client implementation for Sentinel's distributed flow control capabilities. It enables coordination between multiple application instances through a centralized cluster server using high-performance Netty communication.
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-cluster-client-default</artifactId>
<version>1.8.8</version>
</dependency>import com.alibaba.csp.sentinel.cluster.client.DefaultClusterTokenClient;
import com.alibaba.csp.sentinel.cluster.client.ClusterTokenClient;
import com.alibaba.csp.sentinel.cluster.client.NettyTransportClient;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfigManager;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfig;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientAssignConfig;
import com.alibaba.csp.sentinel.cluster.client.codec.registry.RequestDataWriterRegistry;
import com.alibaba.csp.sentinel.cluster.client.codec.registry.ResponseDataDecodeRegistry;
import com.alibaba.csp.sentinel.command.handler.ModifyClusterClientConfigHandler;
import com.alibaba.csp.sentinel.command.handler.FetchClusterClientConfigHandler;
import com.alibaba.csp.sentinel.command.entity.ClusterClientStateEntity;import com.alibaba.csp.sentinel.cluster.client.DefaultClusterTokenClient;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfigManager;
import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientAssignConfig;
import com.alibaba.csp.sentinel.cluster.TokenResult;
import com.alibaba.csp.sentinel.cluster.TokenResultStatus;
// Configure server connection
ClusterClientAssignConfig assignConfig = new ClusterClientAssignConfig("localhost", 8719);
ClusterClientConfigManager.applyNewAssignConfig(assignConfig);
// Create and start client
DefaultClusterTokenClient client = new DefaultClusterTokenClient();
client.start();
// Request flow control tokens
TokenResult result = client.requestToken(12345L, 1, false);
if (result.getStatus() == TokenResultStatus.OK) {
// Token acquired successfully
System.out.println("Remaining tokens: " + result.getRemaining());
} else {
// Token request failed or blocked
System.out.println("Request failed: " + result.getStatus());
}
// Clean up
client.stop();The Sentinel Cluster Client Default is built around several key components:
DefaultClusterTokenClient provides the main API for requesting flow control tokens from cluster serversNettyTransportClient handles high-performance network communication using NettyClusterClientConfigManager manages dynamic configuration updates for server assignments and client settingsMain interface for requesting flow control tokens from the cluster server. Supports regular flow control, parameterized flow control, and connection lifecycle management.
public class DefaultClusterTokenClient implements ClusterTokenClient {
public DefaultClusterTokenClient();
public void start() throws Exception;
public void stop() throws Exception;
public int getState();
public TokenServerDescriptor currentServer();
public TokenResult requestToken(Long flowId, int acquireCount, boolean prioritized);
public TokenResult requestParamToken(Long flowId, int acquireCount, Collection<Object> params);
}Dynamic configuration system for managing cluster server assignments and client settings. Supports property-based configuration updates and server change notifications.
public final class ClusterClientConfigManager {
public static void applyNewConfig(ClusterClientConfig config);
public static void applyNewAssignConfig(ClusterClientAssignConfig assignConfig);
public static void addServerChangeObserver(ServerChangeObserver observer);
public static String getServerHost();
public static int getServerPort();
public static int getRequestTimeout();
}Low-level Netty transport client for cluster server communication. Handles connection management, reconnection logic, and request/response processing.
public class NettyTransportClient implements ClusterTransportClient {
public NettyTransportClient(String host, int port);
public void start() throws Exception;
public void stop() throws Exception;
public boolean isReady();
public ClusterResponse sendRequest(ClusterRequest request) throws Exception;
}Request and response encoding/decoding system for efficient network serialization. Provides extensible registry for custom data types and protocols.
public final class RequestDataWriterRegistry {
public static <T> boolean addWriter(int type, EntityWriter<T, ByteBuf> writer);
public static EntityWriter<Object, ByteBuf> getWriter(int type);
}
public final class ResponseDataDecodeRegistry {
public static boolean addDecoder(int type, EntityDecoder<ByteBuf, ?> decoder);
public static EntityDecoder<ByteBuf, Object> getDecoder(int type);
}HTTP command handlers for runtime configuration and monitoring of cluster client settings and state.
@CommandMapping(name = "cluster/client/modifyConfig", desc = "modify cluster client config")
public class ModifyClusterClientConfigHandler implements CommandHandler<String> {
public CommandResponse<String> handle(CommandRequest request);
}
@CommandMapping(name = "cluster/client/fetchConfig", desc = "get cluster client config")
public class FetchClusterClientConfigHandler implements CommandHandler<String> {
public CommandResponse<String> handle(CommandRequest request);
}// Configuration classes
public class ClusterClientConfig {
public Integer getRequestTimeout();
public ClusterClientConfig setRequestTimeout(Integer requestTimeout);
}
public class ClusterClientAssignConfig {
public ClusterClientAssignConfig(String serverHost, Integer serverPort);
public String getServerHost();
public Integer getServerPort();
public ClusterClientAssignConfig setServerHost(String serverHost);
public ClusterClientAssignConfig setServerPort(Integer serverPort);
}
// Observer interface
public interface ServerChangeObserver {
void onRemoteServerChange(ClusterClientAssignConfig assignConfig);
}
// Command entity for state management and HTTP command interfaces
public class ClusterClientStateEntity {
public String getServerHost();
public ClusterClientStateEntity setServerHost(String serverHost);
public Integer getServerPort();
public ClusterClientStateEntity setServerPort(Integer serverPort);
public Integer getClientState();
public ClusterClientStateEntity setClientState(Integer clientState);
public Integer getRequestTimeout();
public ClusterClientStateEntity setRequestTimeout(Integer requestTimeout);
public ClusterClientConfig toClientConfig();
public ClusterClientAssignConfig toAssignConfig();
}
// Constants
public final class ClientConstants {
public static final int TYPE_PING = 0;
public static final int TYPE_FLOW = 1;
public static final int TYPE_PARAM_FLOW = 2;
public static final int CLIENT_STATUS_OFF = 0;
public static final int CLIENT_STATUS_PENDING = 1;
public static final int CLIENT_STATUS_STARTED = 2;
}