- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
这也不是一篇非常详细的源码领读,源码细节还需你自己仔细咀嚼
这只是我在改了些sentinel bug后,梳理的脉络,主要是脉络。看完后对Sentinel的源码模块划分和大致交互有个整体印象。
从而在想知道细节时知道从哪里下手。
Sentinel功能强大,但是开源出来的sentinel可以说是一个半成品,bug多,并且很多功能没有实现,可能是因为它有收费的版本吧。因此我们如果想在生产上应用就要戒骄戒躁,了解它的源码,对它进行优化改造。在改造过程中不可避免的要调用sentinel的api接口进行一些规则的同步等操作。
服务集成sentinel的方式
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
启动服务后,一旦访问了接口,sentinel会通过websocket或netty的方式监听8719(默认)端口,提供一些接口方便我们以http的方式调用取获取、修改sentinel的限流规则,集群配置等。
监听的端口默认是8719,但是如果端口被占用,就会换自动换端口,具体换端口逻辑是8719+重试次数/3,这个没什么意思,不比深究。
具体启动端口监听的逻辑在com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc中,该类在sentinel-transport-common模块中,具体依赖如下
@InitOrder(-1)
public class CommandCenterInitFunc implements InitFunc {
@Override
public void init() throws Exception {
//commandCenter默认是SimpleHttpCommandCenter
CommandCenter commandCenter = CommandCenterProvider.getCommandCenter();
if (commandCenter == null) {
RecordLog.warn("[CommandCenterInitFunc] Cannot resolve CommandCenter");
return;
}
commandCenter.beforeStart();
//启动监听
commandCenter.start();
RecordLog.info("[CommandCenterInit] Starting command center: "
+ commandCenter.getClass().getCanonicalName());
}
}
上述代码中commandCenter默认是SimpleHttpCommandCenter,如果引入sentinel-transport-netty-http,则它就会变成NettyHttpCommandCenter,具体原因是sentinel为spi类定义了一个order属性,NettyHttpCommandCenter的order属性更高
具体模块之间的关系如下如
端口可通过参数:csp.sentinel.api.port指定。
具体启动逻辑可以自己跟一下,比较简单。
具体有哪些接口呢?
com.alibaba.csp.sentinel.command.CommandHandler接口的所有实现类
我们可以通过调用localhost:port/api获取到所有的api
这些handler基本上分布在三个模块中
ApiCommandHandler | /api | 获取所有接口 | |
---|---|---|---|
FetchClusterModeCommandHandler | /getClusterMode | 获取集群模式信息 | |
ModifyClusterModeCommandHandler | /setClusterMode | 修改集群模式 | |
BasicInfoCommandHandler | /basicInfo | 获取服务基本信息 | |
FetchActiveRuleCommandHandler | /getRules | 获取规则,参数type flow|degrade|authority|system | |
FetchClusterNodeByIdCommandHandler | /clusterNodeById | 根据id查询clustNode信息 | |
FetchClusterNodeHumanCommandHandler | /cnode | get clusterNode metrics by id, request param: id= | |
FetchJsonTreeCommandHandler | /jsonTree | 簇点链路 | |
FetchOriginCommandHandler | /origin | get origin clusterNode by id, request param: id= | |
FetchSimpleClusterNodeCommandHandler | /clusterNode | get all clusterNode VO, use type=notZero to ignore those nodes with totalRequest <=0 | |
FetchSystemStatusCommandHandler | /systemStatus | get system status | |
FetchTreeCommandHandler | /tree | get metrics in tree mode, use id to specify detailed tree root 统计信息 | |
ModifyRulesCommandHandler | /setRules | 更新规则 | |
OnOffGetCommandHandler | /getSwitch | get sentinel switch status | |
OnOffSetCommandHandler | /setSwitch | set sentinel switch, accept param: value= | |
SendMetricCommandHandler | /metric | get and aggregate metrics, accept param:startTime={startTime}&endTime={endTime}&maxLines={maxLines}&identify= | |
VersionCommandHandler | /version | sentinel版本 | 1.8.1 |
FetchClusterClientConfigHandler | /cluster/client/fetchConfig | 获取集群-客户端配置 |
---|---|---|
ModifyClusterClientConfigHandler | /cluster/client/modifyConfig | 修改集群-客户端配置 |
FetchClusterFlowRulesCommandHandler | /cluster/server/flowRules | 获取集群限流规则 |
---|---|---|
FetchClusterParamFlowRulesCommandHandler | /cluster/server/paramRules | 获取集群热点参数规则 |
FetchClusterServerConfigHandler | /cluster/server/fetchConfig | 获取集群server配置 |
FetchClusterServerInfoCommandHandler | /cluster/server/info | 获取集群server信息 |
FetchClusterMetricCommandHandler | /cluster/server/metricList | 获取集群统计信息 |
ModifyClusterFlowRulesCommandHandler | /cluster/server/modifyFlowRules | 修改集群限流规则 |
ModifyClusterParamFlowRulesCommandHandler | /cluster/server/modifyParamRules | 修改集群热点参数规则 |
ModifyClusterServerFlowConfigHandler | /cluster/server/modifyFlowConfig | 待查看 |
ModifyClusterServerTransportConfigHandler | /cluster/server/modifyTransportConfig | 修改集群server配置 |
ModifyServerNamespaceSetHandler | /cluster/server/modifyNamespaceSet | 修改namespace信息 |
public class SimpleHttpCommandCenter implements CommandCenter {
public void run() {
boolean success = false;
ServerSocket serverSocket = SimpleHttpCommandCenter.getServerSocketFromBasePort(this.port);
if (serverSocket != null) {
CommandCenterLog.info("[CommandCenter] Begin listening at port " + serverSocket.getLocalPort(), new Object[0]);
SimpleHttpCommandCenter.this.socketReference = serverSocket;
SimpleHttpCommandCenter.this.executor.submit(SimpleHttpCommandCenter.this.new ServerThread(serverSocket));
success = true;
this.port = serverSocket.getLocalPort();
} else {
CommandCenterLog.info("[CommandCenter] chooses port fail, http command center will not work", new Object[0]);
}
if (!success) {
this.port = -1;
}
TransportConfig.setRuntimePort(this.port);
SimpleHttpCommandCenter.this.executor.shutdown();
}
}
项目集成sentinel启动后,api服务并不会启动,而是等到项目被访问的时候才会被启动,具体的方式是启动一个netty服务监听8719端口(默认)
SphU.entry("testRule1", EntryType.IN, 1, id);
我正在做一个关于代码学院的教程,我在这里收到一个错误,说“看起来你的函数没有返回‘唉,你没有资格获得信用卡。资本主义就是这样残酷。’”当收入参数为 75 时。”但是该字符串在控制台中返回(由于某种原因
我正在阅读 Go 的官方教程,但很难理解 Channel 和 Buffered Channels 之间的区别。教程的链接是 https://tour.golang.org/concurrency/2和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
作为 iOS 新手,有大量书籍可以满足学习基础知识的需求。现在,我想转向一些高级阅读,例如 OAuth 和 SQLite 以及动态 API 派生的 TableView 等。您可以推荐任何资源吗? 最佳
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 年前。
前言 很多同学都知道,我们常见的CTF赛事除了解题赛之外,还有一种赛制叫AWD赛制。在这种赛制下,我们战队会拿到一个或多个服务器。服务器的连接方式通常是SSH链接,并且可能一个战队可能会同时有
Memcached是一个自由开源的,高性能,分布式内存键值对缓存系统 Memcached 是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象),这些数据可以是数据库调用、A
Perl 又名实用报表提取语言, 是 Practical Extraction and Report Language 的缩写 Perl 是由 拉里·沃尔(Larry Wall)于19
WSDL 是 Web Services Description Language 的缩写,翻译成中文就是网络服务描述语言 WSDL 是一门基于 XML 的语言,用于描述 Web Services 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在寻找解释在 WPF 中创建自定义用户控件的教程。 我想要一个控件,它结合了一个文本 block 、一个文本框和一个启动通用文件打开对话框的按钮。我已经完成了布局,一切都连接好了。它有效,但它是三
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我接近 fourth page of the Django tutorial 的开始看着vote查看,最后是这样的: # Always return an HttpResponseRedirect a
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否有任何好的 Qt QSS 教程,或者在某个地方我可以看到样式小部件的示例?如果某处可用,我想要一些完整的引用。除了有关如何设置按钮或某些选项卡样式的小教程外,我找不到任何其他内容。 最佳答案 Qt
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!