This commit is contained in:
周伟
2022-05-11 19:04:14 +08:00
parent 9440ac7291
commit d9c5ffd627
826 changed files with 0 additions and 481675 deletions

View File

@@ -25,13 +25,7 @@
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
@@ -55,289 +49,148 @@
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/深入理解 Sentinel/01 开篇词:一次服务雪崩问题排查经历.md.html">01 开篇词:一次服务雪崩问题排查经历.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/02 为什么需要服务降级以及常见的几种降级方式.md.html">02 为什么需要服务降级以及常见的几种降级方式.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/03 为什么选择 SentinelSentinel 与 Hystrix 的对比.md.html">03 为什么选择 SentinelSentinel 与 Hystrix 的对比.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/04 Sentinel 基于滑动窗口的实时指标数据统计.md.html">04 Sentinel 基于滑动窗口的实时指标数据统计.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/05 Sentinel 的一些概念与核心类介绍.md.html">05 Sentinel 的一些概念与核心类介绍.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/06 Sentinel 中的责任链模式与 Sentinel 的整体工作流程.md.html">06 Sentinel 中的责任链模式与 Sentinel 的整体工作流程.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/07 Java SPI 及 SPI 在 Sentinel 中的应用.md.html">07 Java SPI 及 SPI 在 Sentinel 中的应用.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/08 资源指标数据统计的实现全解析(上).md.html">08 资源指标数据统计的实现全解析(上).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/09 资源指标数据统计的实现全解析(下).md.html">09 资源指标数据统计的实现全解析(下).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/10 限流降级与流量效果控制器(上).md.html">10 限流降级与流量效果控制器(上).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/11 限流降级与流量效果控制器(中).md.html">11 限流降级与流量效果控制器(中).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/12 限流降级与流量效果控制器(下).md.html">12 限流降级与流量效果控制器(下).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/13 熔断降级与系统自适应限流.md.html">13 熔断降级与系统自适应限流.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/14 黑白名单限流与热点参数限流.md.html">14 黑白名单限流与热点参数限流.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/15 自定义 ProcessorSlot 实现开关降级.md.html">15 自定义 ProcessorSlot 实现开关降级.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/16 Sentinel 动态数据源:规则动态配置.md.html">16 Sentinel 动态数据源:规则动态配置.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/17 Sentinel 主流框架适配.md.html">17 Sentinel 主流框架适配.md.html</a>
</li>
<li>
<a class="current-tab" href="/专栏/深入理解 Sentinel/18 Sentinel 集群限流的实现(上).md.html">18 Sentinel 集群限流的实现(上).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/19 Sentinel 集群限流的实现(下).md.html">19 Sentinel 集群限流的实现(下).md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/20 结束语Sentinel 对应用的性能影响如何?.md.html">20 结束语Sentinel 对应用的性能影响如何?.md.html</a>
</li>
<li>
<a href="/专栏/深入理解 Sentinel/21 番外篇Sentinel 1.8.0 熔断降级新特性解读.md.html">21 番外篇Sentinel 1.8.0 熔断降级新特性解读.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
@@ -347,9 +200,6 @@
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
@@ -357,9 +207,6 @@
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
@@ -389,9 +236,6 @@
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
@@ -415,13 +259,7 @@ function hide_canvas() {
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
@@ -561,9 +399,6 @@ function hide_canvas() {
private int windowIntervalMs = RuleConstant.DEFAULT_WINDOW_INTERVAL_MS;
}
</code></pre>
<ul>
@@ -605,9 +440,6 @@ function hide_canvas() {
extends AbstractDataSource&lt;String, List&lt;FlowRule&gt;&gt;
implements Runnable{
public SimpleLocalDataSource(String namespace) {
super(new SimpleConverter&lt;String, List&lt;FlowRule&gt;&gt;() {});
@@ -617,9 +449,6 @@ function hide_canvas() {
new Thread(this).start();
}
@Override
public String readSource() throws Exception {
@@ -629,17 +458,11 @@ function hide_canvas() {
return &quot;&quot;;
}
@Override
public void close() throws Exception {
}
@Override
public void run() {
@@ -661,9 +484,6 @@ function hide_canvas() {
}
}
</code></pre>
<p>SimpleLocalDataSource 构造方法中启动一个线程,用于实现等待动态数据源对象注册到 ClusterFlowRuleManager 之后再模拟加载一次规则。由于是测试,所以 readSource 方法并未实现,我们直接在 SimpleConverter 这个转换器中虚构一个集群限流规则,代码如下。</p>
@@ -699,9 +519,6 @@ function hide_canvas() {
}
}
</code></pre>
<p>接下来,我们将使用这个动态数据源实现集群限流客户端和服务端的配置。</p>
@@ -719,9 +536,6 @@ function hide_canvas() {
&lt;version&gt;${version}&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>将身份设置为集群限流客户端CLUSTER_CLIENT并且注册客户端配置ClusterClientConfig代码如下。</p>
@@ -747,9 +561,6 @@ public class WebMvcDemoApplication {
}
}
</code></pre>
<p>在 Spring 项目中,可通过监听 ContextRefreshedEvent 事件,在 Spring 容器启动完成后再初始化创建动态数据源、为 FlowRuleManager 注册动态数据源的 SentinelProperty代码如下。</p>
@@ -771,9 +582,6 @@ public class WebMvcDemoApplication implements ApplicationListener&lt;ContextRefr
}
}
</code></pre>
<p>最后注册用于连接到集群限流服务端的配置ClusterClientAssignConfig指定集群限流服务端的 IP 和端口,代码如下。</p>
@@ -799,9 +607,6 @@ public class WebMvcDemoApplication {
}
}
</code></pre>
<p>当 ClusterClientConfigManager#applyNewAssignConfig 方法被调用时,会触发 Sentinel 初始化或重新连接到集群限流服务端所以我们看不到启动集群限流客户端的代码。Sentinel 还支持当客户端与服务端意外断开连接时,让客户端不断的重试重连。</p>
@@ -823,17 +628,11 @@ public class WebMvcDemoApplication {
&lt;version&gt;${version}&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>在独立模式下,需要我们自己手动创建 ClusterTokenServer 并启动,在启动之前需指定服务监听的端口和连接最大空闲等待时间等配置,代码如下。</p>
<pre><code class="language-java">public class ClusterServerDemo {
public static void main(String[] args) throws Exception {
ClusterTokenServer tokenServer = new SentinelDefaultTokenServer();
@@ -853,9 +652,6 @@ public class WebMvcDemoApplication {
}
}
</code></pre>
<p>接着我们需要为服务端创建用于加载集群限流规则的动态数据源,在创建动态数据源时,需指定数据源只加载哪个名称空间下的限流规则配置,如下代码所示。</p>
@@ -879,9 +675,6 @@ public class WebMvcDemoApplication {
}
});
</code></pre>
<p>从代码中可以看出,我们注册的是一个 Java8 的 Function这个 Function 的 apply 方法将在我们注册名称空间时触发调用。</p>
@@ -891,9 +684,6 @@ public class WebMvcDemoApplication {
<pre><code class="language-java">// 多个应用应该对应多个名称空间,应用之间通过名称空间互相隔离
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;serviceA&quot;));
</code></pre>
<p>名称空间可以有多个,如果存在多个名称空间,则会多次调用 ClusterFlowRuleManager#setPropertySupplier 注册的 Function 对象的 apply 方法创建多个动态数据源。多个应用应该对应多个名称空间,应用之间通过名称空间互相隔离。</p>
@@ -907,9 +697,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
<p>如果是嵌入模式启动,除非一开始我们就清楚的知道应用会部署多少个节点,这些节点的 IP 是什么并且不会改变否则我们无法使用静态配置的方式去指定某个节点的角色。Sentinel 为此提供了支持动态改变某个节点角色的 API使用方式如下</p>
<pre><code class="language-java">http://&lt;节点 ip&gt;:&lt;节点 port&gt;/setClusterMode?mode={state}
</code></pre>
<p>其中 <code>{state}</code> 为 0 代表集群限流客户端,为 1 代表集群限流服务端。当一个新的节点被选为集群限流服务端后,旧的集群限流服务端节点也应该变为集群限流客户端,并且其它的节点都需要作出改变以连接到这个新的集群限流服务端。</p>
@@ -917,9 +704,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
<p>Sentinel 提供动态修改 ClusterClientAssignConfig、ClusterClientConfig 的 API使用方式如下</p>
<pre><code class="language-java">http://&lt;节点 ip&gt;:&lt;节点 port&gt;/cluster/client/modifyConfig?data={body}
</code></pre>
<p>其中 <code>{body}</code> 要求是 JSON 格式的字符串,支持的参数配置如下:</p>
@@ -969,9 +753,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
</div>
</div>
</div>
</div>
@@ -979,9 +760,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
@@ -997,17 +775,11 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
@@ -1033,9 +805,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
@@ -1047,9 +816,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
@@ -1067,12 +833,6 @@ ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(&quot;se
return "";
}
</script>
</html>