• Sentinel


    你的脸是为了呈现上帝赐给人类最贵重的礼物——微笑,一定要成为你工作最大的资产

    雪崩问题及解决

    简述

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

    依赖服务I的业务请求被阻塞,用户不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞:
    在这里插入图片描述
    服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,那么当前服务也就不可用了。

    那么,依赖于当前服务的其它服务随着时间的推移,最终也都会变的不可用,形成级联失败,雪崩就发生了
    在这里插入图片描述
    解决雪崩问题的常见方式有四种:

    超时处理

    •超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
    在这里插入图片描述

    熔断、限流

    当发现访问服务D的请求异常比例过高时,认为服务D有导致雪崩的风险,会拦截访问服务D的一切请求,形成熔断:
    在这里插入图片描述
    流量控制:限制业务访问的QPS,避免服务因流量的突增而故障
    在这里插入图片描述

    Sentinel入门

    安装DashBoard

    1. 下载
    2. 运行
    java -jar sentinel-dashboard-1.8.6.jar
    
    • 1
    1. 如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:
      | 配置项 | 默认值 | 说明 |
      | -------------------------------- | ---------- | ---------- |
      | server.port | 8080 | 服务端口 |
      | sentinel.dashboard.auth.username | sentinel | 默认用户名 |
      | sentinel.dashboard.auth.password | sentinel | 默认密码 |

    例如,修改端口:

    java -Dserver.port=8090 -jar  sentinel-dashboard-1.8.6.jar
    
    • 1

    账号密码都是 sentinel

    在这里插入图片描述

    因为 还没有与微服务进行整合,所以为空

    使用Sentinel

    1. pom依赖
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. yaml
    server:
      port: 8088  # 微服务端口
    spring:
      cloud: 
        sentinel:
          transport:
            dashboard: localhost:8080 # dashboard的地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 随便访问一个接口
      在这里插入图片描述

    Fegin整合Sentinel

    依赖

    
    <dependency>
    	 <groupId>org.springframework.cloudgroupId>
    	 <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    开启对Sentinel的支持

    feign:
      sentinel:
        enabled: true # 开启降级
    
    • 1
    • 2
    • 3

    创建容错类

    @Component
    public class ProductFeignFallBack implements ProductFeignApi {
        @Override
        public Product findByPid(Long pid) {
            Product product = new Product ();
            product.setPid (-1L);
            product.setPname ("兜底数据");
            product.setPprice (0.0);
            return product;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在feign接⼝中 定义容错类

    @FeignClient(name = "product-service", fallback =
            ProductFeignFallBack.class)
    public interface ProductFeignApi {
        @RequestMapping("/product/{pid}")
        public Product findByPid(@PathVariable("pid") Long pid);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    feign接口指定fallback类实现 Feign远程调用的接口,重写 方法即可!!!

    集成Sentinel实现⽹关限流

    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-spring-cloud-gateway-adapterartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-alibaba-sentinel-gatewayartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    规则持久化

    引入依赖

    需要限流的服务引入依赖

    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    配置Nacos地址

    需要限流的服务 配置地址

    spring:
      cloud:
        sentinel:
          transport:
            dashboard: localhost:8080 # dashboard端口
          datasource:
            flow:
              nacos:
                server-addr: localhost:8848 # nacos地址
                dataId: orderservice-flow-rules
                groupId: SENTINEL_GROUP
                rule-type: flow # 还可以是:degrade、authority、param-flow
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    见资料使用

  • 相关阅读:
    几个可以整蛊你朋友的Python程序
    【infiniband】SDR、DDR、QDR、FDR、EDR、HDR、NDR
    Pytest框架和Unittest框架的区别
    总结:golang一些常见写法
    用HTML+CSS做一个学生抗疫感动专题网页设计作业网页
    java第三讲:数组(Array)
    某猫投诉app逆向 【一鱼多吃app逆向】
    C++中“ ? : ”三目运算符的坑
    现货黄金贵金属投资难不难做?
    使用 PyTorch 的计算机视觉简介 (4/6)
  • 原文地址:https://blog.csdn.net/qq_30659573/article/details/127577889