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 class="current-tab" href="/专栏/深入理解 Sentinel/17 Sentinel 主流框架适配.md.html">17 Sentinel 主流框架适配.md.html</a>
</li>
<li>
<a 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">
@@ -483,9 +321,6 @@ function hide_canvas() {
&lt;version&gt;${version}&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>第二步:编写 WebMvcConfigurer在 addInterceptors 方法中注入 SentinelWebInterceptor。</p>
@@ -513,9 +348,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
}
}
</code></pre>
<p>在创建 SentinelWebInterceptor 时,可为 SentinelWebInterceptor 添加配置,使用 SentinelWebMvcConfig 封装这些配置:</p>
@@ -551,9 +383,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
}
}
</code></pre>
<p>HandlerInterceptor 在 DispatcherServlet#doDispatch 方法中被调用,每个方法的调用时机如下:</p>
@@ -609,9 +438,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
return resourceName;
}
</code></pre>
<p>资源名称生成过程如下。</p>
@@ -677,9 +503,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
}
}
</code></pre>
<ol>
@@ -715,9 +538,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
}
}
</code></pre>
<p>如果我们给 SentinelWebMvcConfig 配置了 BlockExceptionHandler则调用 BlockExceptionHandler#handle 方法处理 BlockException 异常,否则将异常抛出,由全局处理器处理。</p>
@@ -749,9 +569,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
ContextUtil.exit();
}
</code></pre>
<ol>
@@ -781,9 +598,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
}
}
</code></pre>
<p>当方法执行抛出异常时,调用 Tracer#traceEntry 方法记录异常,更新异常指标数据。</p>
@@ -807,9 +621,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
&lt;version&gt;2.2.1.RELEASE&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p><strong>2. 启用 OpenFeign 整合 Sentinel 的自动配置</strong></p>
@@ -821,9 +632,6 @@ public class InterceptorConfig implements WebMvcConfigurer {
sentinel:
enabled: true
</code></pre>
<p><strong>3. 熔断降级规则配置</strong></p>
@@ -843,19 +651,10 @@ public class InterceptorConfig implements WebMvcConfigurer {
fallback = ServiceDegradeFallback.class)
public interface DemoService {
@PostMapping(&quot;/services&quot;)
ListGenericResponse&lt;DemoDto&gt; getServices();
}
</code></pre>
<p>fallback 属性要求配置一个类,该类必须实现相同的接口,所以 ServiceDegradeFallback 必须实现 DemoService 接口。</p>
@@ -877,9 +676,6 @@ public interface DemoService {
}
}
</code></pre>
<p>ServiceDegradeFallback 类中处理接口降级逻辑,例如,响应一个状态码告知消费端由于服务降级本次接口调用失败。</p>
@@ -899,9 +695,6 @@ public interface DemoService {
}
}
</code></pre>
<p>将 SentinelFeignConfig 配置类添加到 @FeignClient 注解的 configuration 属性,如下:</p>
@@ -923,19 +716,10 @@ public interface DemoService {
fallback = ServiceDegradeFallback.class)
public interface DemoService {
@PostMapping(&quot;/services&quot;)
ListGenericResponse&lt;DemoDto&gt; getServices();
}
</code></pre>
<p>当满足熔断条件时Sentinel 会抛出一个 DegradeException 异常,如果配置了 fallback那么 Sentinel 会从 Bean 工厂中根据 fallback 属性配置的类型取一个 Bean 并调用接口方法。</p>
@@ -977,9 +761,6 @@ public interface DemoService {
@ConditionalOnClass({ SphU.class, Feign.class })
public class SentinelFeignAutoConfiguration {
@Bean
@Scope(&quot;prototype&quot;)
@@ -993,39 +774,21 @@ public class SentinelFeignAutoConfiguration {
return SentinelFeign.builder();
}
}
</code></pre>
<p>SentinelFeign.Builder 继承 Feign.Builder 并重写 build 方法SentinelFeign.Builder#build 方法源码如下:</p>
<pre><code class="language-java">public final class SentinelFeign {
public static Builder builder() {
return new Builder();
}
public static final class Builder extends Feign.Builder
implements ApplicationContextAware {
// .....
@Override
public Feign build() {
@@ -1053,13 +816,7 @@ public class SentinelFeignAutoConfiguration {
// .....
}
}
</code></pre>
<p>SentinelFeign.Builder#build 偷天换日,替换了 InvocationHandlerFactory所以 OpenFeign 调用 InvocationHandlerFactory#create 方法创建的 InvocationHandler 就变成了 SentinelInvocationHandler。</p>
@@ -1077,9 +834,6 @@ Object fallbackInstance = getFromContext(beanName, &quot;fallback&quot;, fallbac
return new SentinelInvocationHandler(target, dispatch,
new FallbackFactory.Default(fallbackInstance));
</code></pre>
<p>在创建 SentinelInvocationHandler 之前,通过反射从 FeignClientFactoryBean 拿到 @FeignClient 注解的 fallback 属性值,然后根据 fallback 类型从 Bean 工厂取得 fallback 实例,将 fallback 实例传递给 SentinelInvocationHandler。当触发熔断时SentinelInvocationHandler 就能取得 fallback 实例并调用。</p>
@@ -1107,9 +861,6 @@ return new SentinelInvocationHandler(target, dispatch,
</div>
</div>
</div>
</div>
@@ -1117,9 +868,6 @@ return new SentinelInvocationHandler(target, dispatch,
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
@@ -1135,17 +883,11 @@ return new SentinelInvocationHandler(target, dispatch,
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
@@ -1171,9 +913,6 @@ return new SentinelInvocationHandler(target, dispatch,
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
@@ -1185,9 +924,6 @@ return new SentinelInvocationHandler(target, dispatch,
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
@@ -1205,12 +941,6 @@ return new SentinelInvocationHandler(target, dispatch,
return "";
}
</script>
</html>