首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2023年12月 Java教学课程 217-微服务保护(Sentinel的概念和基本使用)

【愚公系列】2023年12月 Java教学课程 217-微服务保护(Sentinel的概念和基本使用)

作者头像
愚公搬代码
发布2025-06-02 16:32:58
发布2025-06-02 16:32:58
12800
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

🚀前言

微服务保护是指在微服务架构中为了确保服务的稳定性和安全性而采取的一系列保护措施。这些保护措施包括:

  1. 限流:通过设置并发请求、QPS(每秒请求数)等限制,防止服务因过多请求导致崩溃或响应缓慢。
  2. 熔断:在服务出现异常或超时的情况下,自动切换到备用服务或返回默认值,防止服务雪崩。
  3. 降级:当服务出现异常或超时时,自动降级,返回较为简单或者不完整的结果,保证服务的可用性。
  4. 容错:对于服务的异常情况,进行处理,尽量避免对其他服务或系统产生影响,确保整个系统的稳定性。
  5. 安全保护:对服务进行身份认证、授权、加密解密等安全措施,防止恶意攻击或者非法访问。

以上措施可以提升微服务架构的可用性、稳定性和安全性,同时也能够减少应用程序出现故障的概率,保障业务的正常运行。

🚀一、Sentinel的概念

🔎1.雪崩问题及解决方案

🦋1.1 雪崩问题

微服务雪崩问题是指在微服务架构中,由于某个服务出现故障或者超时,导致该服务所依赖的其他服务也无法正常工作,最终导致整个系统不可用的严重问题。

当一个微服务出现故障或者超时时,它向其他服务发送的请求会一直等待响应,如果其他服务也因为该请求而过载,无法及时响应请求,就会引发新的请求继续等待响应,最终导致所有服务都处于过载状态,整个系统崩溃。

微服务雪崩问题通常是由于服务之间的依赖关系过于复杂,或者某个服务设计不合理,导致一旦出现故障或者超时,就会引发连锁反应。

案例分析:在微服务医疗系统中,当医生给患者开立药品医嘱时,需要完成对药品库存的扣减、新医嘱信息的创建、医疗费用的预扣等多个业务活动。假设此时费用中心服务宕机,此时医嘱创建请求会持续等待下游服务的响应,在系统未做任何保护时,请求会在响应之前持续等待,随着更多的请求过来直至医嘱中心服务资源耗尽。费用中心不可用的现象转移到其上游医嘱中心,医嘱中心的不可用随着更多的请求继续向上转移到医生站,最终导致所有服务不可用。

🦋1.2 数据绑定案例
☀️1.2.1 超时处理

微服务超时处理是指当一个微服务需要调用另一个微服务时,为了避免因为依赖微服务响应过慢而导致整个系统无法正常运行,对调用设定超时时间,如果在规定时间内未得到响应,就认为该请求超时,并进行相应的处理。

超时处理可以有效地避免微服务间出现雪崩的情况。如果一个微服务的依赖服务出现故障或响应缓慢,超时处理机制可以在规定时间内取消请求,保证系统的正常运行,同时也能减少对被调用微服务的资源占用,增加系统的稳定性和可靠性。

超时处理需要根据具体的业务场景和框架特性来选择合适的超时策略。例如可以使用微服务框架提供的超时配置,设置合理的熔断机制,使用限流器等方式来处理超时问题。同时,在设计微服务架构时应该充分考虑到依赖服务的可靠性和性能,尽可能避免出现超时问题。

☀️1.2.2 仓壁模式

微服务仓壁模式(Microservice Bounded Context Pattern)是一种架构模式,用于将微服务划分为不同的边界上下文。每个微服务仓壁表示一个特定的业务或功能领域,并与其他微服务仓壁实现松散耦合。

在微服务架构中,将整个应用程序拆分为小型微服务可以使应用程序更易于扩展和维护。但是,随着微服务数量的增加,管理它们之间的通信和交互可能会变得困难。这时,使用微服务仓壁模式可以帮助团队更好地管理和维护微服务。

通过将微服务分组为具有相同上下文的仓壁,开发人员可以更容易地理解和管理应用程序的不同部分。每个仓壁都具有清晰的职责和目标,可以独立开发、部署和扩展。同时,仓壁之间的通信只需通过明确定义的接口进行,可以避免不必要的耦合和依赖。

仓壁模式来源于船舱的设计:

船舱都会被隔板分离为多个独立空间,当船体破损时,只会导致部分空间进入,将故障控制在一定范围内,避免整个船体都被淹没。

我们可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

☀️1.2.3 断路器

微服务断路器是一种设计模式,用于处理微服务应用程序中的故障和异常情况。它是一个在微服务之间的网络通信中拦截异常和错误的机制,可以帮助防止错误和异常从一个微服务扩散到整个应用程序。当微服务之间发生故障时,断路器会自动中断调用,并返回一个默认的响应,以避免应用程序的崩溃。此外,断路器还可以记录故障和异常情况,以便进行故障排除和监控。断路器的目的是提高应用程序的可靠性和稳定性,减少故障对应用程序的影响。常见的微服务断路器包括Hystrix、Resilience4j等。

当发现访问服务D的请求异常比例过高时,认为服务D有导致雪崩的风险,会拦截访问服务D的一切请求,形成熔断:

☀️1.2.4 限流

微服务限流是一种控制微服务的流量的方法,以避免系统过载和崩溃。通常,微服务在高峰期会导致系统流量过大,处理请求的能力无法跟上,这时就需要限制一定数量的请求,以保证系统的稳定性和可用性。微服务限流可以通过设置一些指标,例如每秒最大请求数、每个请求的最大处理时间、每个客户端的最大连接数等方式来限制系统的流量。同时,限流也可以提高系统的整体性能和资源利用率,避免系统资源浪费。

QPS指每秒查询率(Queries Per Second),是一个衡量系统处理请求能力的指标。例如,如果一个系统每秒可以处理100个请求,那么它的QPS就是100。

限流就是限制业务访问的QPS,避免服务因流量的突增而故障。

🔎2.服务保护技术对比

在SpringCloud当中支持多种服务保护技术:

早期比较流行的是Hystrix框架,但目前国内实用最广泛的还是阿里巴巴的Sentinel框架,这里我们做下对比:

Sentinel

Hystrix

隔离策略

信号量隔离

线程池隔离/信号量隔离

熔断降级策略

基于慢调用比例或异常比例

基于失败比率

实时指标实现

滑动窗口

滑动窗口(基于 RxJava)

规则配置

支持多种数据源

支持多种数据源

扩展性

多个扩展点

插件的形式

基于注解的支持

支持

支持

限流

基于 QPS,支持基于调用关系的限流

有限的支持

流量整形

支持慢启动、匀速排队模式

不支持

系统自适应保护

支持

不支持

控制台

开箱即用,可配置规则、查看秒级监控、机器发现等

不完善

常见框架的适配

Servlet、Spring Cloud、Dubbo、gRPC 等

Servlet、Spring Cloud Netflix

🔎3.Sentinel介绍和安装

🦋3.1 初识Sentinel

Sentinel是一种分布式流量控制与实时监控系统,可以用来保护微服务架构的稳定性和可靠性。它可以实时地检测并阻止恶意流量,保护应用程序免受攻击。同时还提供了实时流量监控、服务容错、熔断、限流等功能,可以帮助开发者快速诊断和解决服务问题,提升服务的可靠性和性能。

Sentinel具有以下特点:

  1. 分布式架构:Sentinel是一种分布式流量控制系统,可以集成到不同的微服务中,并且支持跨语言的应用程序。
  2. 实时监控:Sentinel可以提供实时的流量监控,通过图表和日志记录等方式,帮助开发人员快速诊断和解决问题。
  3. 流量控制:Sentinel可以通过限流、熔断等方式,保护应用程序免受恶意流量的攻击。
  4. 容错:Sentinel可以帮助开发人员实现容错机制,当出现故障时,能够自动降级或转移服务,保证服务的可靠性和稳定性。
  5. 易于使用:Sentinel的集成和使用非常简单,可以快速部署到生产环境中。
🦋3.2 安装Sentinel

1)下载

sentinel官方提供了UI控制台,方便我们对系统做限流设置。大家可以在GitHub下载。

2)运行

将jar包放到任意非中文目录,执行命令:

代码语言:javascript
代码运行次数:0
运行
复制
java -jar sentinel-dashboard-1.8.4.jar

如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:

配置项

默认值

说明

server.port

8080

服务端口

sentinel.dashboard.auth.username

sentinel

默认用户名

sentinel.dashboard.auth.password

sentinel

默认密码

例如,修改端口:

代码语言:javascript
代码运行次数:0
运行
复制
java -Dserver.port=8090 -jar sentinel-dashboard-1.8.4.jar

3)访问

访问http://localhost:8080页面,就可以看到sentinel的控制台了:

需要输入账号和密码,默认都是:sentinel

🔎4.微服务整合Sentinel

我们在order-service中整合sentinel,并连接sentinel的控制台,步骤如下:

1)引入sentinel依赖

代码语言:javascript
代码运行次数:0
运行
复制
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2)配置控制台

修改application.yaml文件,添加下面内容:

代码语言:javascript
代码运行次数:0
运行
复制
server:
  port: 8088
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8080

3)访问order-service的任意端点

打开浏览器,访问http://localhost:8088/order/101,这样才能触发sentinel的监控。

然后再访问sentinel的控制台,查看效果:


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀前言
  • 🚀一、Sentinel的概念
    • 🔎1.雪崩问题及解决方案
      • 🦋1.1 雪崩问题
      • 🦋1.2 数据绑定案例
    • 🔎2.服务保护技术对比
    • 🔎3.Sentinel介绍和安装
      • 🦋3.1 初识Sentinel
      • 🦋3.2 安装Sentinel
    • 🔎4.微服务整合Sentinel
  • 🚀感谢:给读者的一封信
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档