微服务的系统保护 - sentinel 2022-03-14 程序之旅,记录 1 条评论 1042 次阅读 ## 微服务的系统保护 - sentinel ### 微服务的雪崩效应 雪崩效应产生的原因,由于某原因导致某个服务不可用,之后导致上游服务不可用,然后导致级联效应,影响到调用改服务的其他辅,从而引起一系列连锁反应,最后导致整个系统的不可用。 造成雪崩效应常见的原因如下: - 流量突增 - 系统 bug - 硬件或网络异常 - 同步等待 - 缓存击穿 应对的方案: - **提高可用性**,将单台设备转为多台负载均衡集群 - **提高性能**,检查慢 SQL、优化算法、引入缓存来缩短单笔业务的处理时间 - **预防瞬时 TPS 激增**,将系统限流作为常态加入系统架构 - **完善事后处理**,遇到长响应,一旦超过规定窗口时间,服务立即返回异常,中断当前处理 - **加强预警与监控**,引入ELK,进行流量实时监控与风险评估,及时发现系统风险 ### Sentinel Sentinel 是阿里中间件团队开源的,面向分布式服务框架的轻量级高可用流量控制组件。 > Sentinel 分两部分,Sentinel Dashboard 和 Sentinel 客户端 #### 主要的优势和特点 1. 轻量级,核心库无多余依赖,性能消耗小 2. 方便接入,开源生态广泛。 3. 丰富的流量控制场景。 4. 易用的控制台,提供实时监控、机器发现、规则管理等能力。 5. 完善的扩展性设计,提供多样化的 SPI 接口,方便用户根据需求给 Sentinel 添加自定义的逻辑。 #### Sentinel Dashboard Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。 ##### 部署 Sentinel Dashboard 下载地址:https://github.com/alibaba/Sentinel/releases,下载最新 Sentinel Dashboard(这里是 1.8.3) 启动执行命令 `java -jar -Dserver.port=9100 sentinel-dashboard-1.8.3.jar`,启动仪表盘。 > 开发端口 > > ```shell > $ firewall-cmd --zone=public --add-port=80/tcp --permanent > $ firewall-cmd --reload > ``` 默认的用户名密码是 sentinel/sentinel,进入到首页。 ![image-20220314073416691](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220314073416691.png) #### Sentinel 客户端 > 需要集成在 Spring Boot 微服务应用中,用于接收来自 Dashboard 配置的各种规则,并通过 Spring MVC Interceptro 拦截器技术实现限流、熔断保护 使用 IDEA 创建 Sentinel 客户端微服务。使用到的 Maven 依赖: ```xml org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-sentinel org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine ``` application.properties 配置 ```properties server.port=9085 # 应用名称 spring.application.name=sentinel-sample # Actuator Web 访问端口 management.server.port=8091 management.endpoints.jmx.exposure.include=* management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always # Sentinel 控制台地址 spring.cloud.sentinel.transport.dashboard=192.168.1.102:9100 # 取消Sentinel控制台懒加载 # 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包 # 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能 spring.cloud.sentinel.eager=true # 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用 # spring.cloud.sentinel.transport.client-ip= # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html # Nacos认证信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口 spring.cloud.nacos.discovery.server-addr=192.168.1.102:8848 # 注册到 nacos 的指定 namespace,默认为 public spring.cloud.nacos.discovery.namespace=public ``` 启动服务,可以看到 Sentinel-sample,说明已经完成通信注册 ![image-20220314075113582](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220314075113582.png) ##### 测试限流规则 创建 controller.SentinelSampleController 类 ```java @RestController public class SentinelSampleController { @GetMapping("/test_flow_rule") public String testFlowRule() { return "success"; } } ``` 重启服务,浏览器 请求 http://localhost:9085/test_flow_rule,在 Sentinel Dashboard 中点击流控,单机阈值设置为 1(表示每秒只有 1 QPS 访问,超出的服务直接服务降级,抛出异常),最后点击新增完成配置。 ![image-20220314075615154](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20220314075615154.png) 浏览器返回刷新,会出现 `Blocked by Sentinel (flow limiting)`,代表服务已被服务降级。 打赏: 微信, 支付宝 标签: 微服务, spring cloud alibaba, sentinel 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
恭贺大佬喜提新域名