Sentinel-微服务保护框架(上)

简介: Sentinel-微服务保护框架(上)

Sentinel-微服务保护框架

1.初始Sentinel

1.1雪崩问题及解决方案

1.1.1雪崩问题

微服务中 服务间调用关系错综复杂 一个微服务往往依赖于多个其它微服务

  • 超时处理:设定超时时间 请求超过一定时间没有响应就返回错误信息 不会无休止等待(缓解问题未解决)

image.png

  • 舱壁模式:限定每个业务能使用的线程数 避免耗尽整个tomcat的资源 因此也叫线程隔离(服务浪费)

image.png

  • 熔断降级:由断路器统计业务执行的异常比例 如果超出阈值则会熔断该业务即拦截访问该业务的一切请求

image.png

  • 流量控制:限制业务访问的QPS 避免服务因流量的突增而故障(避免出现雪崩问题)

image.png

1.1.2总结

雪崩问题

  • 微服务之间相互调用 因为调用链中的一个服务故障 引起整个链路都无法访问的情况

可以认为:

限流是对服务的保护 避免因瞬间高并发流量而导致服务故障 进而避免雪崩 是一种预防措施。

超时处理、线程隔离、降级熔断是在部分服务故障时 将故障控制在一定范围 避免雪崩 是一种补救措施。

1.2服务保护技术对比

Sentinel Hystrix
隔离策略 信号量隔离 线程池隔离/信号量隔离
熔断降级策略 基于慢调用比例或异常比例 基于失败比率
实时指标实现 滑动窗口 滑动窗口(基于 RxJava)
规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于 QPS,支持基于调用关系的限流 有限的支持
流量整形 支持慢启动、匀速排队模式 不支持
系统自适应保护 支持 不支持
控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善
常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC  等 Servlet、Spring Cloud Netflix

1.3Sentinel介绍和安装

1.3.1初始Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了核心场景 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
  • 完备的实时监控:Sentinel 同时提供实时的监控功能 可以在控制台中看到接入应用的单台机器秒级数据 甚至 500 台以下规模的集群的汇总运行情况
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块 例如与 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel
  • 完善的SPI扩展点:Sentinel 提供简单易用 完善的 SPI 扩展接口 可以通过实现扩展接口来快速地定制逻辑 例如定制规则管理、适配动态数据源等

1.3.2安装Sentinel

将资料提供的jar包放到非中文目录下执行:

复制代码

java -jar sentinel-dashboard-1.8.1.jar

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

配置项 默认值 说明
server.port 8080 服务端口
sentinel.dashboard.auth.username sentinel 默认用户名
sentinel.dashboard.auth.password sentinel 默认密码

例如 修改端口:

java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar

1.4微服务整合Sentinel

使用Sentinel肯定要结合微服务 这边使用实用篇中cloud-demo工程

项目结构如下:

image.png

在order-service中整合sentinel,并连接sentinel的控制台

1.4.1引入Sentinel依赖

在order-service中引入Sentinel依赖

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

1.4.2配置控制台

修改application.yaml文件 并添加内容

server:
  port: 8088
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8080

1.4.3访问order-service的任意端点 触发Sentinel监控

2.流量控制

2.1簇点链路

请求进入微服务时 首先会访问DispatcherServlet 然后进入Controller 其调用Service、Service调用Mapper

这样的一个调用链就叫做簇点链路 簇点链路中被监控的每一个接口就是一个资源

默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint 也就是Controller中的方法)

因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源

例如 刚才访问的order-service中的OrderController中的端点:/order/{orderId}

image.png

流控、熔断等都是针对簇点链路中的资源来设置的 因此我们可以点击对应资源后面的按钮来设置规则:

  • 流控:流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制

2.2快速入门

点击资源/order/{orderId}后面的流控按钮 可以弹出表单 表单中可以填写限流规则 具体如下:

image.png

其含义是限制 /order/{orderId}这个资源任何来源的单机QPS为1 即每秒只允许1次请求 超出的请求会被拦截并报错

2.3流控模式

在添加限流规则时,点击高级选项,可以选择三种流控模式

  • 直接:统计当前资源的请求 触发阈值时对当前资源直接限流 也是默认的模式
  • 关联:统计与当前资源相关的另一个资源 触发阈值时 对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求 触发阈值时 对指定链路限流

2.3.1关联模式

关联模式:统计与当前资源相关的另一个资源 触发阈值时 对当前资源限流

配置规则

image.png

语法说明:当/write资源访问量触发阈值时 就会对/read资源限流 避免影响/write资源

使用场景:比如用户支付时需要修改订单状态 同时用户要查询订单 查询和修改操作会争抢数据库锁 产生竞争

业务需求是优先支付和更新订单的业务 因此当修改订单业务触发阈值时 需要对查询订单业务限流

2.3.2链路模式

链路模式:只针对从指定链路访问到本资源的请求做统计 判断是否超过阈值

配置示例

例如有两条请求链路:

  • /test1 --> /common
  • /test2 --> /common

如果只希望统计从/test2进入到/common的请求 则可以这样配置:

image.png

给Service层中的方法添加@SentinelResource注解以达到Sentinel添加资源:

@SentinelResource("goods")
public void queryGoods(){
    System.err.println("查询商品");
}

链路模式中 是对不同来源的两个链路做监控

但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源 会导致链路模式失效。

需要关闭这种对SpringMVC的资源聚合 修改消费者服务的application.yml文件:

spring:
  cloud:
    sentinel:
      web-context-unify: false # 关闭context整合

2.3.3总结

流控模式

  • 直接:对当前资源限流
  • 关联:高优先级资源触发阈值 对低优先级资源限流
  • 链路:阈值统计时 只统计从指定资源进入当前资源的请求 是对请求来源的限流

2.4流控效果

在流控的高级选项中,还有一个流控效果选项:

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

  • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
  • warm up:预热模式 对超出阈值的请求同样是拒绝并抛出异常 但这种模式阈值会动态变化 从一个较小值逐渐增加到最大阈值
  • 排队等待:让所有的请求按照先后次序排队执行 两个请求的间隔不能小于指定时长


目录
相关文章
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
171 3
|
11天前
|
监控 API 开发者
Sentinel:微服务的全能守护
Sentinel 是阿里巴巴开源的一款轻量级流量控制和熔断降级框架。它通过设置流量控制、熔断降级和系统保护规则,确保微服务在高并发场景下稳定运行。Sentinel 提供丰富的功能、实时监控和灵活的集成方式,适用于各种分布式系统。
41 0
|
11天前
|
监控 Java Sentinel
Hystrix 与 Sentinel 大比拼:微服务稳定性工具谁更优?
Hystrix 和 Sentinel 是用于微服务架构中保护服务稳定性和可靠性的工具,主要实现服务熔断、限流、降级等功能。Hystrix 侧重于熔断器模式和服务隔离,通过线程池或信号量隔离服务,防止故障扩散;Sentinel 则更全面,涵盖流量控制、熔断降级和系统自适应保护,适用于高并发场景,并提供实时监控和灵活的策略调整。两者设计理念不同,Hystrix 适合中小规模应用,而 Sentinel 更适合大规模高并发系统。
24 0
|
2月前
|
分布式计算 Java 持续交付
如何选择合适的微服务框架
如何选择合适的微服务框架
35 0
|
3月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
4月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
294 17
微服务框架Dubbo环境部署实战
|
4月前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
107 5
|
4月前
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
4月前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
134 5
|
4月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
83 2

热门文章

最新文章