Sentinel的安装与配置
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件Sentinel 主要以流量为切入
往期回顾
前面我们已经介绍了Spring Cloud&Spring Cloud Alibaba
中Nacos
、LoadBalancer
、Gateway
、OpenFegin
这些组件,接下来让我们继续来看Spring Cloud Alibaba中关于服务熔断降级的组件:Sentinel
Sentinel介绍
概述
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件
Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
- 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性
关于流量控制,服务的熔断降级等后面会结合代码详细解释,如果对这些名词不熟悉的同学可以先了解一个大概,后面根据代码Demo进行理解。
我们先来初步的了解Sentinel是什么的,可以用来干嘛
Sentinel 基本概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
Sentinel 的组成
Sentinel 主要由以下两个部分组成:
- Sentinel 核心库:Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中,同时对 Spring Cloud、Dubbo 等微服务框架提供了很好的支持。
- Sentinel 控制台(Dashboard):Sentinel 提供的一个轻量级的开源控制台,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。
Sentinel 核心库不依赖 Sentinel Dashboard,但两者结合使用可以有效的提高效率,让 Sentinel 发挥它最大的作用。
安装控制台
Sentinel 提供了一个轻量级的开源控制台 Sentinel Dashboard,它提供了机器发现与健康情况管理、监控(单机和集群)、规则管理与推送等多种功能。
Sentinel 控制台提供的功能如下:
- 查看机器列表以及健康情况:Sentinel 控制台能够收集 Sentinel 客户端发送的心跳包,判断机器是否在线。
- 监控(单机和集群聚合):Sentinel 控制台通过 Sentinel 客户端暴露的监控 API,可以实现秒级的实时监控。
- 规则管理和推送:通过 Sentinel 控制台,我们还能够针对资源定义和推送规则。
- 鉴权:从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。
Sentinel Dashboard 是我们配置和管理规则(例如流控规则、熔断降级规则等)的重要入口之一。通过它,我们不仅可以对规则进行配置和管理,还能实时查看规则的效果。
官网下载 Jar 包
启动:(全部使用默认配置)
java -jar sentinel-dashboard-1.8.5.jar
启动时指定端口,是否监控自己,项目名称,登录的帐号和密码:
java -Dserver.port=8480 -Dcsp.sentinel.dashboard.server=localhost:8480 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.5.jar
参数说明:(注意:参数要放到 -jar的前边)
# 指定控制台的端口为8480
-Dserver.port=8480
# 指定要被哪个控制台监控(这里指定的是自己监控自己)
-Dcsp.sentinel.dashboard.server=localhost:8480
# 指定实例名称(名称会在控制台左侧以菜单显示)
-Dproject.name=sentinel-dashboard
# 设置登录的帐号为:sentinel
-Dsentinel.dashboard.auth.username=sentinel
# 设置登录的密码为:123456
-Dsentinel.dashboard.auth.password=123456
Docker部署
拉取镜像
docker pull bladex/sentinel-dashboard
运行镜像
docker run --name sentinel --network=host -e auth.enabled="true" -e sentinel.dashboard.auth.username=admin -e sentinel.dashboard.auth.password=admin -e server.servlet.session.timeout=7200 -d bladex/sentinel-dashboard
参数解释:
# 指定docker容器使用宿主机的网络(你也可以映射8858,8719这两个端口)
--network=host
# 开启登录认证,在application.yml中你需要配置对应的用户名和密码
auth.enabled="true"
# 指定Sentinel控制台用户名,默认Sentinel
sentinel.dashboard.auth.username=admin
# 指定Sentinel控制台密码,默认Sentinel
sentinel.dashboard.auth.password=admin
# 用于指定 Spring Boot服务端session的过期时间,如7200表示7200 秒;60m表示60分钟,默认为30分钟;
server.servlet.session.timeout=7200
配置
Sentinel 提供如下的配置方式:
- JVM -D 参数方式
- properties 文件方式(1.7.0 版本开始支持)
其中,project.name
参数只能通过 JVM -D 参数方式配置(since 1.8.0 取消该限制),其它参数支持所有的配置方式。
优先级顺序:JVM -D 参数的优先级最高。若 properties 和 JVM 参数中有相同项的配置,以 JVM 参数配置的为准。
用户可以通过 -Dcsp.sentinel.config.file
参数配置 properties 文件的路径,支持 classpath 路径配置(如 classpath:sentinel.properties
)。默认 Sentinel 会尝试从 classpath:sentinel.properties
文件读取配置,读取编码默认为 UTF-8。
注:1.7.0 以下版本可以通过旧的
${user_home}/logs/csp/${project.name}.properties
配置文件进行配置(除project.name
和日志相关配置项)。具体的配置可选项请查阅官方文档:
访问测试
启动成功后,访问对应的地址查看
然后输入对应的密码访问
如图所示,Sentinel就算安装完成啦
快速开始
Sentinel控制台已经安装好那么我们来结合Spring Cloud项目来看看Sentinel到底能干什么吧
为了方便起见,我们直接改造之前的user-service
先引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
在bootstrap.yml
中添加以下配置
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 192.168.199.128:8848 #Nacos地址
config:
server-addr: 192.168.199.128:8848 #Nacos地址
file-extension: yaml #这里我们获取的yaml格式的配置
sentinel:
transport:
#配置 Sentinel dashboard 地址
dashboard: 192.168.199.128:8858
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
port: 8719
在Controller中添加如下代码
/**
* @author Pymjl
* @version 1.0
* @date 2022/8/25 12:48
**/
@RestController
@RequestMapping("/user")
@Log4j2
public class UserController {
@Resource
UserService userService;
@Value("${server.port}")
private String port;
@GetMapping("/get/{id}")
@SentinelResource(value = "getUser")
public CommonResult<User> get(@PathVariable("id") Long id) {
return ResultUtils.success(userService.get(id));
}
}
@SentinelResource注解的作用我们后面会详细解释,这里只是简单的演示Sentinel的作用,不做赘述
启动项目
先启动user-service
因为Sentinel的懒加载机制,如果并没有访问接口那么Sentinel是不会有对应的信息的,我们这时候去看看Sentinel的控制台
空空如也,啥也没有,所以我们先访问接口一次
然后再去观察控制台,就会发现出现了对应的资源
给资源添加流控规则
我们给/user/get/{id}
这个URL添加流控规则,在/user/get/{id}
右边点击+流控
,然后设置QPS的阈值
这些配置信息后面会详细解释
新增完流控规则之后,我们再快速的连续去访问刚才的接口,看看会发生什么呢?
如图所示我们可以看,当我们快速点击刷新的时候Sentinel会对该资源进行保护,进行限流操作
至此,对Sentinel的介绍就先到这里啦,后面我们会继续探讨Sentinel的一些概念、特性以及诸如持久化等操作,感谢大家的观看
然后设置QPS的阈值
[外链图片转存中…(img-V80muiIB-1662298851495)]
这些配置信息后面会详细解释
新增完流控规则之后,我们再快速的连续去访问刚才的接口,看看会发生什么呢?
[外链图片转存中…(img-XoD8EsWv-1662298851496)]
如图所示我们可以看,当我们快速点击刷新的时候Sentinel会对该资源进行保护,进行限流操作
至此,对Sentinel的介绍就先到这里啦,后面我们会继续探讨Sentinel的一些概念、特性以及诸如持久化等操作,感谢大家的观看
更多推荐
所有评论(0)