Sentinel教程进阶八ClusterServerConfigManager
声明了三个属性,为属性添加监听器
/**
* Property for cluster server global transport configuration.
*/
private static SentinelProperty<ServerTransportConfig> transportConfigProperty = new DynamicSentinelProperty<>();
/**
* Property for cluster server namespace set.
*/
private static SentinelProperty<Set<String>> namespaceSetProperty = new DynamicSentinelProperty<>();
/**
* Property for cluster server global flow control configuration.
*/
private static SentinelProperty<ServerFlowConfig> globalFlowProperty = new DynamicSentinelProperty<>();
private static final PropertyListener<ServerTransportConfig> TRANSPORT_PROPERTY_LISTENER
= new ServerGlobalTransportPropertyListener();
private static final PropertyListener<ServerFlowConfig> GLOBAL_FLOW_PROPERTY_LISTENER
= new ServerGlobalFlowPropertyListener();
private static final PropertyListener<Set<String>> NAMESPACE_SET_PROPERTY_LISTENER
= new ServerNamespaceSetPropertyListener();
static {
transportConfigProperty.addListener(TRANSPORT_PROPERTY_LISTENER);
globalFlowProperty.addListener(GLOBAL_FLOW_PROPERTY_LISTENER);
namespaceSetProperty.addListener(NAMESPACE_SET_PROPERTY_LISTENER);
}
ServerGlobalTransportPropertyListener#
监听server的端口配置
当我们修改端口,保存后,sentinel后台会调用服务的sentinel-api /cluster/server/modifyTransportConfig
进而触发transportConfigProperty的改变,进而再触发ServerGlobalTransportPropertyListener的configUpdate方法,最后会重启token-server到新的端口
com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager.ServerGlobalTransportPropertyListener#configUpdate
@Override
public void configUpdate(ServerTransportConfig config) {
applyConfig(config);
}
com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager.ServerGlobalTransportPropertyListener#applyConfig
private synchronized void applyConfig(ServerTransportConfig config) {
if (!isValidTransportConfig(config)) {
RecordLog.warn(
"[ClusterServerConfigManager] Invalid cluster server transport config, ignoring: {}", config);
return;
}
RecordLog.info("[ClusterServerConfigManager] Updating new server transport config: {}", config);
if (config.getIdleSeconds() != idleSeconds) {
idleSeconds = config.getIdleSeconds();
}
//!!!
updateTokenServer(config);
}
com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager#updateTokenServer
private static void updateTokenServer(ServerTransportConfig config) {
int newPort = config.getPort();
AssertUtil.isTrue(newPort > 0, "token server port should be valid (positive)");
if (newPort == port) {
return;
}
ClusterServerConfigManager.port = newPort;
for (ServerTransportConfigObserver observer : TRANSPORT_CONFIG_OBSERVERS) {
//!!!
observer.onTransportConfigChange(config);
}
}
com.alibaba.csp.sentinel.cluster.server.SentinelDefaultTokenServer#changeServerConfig
private synchronized void changeServerConfig(ServerTransportConfig config) {
if (config == null || config.getPort() <= 0) {
return;
}
int newPort = config.getPort();
if (newPort == port) {
return;
}
try {
if (server != null) {
stopServer();
}
this.server = new NettyTransportServer(newPort);
this.port = newPort;
startServerIfScheduled();
} catch (Exception ex) {
RecordLog.warn("[SentinelDefaultTokenServer] Failed to apply modification to token server", ex);
}
}
ServerGlobalFlowPropertyListener#
监听token-server最大允许qps的改变
当我们修改最大允许QPS并保存后,sentinel后台会调用服务的token-api cluster/server/modifyFlowConfig
进而触发globalFlowProperty的改变,进而再触发ServerGlobalFlowPropertyListener的configUpdate方法
ServerNamespaceSetPropertyListener#
待研究
作者:roylee666
出处:https://www.cnblogs.com/roylee666/p/15847435.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库