Sentinel:万字详解微服务的哨兵机制,我跪了

Sentinel 的开源生态:

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

2. Sentinel 快速开始

首先,引入 Sentinel 依赖

com.alibaba.csp sentinel-core 1.7.1

接着,定义资源

资源 是 Sentinel 中的核心概念之一。最常用的资源是我们代码中的 Java 方法。 当然,您也可以更灵活的定义你的资源,例如,把需要控制流量的代码用 Sentinel API SphU.entry(“HelloWorld”) 和 entry.exit() 包围起来即可。在下面的例子中,我们将 System.out.println(“hello world”); 作为资源(被保护的逻辑),用 API 包装起来。例如:

try (Entry entry = SphU.entry(“HelloWorld”)) {
// Your business logic here.
System.out.println(“hello world”);
} catch (BlockException e) {
// Handle rejected request.
e.printStackTrace();
}
// try-with-resources auto exit

还可以使用注解定义资源  https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81

例如:

@SentinelResource(“HelloWorld”)
public void helloWorld() {
// 资源中的逻辑
System.out.println(“hello world”);
}

最后,定义规则

接下来,通过流控规则来指定允许该资源通过的请求次数,例如下面的代码定义了资源 HelloWorld 每秒最多只能通过 20 个请求。

private static void initFlowRules(){
List rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource(“HelloWorld”);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}

完成!

完整的代码如下:

pom.xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
3 xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>
4 4.0.0
5
6 org.springframework.boot
7 spring-boot-starter-parent
8 2.2.2.RELEASE
9
10
11 com.cjs.example
12 sentinel-example
13 0.0.1-SNAPSHOT
14 sentinel-example
15
16
17 <java.version>1.8</java.version>
18 <spring-cloud.version>Greenwich.SR4</spring-cloud.version>
19 <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
20
21
22
23
24 org.springframework.boot
25 spring-boot-starter-actuator
26
27
28 org.springframework.boot
29 spring-boot-starter-web
30
31
32 com.alibaba.cloud
33 spring-cloud-starter-alibaba-sentinel
34
35
36
37
38
39
40
41 org.springframework.cloud
42 spring-cloud-dependencies
43 s p r i n g − c l o u d . v e r s i o n < / v e r s i o n > 44 < t y p e > p o m < / t y p e > 45 < s c o p e > i m p o r t < / s c o p e > 46 < / d e p e n d e n c y > 4748 < d e p e n d e n c y > 49 < g r o u p I d > c o m . a l i b a b a . c l o u d < / g r o u p I d > 50 < a r t i f a c t I d > s p r i n g − c l o u d − a l i b a b a − d e p e n d e n c i e s < / a r t i f a c t I d > 51 < v e r s i o n > {spring-cloud.version}</version> 44 <type>pom</type> 45 <scope>import</scope> 46 </dependency> 47 48 <dependency> 49 <groupId>com.alibaba.cloud</groupId> 50 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 51 <version> springcloud.version</version>44<type>pom</type>45<scope>import</scope>46</dependency>4748<dependency>49<groupId>com.alibaba.cloud</groupId>50<artifactId>springcloudalibabadependencies</artifactId>51<version>{spring-cloud-alibaba.version}
52 pom
53 import
54
55
56
57
58
59
60
61 org.springframework.boot
62 spring-boot-maven-plugin
63
64
65
66
67

application.properties

server.port=8084
spring.application.name=sentinel-example
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080

SentinelExampleApplication.java

1 package com.cjs.example.sentinel;
2
3 import com.alibaba.csp.sentinel.Entry;
4 import com.alibaba.csp.sentinel.SphU;
5 import com.alibaba.csp.sentinel.slots.block.BlockException;
6 import com.alibaba.csp.sentinel.slots.block.RuleConstant;
7 import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
8 import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
9 import org.springframework.boot.SpringApplication;
10 import org.springframework.boot.autoconfigure.SpringBootApplication;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 @SpringBootApplication
16 public class SentinelExampleApplication {
17
18 public static void main(String[] args) {
19 SpringApplication.run(SentinelExampleApplication.class, args);
20
21
22 // 配置规则.
23 initFlowRules();
24
25 while (true) {
26 // 1.5.0 版本开始可以直接利用 try-with-resources 特性,自动 exit entry
27 try (Entry entry = SphU.entry(“HelloWorld”)) {
28 // 被保护的逻辑
29 System.out.println(“hello world”);
30 } catch (BlockException ex) {
31 // 处理被流控的逻辑
32 System.out.println(“blocked!”);
33 }
34 }
35 }
36
37
38 private static void initFlowRules() {
39 List rules = new ArrayList<>();
40
41 FlowRule rule = new FlowRule();
42 rule.setResource(“HelloWorld”);
43 rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
44 // Set limit QPS to 20.
45 rule.setCount(20);
46 rules.add(rule);
47
48 FlowRuleManager.loadRules(rules);
49
50 }
51 }

TestController.java

1 package com.cjs.example.sentinel;
2
3 import com.alibaba.csp.sentinel.annotation.SentinelResource;
4 import org.springframework.web.bind.annotation.GetMapping;
5 import org.springframework.web.bind.annotation.RestController;
6
7 @RestController
8 public class TestController {
9
10 @GetMapping(“/hello”)
11 @SentinelResource(“hello”)
12 public String hello() {
13 return “hello”;
14 }
15
16 }

3. Sentinel 控制台

Sentinel 控制台最少应该包含如下功能:

  • 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
  • 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
  • 规则管理和推送:统一管理推送规则。
  • 鉴权:生产环境中鉴权非常重要。

https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

获取控制台:

方式一:下载已经打好的包

https://github.com/alibaba/Sentinel/releases

wget https://github.com/alibaba/Sentinel/releases/download/1.7.1/sentinel-dashboard-1.7.1.jar

方式二:通过源码构件

mvn clean package

启动控制台

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.1.jar

默认用户名密码都是sentinel

4. Sentinel 注解支持

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项

@SentinelResource 注解的属性:

  • value :资源名称

  • entryType :the entry type (inbound or outbound)

  • blockHandler/blockHandlerClass : blockHandler 是对应处理 BlockException 的函数名称。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定blockHandlerClass。blockHandlerClass 为对应函数所在类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • fallback :fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:defaultFallback :默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑

  • 返回值类型必须与原函数返回值类型一致;

  • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常;

  • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析;

  • exceptionsToIgnore :用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出

需要注意的是,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。

示例:

1 public class TestService {
2
3 // 对应的 handleException 函数需要位于 ExceptionUtil 类中,并且必须为 static 函数.
4 @SentinelResource(value = “test”, blockHandler = “handleException”, blockHandlerClass = {ExceptionUtil.class})
5 public void test() {
6 System.out.println(“Test”);
7 }
8
9 // 原函数
10 @SentinelResource(value = “hello”, blockHandler = “exceptionHandler”, fallback = “helloFallback”)
11 public String hello(long s) {
12 return String.format(“Hello at %d”, s);
13 }

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

数据结构与算法

这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

递归的方法会出现什么问题?

  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

[外链图片转存中…(img-xUmKB782-1710692106409)]

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值