区块链技术博客
www.b2bchain.cn

源码解读二:入口类和重点概念求职学习资料

D0b2wT.gif

本文介绍了源码解读二:入口类和重点概念求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

源码解读二:入口类和重点概念

[TOC]

概述

这篇文章先来分析下 Sentinel 的入口类 Sph 和一些基础概念的类:ResourceWrapper 、Context 、Node 、Rule。

入口类 Sph

Sentinel 是哨兵的意思,Sentinel 框架是使用流控方式来保护微服务的。它的内部原理和 Hystrix 不太相同,并不是使用线程池的方式去隔离不同资源。更接近于为每一个资源分配可访问的许可,当访问请求突破许可时则触发流量控制规则,来保护系统。

Sentinel 框架的入口类是 Sph ,查询 github 上的 issue ,作者说这个词是生造出来的,是对 Semaphore 的简写。

Sph 接口提供了对资源访问的各种 entry 方法,下面就来详细的进行分析。

首先还是来看下类图,如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201006231915.png” style=”zoom:80%;” />

Sph 接口中规定了各种各样的 entry 方法,但是归根到底,在具体的实现上,也就是 CtSph 中,所有的 entry 方法最终都是委托给了entryWithPriority 方法来实现资源访问。这边就来详细看下 entryWithPriority 方法的实现逻辑。方法的整体流程如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201008192931.png” alt=”image-20201008192925499″ style=”zoom:50%;” />

方法的整体流程很简单,在这个流程中也引出了 资源、上下文、处理插槽责任链、条目等概念。下文来一一进行分析。

ResourceWrapper

这个类,在总体设计中已经有介绍过,其抽象的就是资源这个事务。如总体设计之中所说,任何需要保护的东西,都可以被认为是一个资源。

这个类不需要多说,本身只是起到一个承载属性的作用,分别是三个:

  • name ,资源的名称。用户自行定义。限流规则中根据资源名称进行最基本的匹配。
  • resourceType ,资源类型。用户自行定义。主要用于标识,不启到其他作用。
  • entryType ,资源方向。是一个枚举类型,取值有两个:入站方向、出站方向。从外部发起的对系统的请求都是入站方向,其余为出站方向。区分资源方向,主要是应用在系统保护之中。如果开启系统自适应保护,在入站流量过大的情况下,会拒绝掉部分请求,从而保证系统的响应能力。

具体的实现类有 2 个,如下

源码解读二:入口类和重点概念

默认情况就是使用StringResourceWrapper 。MethodResourceWrapper 没有任何新东西,只不过是自动使用入参的 Method 对象解析为资源名称,解析后的名称规律为 $className:$methodName($argType…) 。

这边有一个需要注意的地方在于,ResourceWrapper 的 equals 方法的实现内容就是使用资源名称进行对比。这意味着所有使用 ResourceWrapper 做 key 或者做唯一键之类的地方实际上依靠的就是资源名称。这在代码的阅读上如果不注意会产生一些困惑。这个 equals 方法的实现实际上就意味着在全局上资源本身只依靠资源名称,和资源类型、资源方向是无关的。

Context

这个类,在总体设计中介绍过,是代表着访问的上下文,或者说,代表着一次请求的访问。其本身的作用也只是用于存储承载属性,分别是:

  • name,上下文名称。在流控规则中,可以用上下文名称来制定更精细化的流控规则。如果在使用中不指定,则框架会使用一个默认的上下文名称。
  • entranceNode,访问入口节点。一次完整访问,无论其调用链路如何,必然有一个唯一的开始入口。entranceNode 就负责存储这个入口的信息。实际上,这个 entranceNode 的资源名称和 Context 本身的 name 属性是相同的。
  • curEntry,当前处理的条目,或者说,正在访问的资源。Context 代表着一次完整的访问,那么其必然会有对资源的访问,每一个资源的访问在 Sentinel 中都是使用Entry来标识,所以 Context 中必然会有属性来指向当前正在处理的 Entry。
  • origin,本次访问的来源。当一个请求访问是外部系统发起的时候,可以携带这个值。用于后续的流控规则判断。一般而言,origin 的值都是服务消费者的 APP 名称,或者服务消费者的 IP 地址。
  • async,是否异步上下文。这个属性在异步上下文的章节中再进行讨论。当前先阐述同步的情况,方便理解。

Context 本身的方法代码没有什么可说的,都是基本的数据获取操作。

这边来看下 ContextUtil 这个工具类,这个工具类在讲 CtSph 的 entry 方法流程中曾经提到过。在 Sentinel 框架的设计流程中,无论如何操作,都需要通过 ContextUtil 的 enter 方法来获取当前线程绑定的 Context 对象。Context 代表的是一次完整的请求访问,所以每次请求的时候都需要新建。

Context 的名字同时也是访问路径中访问入口的名字。一个系统中访问入口的数目应该是的固定的。访问入口在 Sentinel 中是用类 EntranceNode 来代表。由于这个类仅仅起到标识访问路径上节点名称的作用,因此并不需要随着每次请求访问而新建。故此 ContextUtil 中会使用一个 Map 类型的属性 contextNameNodeMap 来缓存入口名称和 EntranceNode 实例对象的映射关系。每当有新的上下文名称出现的时候,就会创建一个新的 Map ,复制原本的 Map 的内容并且新增新的 EntranceNode 对象到 Map 中。并且使用这个新的 Map 来代替原本的 Map 。

每当有新的 EntranceNode 被创建的时候,就会将这个 EntranceNode 对象加入到 Constants#ROOT 变量指向到整个系统的根 EntranceNode 的子节点列表属性 childList 中。通过这种方式可以很方便的查看整个系统当前有多少访问路径。只需要从系统根 EntranceNode 开始查看即可。从 Sentinel 的角度来看,系统的访问路径可能会是如下所示

源码解读二:入口类和重点概念

从路径上可以看到,相同的资源名称,拥有不同的上下文名称(不同的访问入口名称)时,也会不同的访问路径。

当 Context 对象被创建后,就设置到 ContextUtil 的类属性 contextHolder 中,这是一个线程变量。

Node

节点,在总体设计中介绍过,是用来存储统计信息的。还是先来看下类图,如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201005125916.png” style=”zoom: 50%;” />

Node 定义了获取统计信息的相关方法,诸如资源请求的 Qps,过去一分钟内成功通过的请求次数,被拦截的请求次数等等。那到具体的实现上是由 StatisticNode 来完成的。StatisticNode ,统计节点,有三个重要的属性用来实现统计工作,分别是:

  • rollingCounterInSecond,以秒为单位的滚动计数器。用来存储给定时间内的访问数据。
  • rollingCounterInMinute,以分钟为单位的滚动计数器。用于存储过去一分钟内的访问数据。
  • curThreadNum,LongAdder 类型,用于存储当前该资源的并发访问线程数。

这三个属性就是访问请求统计的主要实现方式。其中 curThreadNum 最好理解,每当需要访问资源的时候,对 curThreadNum 进行加 1 操作,当资源访问结束时,对 curThreadNum 进行减 1 操作。

源码解读二:入口类和重点概念

[TOC]

概述

这篇文章先来分析下 Sentinel 的入口类 Sph 和一些基础概念的类:ResourceWrapper 、Context 、Node 、Rule。

入口类 Sph

Sentinel 是哨兵的意思,Sentinel 框架是使用流控方式来保护微服务的。它的内部原理和 Hystrix 不太相同,并不是使用线程池的方式去隔离不同资源。更接近于为每一个资源分配可访问的许可,当访问请求突破许可时则触发流量控制规则,来保护系统。

Sentinel 框架的入口类是 Sph ,查询 github 上的 issue ,作者说这个词是生造出来的,是对 Semaphore 的简写。

Sph 接口提供了对资源访问的各种 entry 方法,下面就来详细的进行分析。

首先还是来看下类图,如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201006231915.png” style=”zoom:80%;” />

Sph 接口中规定了各种各样的 entry 方法,但是归根到底,在具体的实现上,也就是 CtSph 中,所有的 entry 方法最终都是委托给了entryWithPriority 方法来实现资源访问。这边就来详细看下 entryWithPriority 方法的实现逻辑。方法的整体流程如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201008192931.png” alt=”image-20201008192925499″ style=”zoom:50%;” />

方法的整体流程很简单,在这个流程中也引出了 资源、上下文、处理插槽责任链、条目等概念。下文来一一进行分析。

ResourceWrapper

这个类,在总体设计中已经有介绍过,其抽象的就是资源这个事务。如总体设计之中所说,任何需要保护的东西,都可以被认为是一个资源。

这个类不需要多说,本身只是起到一个承载属性的作用,分别是三个:

  • name ,资源的名称。用户自行定义。限流规则中根据资源名称进行最基本的匹配。
  • resourceType ,资源类型。用户自行定义。主要用于标识,不启到其他作用。
  • entryType ,资源方向。是一个枚举类型,取值有两个:入站方向、出站方向。从外部发起的对系统的请求都是入站方向,其余为出站方向。区分资源方向,主要是应用在系统保护之中。如果开启系统自适应保护,在入站流量过大的情况下,会拒绝掉部分请求,从而保证系统的响应能力。

具体的实现类有 2 个,如下

源码解读二:入口类和重点概念

默认情况就是使用StringResourceWrapper 。MethodResourceWrapper 没有任何新东西,只不过是自动使用入参的 Method 对象解析为资源名称,解析后的名称规律为 $className:$methodName($argType…) 。

这边有一个需要注意的地方在于,ResourceWrapper 的 equals 方法的实现内容就是使用资源名称进行对比。这意味着所有使用 ResourceWrapper 做 key 或者做唯一键之类的地方实际上依靠的就是资源名称。这在代码的阅读上如果不注意会产生一些困惑。这个 equals 方法的实现实际上就意味着在全局上资源本身只依靠资源名称,和资源类型、资源方向是无关的。

Context

这个类,在总体设计中介绍过,是代表着访问的上下文,或者说,代表着一次请求的访问。其本身的作用也只是用于存储承载属性,分别是:

  • name,上下文名称。在流控规则中,可以用上下文名称来制定更精细化的流控规则。如果在使用中不指定,则框架会使用一个默认的上下文名称。
  • entranceNode,访问入口节点。一次完整访问,无论其调用链路如何,必然有一个唯一的开始入口。entranceNode 就负责存储这个入口的信息。实际上,这个 entranceNode 的资源名称和 Context 本身的 name 属性是相同的。
  • curEntry,当前处理的条目,或者说,正在访问的资源。Context 代表着一次完整的访问,那么其必然会有对资源的访问,每一个资源的访问在 Sentinel 中都是使用Entry来标识,所以 Context 中必然会有属性来指向当前正在处理的 Entry。
  • origin,本次访问的来源。当一个请求访问是外部系统发起的时候,可以携带这个值。用于后续的流控规则判断。一般而言,origin 的值都是服务消费者的 APP 名称,或者服务消费者的 IP 地址。
  • async,是否异步上下文。这个属性在异步上下文的章节中再进行讨论。当前先阐述同步的情况,方便理解。

Context 本身的方法代码没有什么可说的,都是基本的数据获取操作。

这边来看下 ContextUtil 这个工具类,这个工具类在讲 CtSph 的 entry 方法流程中曾经提到过。在 Sentinel 框架的设计流程中,无论如何操作,都需要通过 ContextUtil 的 enter 方法来获取当前线程绑定的 Context 对象。Context 代表的是一次完整的请求访问,所以每次请求的时候都需要新建。

Context 的名字同时也是访问路径中访问入口的名字。一个系统中访问入口的数目应该是的固定的。访问入口在 Sentinel 中是用类 EntranceNode 来代表。由于这个类仅仅起到标识访问路径上节点名称的作用,因此并不需要随着每次请求访问而新建。故此 ContextUtil 中会使用一个 Map 类型的属性 contextNameNodeMap 来缓存入口名称和 EntranceNode 实例对象的映射关系。每当有新的上下文名称出现的时候,就会创建一个新的 Map ,复制原本的 Map 的内容并且新增新的 EntranceNode 对象到 Map 中。并且使用这个新的 Map 来代替原本的 Map 。

每当有新的 EntranceNode 被创建的时候,就会将这个 EntranceNode 对象加入到 Constants#ROOT 变量指向到整个系统的根 EntranceNode 的子节点列表属性 childList 中。通过这种方式可以很方便的查看整个系统当前有多少访问路径。只需要从系统根 EntranceNode 开始查看即可。从 Sentinel 的角度来看,系统的访问路径可能会是如下所示

源码解读二:入口类和重点概念

从路径上可以看到,相同的资源名称,拥有不同的上下文名称(不同的访问入口名称)时,也会不同的访问路径。

当 Context 对象被创建后,就设置到 ContextUtil 的类属性 contextHolder 中,这是一个线程变量。

Node

节点,在总体设计中介绍过,是用来存储统计信息的。还是先来看下类图,如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201005125916.png” style=”zoom: 50%;” />

Node 定义了获取统计信息的相关方法,诸如资源请求的 Qps,过去一分钟内成功通过的请求次数,被拦截的请求次数等等。那到具体的实现上是由 StatisticNode 来完成的。StatisticNode ,统计节点,有三个重要的属性用来实现统计工作,分别是:

  • rollingCounterInSecond,以秒为单位的滚动计数器。用来存储给定时间内的访问数据。
  • rollingCounterInMinute,以分钟为单位的滚动计数器。用于存储过去一分钟内的访问数据。
  • curThreadNum,LongAdder 类型,用于存储当前该资源的并发访问线程数。

这三个属性就是访问请求统计的主要实现方式。其中 curThreadNum 最好理解,每当需要访问资源的时候,对 curThreadNum 进行加 1 操作,当资源访问结束时,对 curThreadNum 进行减 1 操作。

源码解读二:入口类和重点概念

[TOC]

概述

这篇文章先来分析下 Sentinel 的入口类 Sph 和一些基础概念的类:ResourceWrapper 、Context 、Node 、Rule。

入口类 Sph

Sentinel 是哨兵的意思,Sentinel 框架是使用流控方式来保护微服务的。它的内部原理和 Hystrix 不太相同,并不是使用线程池的方式去隔离不同资源。更接近于为每一个资源分配可访问的许可,当访问请求突破许可时则触发流量控制规则,来保护系统。

Sentinel 框架的入口类是 Sph ,查询 github 上的 issue ,作者说这个词是生造出来的,是对 Semaphore 的简写。

Sph 接口提供了对资源访问的各种 entry 方法,下面就来详细的进行分析。

首先还是来看下类图,如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201006231915.png” style=”zoom:80%;” />

Sph 接口中规定了各种各样的 entry 方法,但是归根到底,在具体的实现上,也就是 CtSph 中,所有的 entry 方法最终都是委托给了entryWithPriority 方法来实现资源访问。这边就来详细看下 entryWithPriority 方法的实现逻辑。方法的整体流程如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201008192931.png” alt=”image-20201008192925499″ style=”zoom:50%;” />

方法的整体流程很简单,在这个流程中也引出了 资源、上下文、处理插槽责任链、条目等概念。下文来一一进行分析。

ResourceWrapper

这个类,在总体设计中已经有介绍过,其抽象的就是资源这个事务。如总体设计之中所说,任何需要保护的东西,都可以被认为是一个资源。

这个类不需要多说,本身只是起到一个承载属性的作用,分别是三个:

  • name ,资源的名称。用户自行定义。限流规则中根据资源名称进行最基本的匹配。
  • resourceType ,资源类型。用户自行定义。主要用于标识,不启到其他作用。
  • entryType ,资源方向。是一个枚举类型,取值有两个:入站方向、出站方向。从外部发起的对系统的请求都是入站方向,其余为出站方向。区分资源方向,主要是应用在系统保护之中。如果开启系统自适应保护,在入站流量过大的情况下,会拒绝掉部分请求,从而保证系统的响应能力。

具体的实现类有 2 个,如下

源码解读二:入口类和重点概念

默认情况就是使用StringResourceWrapper 。MethodResourceWrapper 没有任何新东西,只不过是自动使用入参的 Method 对象解析为资源名称,解析后的名称规律为 $className:$methodName($argType…) 。

这边有一个需要注意的地方在于,ResourceWrapper 的 equals 方法的实现内容就是使用资源名称进行对比。这意味着所有使用 ResourceWrapper 做 key 或者做唯一键之类的地方实际上依靠的就是资源名称。这在代码的阅读上如果不注意会产生一些困惑。这个 equals 方法的实现实际上就意味着在全局上资源本身只依靠资源名称,和资源类型、资源方向是无关的。

Context

这个类,在总体设计中介绍过,是代表着访问的上下文,或者说,代表着一次请求的访问。其本身的作用也只是用于存储承载属性,分别是:

  • name,上下文名称。在流控规则中,可以用上下文名称来制定更精细化的流控规则。如果在使用中不指定,则框架会使用一个默认的上下文名称。
  • entranceNode,访问入口节点。一次完整访问,无论其调用链路如何,必然有一个唯一的开始入口。entranceNode 就负责存储这个入口的信息。实际上,这个 entranceNode 的资源名称和 Context 本身的 name 属性是相同的。
  • curEntry,当前处理的条目,或者说,正在访问的资源。Context 代表着一次完整的访问,那么其必然会有对资源的访问,每一个资源的访问在 Sentinel 中都是使用Entry来标识,所以 Context 中必然会有属性来指向当前正在处理的 Entry。
  • origin,本次访问的来源。当一个请求访问是外部系统发起的时候,可以携带这个值。用于后续的流控规则判断。一般而言,origin 的值都是服务消费者的 APP 名称,或者服务消费者的 IP 地址。
  • async,是否异步上下文。这个属性在异步上下文的章节中再进行讨论。当前先阐述同步的情况,方便理解。

Context 本身的方法代码没有什么可说的,都是基本的数据获取操作。

这边来看下 ContextUtil 这个工具类,这个工具类在讲 CtSph 的 entry 方法流程中曾经提到过。在 Sentinel 框架的设计流程中,无论如何操作,都需要通过 ContextUtil 的 enter 方法来获取当前线程绑定的 Context 对象。Context 代表的是一次完整的请求访问,所以每次请求的时候都需要新建。

Context 的名字同时也是访问路径中访问入口的名字。一个系统中访问入口的数目应该是的固定的。访问入口在 Sentinel 中是用类 EntranceNode 来代表。由于这个类仅仅起到标识访问路径上节点名称的作用,因此并不需要随着每次请求访问而新建。故此 ContextUtil 中会使用一个 Map 类型的属性 contextNameNodeMap 来缓存入口名称和 EntranceNode 实例对象的映射关系。每当有新的上下文名称出现的时候,就会创建一个新的 Map ,复制原本的 Map 的内容并且新增新的 EntranceNode 对象到 Map 中。并且使用这个新的 Map 来代替原本的 Map 。

每当有新的 EntranceNode 被创建的时候,就会将这个 EntranceNode 对象加入到 Constants#ROOT 变量指向到整个系统的根 EntranceNode 的子节点列表属性 childList 中。通过这种方式可以很方便的查看整个系统当前有多少访问路径。只需要从系统根 EntranceNode 开始查看即可。从 Sentinel 的角度来看,系统的访问路径可能会是如下所示

源码解读二:入口类和重点概念

从路径上可以看到,相同的资源名称,拥有不同的上下文名称(不同的访问入口名称)时,也会不同的访问路径。

当 Context 对象被创建后,就设置到 ContextUtil 的类属性 contextHolder 中,这是一个线程变量。

Node

节点,在总体设计中介绍过,是用来存储统计信息的。还是先来看下类图,如下

<img src=”https://markdownpic-1251577930.cos.ap-chengdu.myqcloud.com/20201005125916.png” style=”zoom: 50%;” />

Node 定义了获取统计信息的相关方法,诸如资源请求的 Qps,过去一分钟内成功通过的请求次数,被拦截的请求次数等等。那到具体的实现上是由 StatisticNode 来完成的。StatisticNode ,统计节点,有三个重要的属性用来实现统计工作,分别是:

  • rollingCounterInSecond,以秒为单位的滚动计数器。用来存储给定时间内的访问数据。
  • rollingCounterInMinute,以分钟为单位的滚动计数器。用于存储过去一分钟内的访问数据。
  • curThreadNum,LongAdder 类型,用于存储当前该资源的并发访问线程数。

这三个属性就是访问请求统计的主要实现方式。其中 curThreadNum 最好理解,每当需要访问资源的时候,对 curThreadNum 进行加 1 操作,当资源访问结束时,对 curThreadNum 进行减 1 操作。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 源码解读二:入口类和重点概念求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们