• Sentinel入门


    一、Sentinel介绍

    Sentinel 是阿里云开发的一款用于流量控制、熔断降级、系统负载保护的轻量级库。它可以帮助开发者保障系统的稳定性,在分布式服务架构中,Sentinel 能够对服务提供一定的保护,避免因为某个服务的故障而影响全局。
    Sentinel 的主要功能包括:
    流量控制:通过限制请求的速率,防止过多的请求冲垮系统。
    熔断降级:在服务出现故障或响应过慢时,自动熔断该服务的调用,保护系统的其他部分。
    系统负载保护:通过监控系统负载,当达到一定阈值时,自动触发降级策略,保护系统不被破坏。
    在实际应用中,Sentinel 通常被用在分布式服务架构中的微服务之间,以确保整个系统的稳定性。
    例如,在一个电商应用中,如果订单服务出现故障,那么购物车服务和用户服务可能会受到影响。通过使用 Sentinel,可以在订单服务出现问题时自动熔断购物车服务和用户服务的调用,避免故障蔓延。
    总之,Sentinel 是一款实用的库,旨在帮助开发者构建更加稳定、可靠的系统。

    二、微服务集成Sentinel

    加入依赖

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-openfeignartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>com.alibaba.cloudgroupId>
    7. <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    8. dependency>

    三、安装Sentinel控制台

    3.1 下载jar包,解压到文件夹

    3.2 启动控制台

    执行命令

    java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

     

     

    同时在启动nacos 

    3.3  修改配置文件 

     

    3.4 通过浏览器访问

    四、添加了一个流控规则

    ResponseMsg类

    1. package org.example.until;
    2. import lombok.Data;
    3. @Data
    4. public class ResponseMsg {
    5. private Integer code;
    6. private String msg;
    7. private Object data;
    8. public ResponseMsg(){
    9. }
    10. public ResponseMsg(Integer code , String msg){
    11. this.code = code ;
    12. this.msg = msg;
    13. }
    14. public ResponseMsg(Integer code,String msg , Object data){
    15. this.code = code ;
    16. this.msg = msg;
    17. this.data = data;
    18. }
    19. public static ResponseMsg SUCCESS(Integer code,String msg , Object data){
    20. return new ResponseMsg( code, msg , data);
    21. }
    22. public static ResponseMsg SUCCESS(Integer code,String msg ){
    23. return new ResponseMsg( code, msg );
    24. }
    25. public static ResponseMsg FAIL(Integer code,String msg ){
    26. return new ResponseMsg( code, msg );
    27. }
    28. }

    controlelr类 

    首先通过浏览器访问 test1

    再次刷新sentinel    添加规则

    访问次数过多就会出现一下情况

    五、BlockException异常统一处理

    自定义BlockExceptionHandler 的实现类统一处理BlockException

    在启动类 写一个objectmapper

    自定义一个异常类

    1. @Component
    2. public class TestExceptionHandler implements BlockExceptionHandler {
    3. @Resource
    4. private ObjectMapper objectMapper;
    5. @Override
    6. public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
    7. ResponseMsg responseMsg = null;
    8. if (e instanceof FlowException) {
    9. responseMsg =new ResponseMsg(100,"限流了","没有数据");
    10. }
    11. //返回json数据
    12. httpServletResponse.setStatus(500); // 500
    13. httpServletResponse.setCharacterEncoding("utf-8");
    14. httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
    15. objectMapper.writeValue(httpServletResponse.getWriter(), responseMsg);
    16. //response.getWriter();
    17. }
    18. }

    测试

    六、配置流控模式

    sentinel共有三种流控模式,分别是:

    直接(默认):接口达到限流条件时,开启限流

    关联:当关联的资源达到限流条件时,开启限流 [适合做应用让步]

    链路:当从某个接口过来的资源达到限流条件时,开启限流

    直接流控模式

    直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。上面案例使用的就是直接流控模式。

    关联流控模式

    关联流控模式指的是,当指定接口关联的接口达到限流条件时,开启对指定接口开启限流。

    下面用这两个做测试

    对    /test2   多次访问后会对   /test1进行限流 

    链路流控模式

    加上注解

    @SentinelResource("这里面时标注")

    1. @Service
    2. public class TestService {
    3. @SentinelResource("test")
    4. public void method(){
    5. System.out.println("输出一句话-----------------");
    6. }
    7. }

    在Controller中声明两个方法,分别调用service中的方法method

    1. @RequestMapping
    2. @RestController
    3. public class TestController {
    4. @Resource
    5. private TestService testService;
    6. @GetMapping("/test1")
    7. public ResponseMsg test1(){
    8. testService.method();
    9. return ResponseMsg.SUCCESS(200,"测试1",null);
    10. }
    11. @GetMapping("/test2")
    12. public ResponseMsg test2(){
    13. testService.method();
    14. return ResponseMsg.SUCCESS(200,"测试2",null);
    15. }
    16. }

     禁止收敛URL的入口 context

    在application.properties中添加:

    spring.cloud.sentinel.web-context-unify=false

    #用于控制是否收敛context。将其配置为 false 即可根据不同的URL 进行链路限流。

    控制台配置限流规则

    七、springboot项目连接虚拟机中的nacos

     order

    server.port=8083
    
    spring.application.name=order
    
    spring.cloud.nacos.discovery.server-addr=http://192.168.44.64:80
    
    spring.cloud.sentinel.transport.port=9999
    
    spring.cloud.sentinel.transport.dashboard=localhost:8888
    
    spring.cloud.sentinel.web-context-unify=false
    

    product1

    server.port=8081
    spring.application.name=product
    
    
    
    # 该端口号为sentinal于服务之间的交互  随便写只要不被占用
    spring.cloud.sentinel.transport.port=9999
    
    #sentinal服务所在的地址和端口号
    spring.cloud.sentinel.transport.dashboard=localhost:8888
    
    spring.cloud.nacos.discovery.server-addr=http://192.168.44.64:80

    product2

    server.port=8082
    spring.application.name=product
    
    
    
    # 该端口号为sentinal于服务之间的交互  随便写只要不被占用
    spring.cloud.sentinel.transport.port=9999
    
    #sentinal服务所在的地址和端口号
    spring.cloud.sentinel.transport.dashboard=localhost:8888
    
    spring.cloud.nacos.discovery.server-addr=http://192.168.44.64:80

  • 相关阅读:
    一、shell编程之shell简介
    文盘Rust -- 本地库引发的依赖冲突
    SpringCloud接入nacos配置中心
    E. Split Into Two Sets(染色法判断二分图)
    在 Ubuntu 环境中安装 Go 语言及运行脚本
    来看看 Discourse 3.2.0.beta2 版本添加的新功能
    [NOI2018]情报中心
    基于JAVA三合国际影城计算机毕业设计源码+数据库+lw文档+系统+部署
    Day 3 学习代码注入技术
    React整理总结(三)
  • 原文地址:https://blog.csdn.net/weixin_68193389/article/details/134419856