本站消息

站长简介


前每日优鲜python全栈开发工程师,自媒体达人,逗比程序猿,钱少话少特宅,我的公众号:想吃麻辣香锅

  java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

java(0)

标签  

暂无标签

日期归档  

2020-11(356)

2020-12(506)

2021-01(423)

2021-02(314)

2021-03(338)

微服务之熔断与降级篇 Sentinel

发布于2021-06-08 12:48     阅读(106)     评论(0)     点赞(23)     收藏(3)


0

1

2

3

4

5

6

7

微服务之熔断与降级篇 Sentinel

熔断与降级

  1. 什么是熔断?
    1. 指一个系统中为了防止系统过载而采取的一系列保护措施,从而防止系统崩溃
  2. 什么是降级?
    1. 当服务器压力过大时被迫选择关闭一些页面,尽可能保证核心业务的运转.
  3. 为什么使用熔断和降级技术
    1. 分布式系统由于一个功能需要调用多个模块,出现问题的几率会大大增加,熔断和降级技术在某个模块出现问题时不会使系统出现雪崩问题,增强系统的稳定性.

Sentinel

  1. 简介
    1. 它是阿里巴巴开源的一个组件,主要以流量为切入点,提供服务熔断与降级,系统自适应,全方面保护系统
  2. sentinel的架构图
    在这里插入图片描述
  3. 特点
    1. 不依赖与其它的框架,运行在JDK1.7,并能与Dubbo和SpringCloud无缝结合
    2. 友好的图形化界面,方便管理

Sentinel的使用

  1. 点击下载
  2. 在下载好的地方按照SpringBoot的启动方式启动即可 java -Dserver.port=6677 -jar sentinel-dashboard-1.8.0.jar
  3. 浏览器输入: http://localhost:6677 输入账号密码(sentinel)即可访问控制台
  4. 项目中使用
    1. 添加依赖

      <!-- springcloud alibaba sentinel -->
      <dependency>
      	<groupId>com.alibaba.cloud</groupId>
      	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
      </dependency>
      
      <!-- SpringBoot Web -->
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      
    2. 添加配置

      spring: 
        application:
          # 应用名称
          name: project-xxxx 
        cloud:
          sentinel:
            # 取消控制台懒加载
            eager: true
            transport:
              # 控制台地址
              dashboard: 127.0.0.1:6677
      
    3. 添加TestUserController.java, 模拟接口返回用户信息

      @RestController
      public class TestUserController
      {
          @GetMapping("/user/info")
          public Object info()
          {
              return "{\"username\":\"admin\",\"password\":\"admin123\"}";
          }
      }
      
    4. 启动SpringBoot项目并访问接口, 登录控制台就可看到访问信息

Sentinel的更多细节

  1. 定义资源@SentinelResource用于定义资源,并提供可选的异常处理和fallback配置项。
    1. 定义接口

      public interface IUserService
      {
          public Object selectUserByName(String username);
      }
      
    2. 定义实现类

      @Service
      public class IUserServiceImpl implements IUserService
      {
          @Autowired
          private RestTemplate restTemplate;
      
          @Bean
          public RestTemplate restTemplate()
          {
              return new RestTemplate();
          }
      
          @SentinelResource(value = "selectUserByName", blockHandler = "selectUserByNameBlockHandler", fallback = "selectUserByNameFallback")
          @Override
          public Object selectUserByName(String username)
          {
              return restTemplate.getForObject("http://localhost:9201/user/info/" + username, String.class);
          }
      
          // 服务流量控制处理,参数最后多一个 BlockException,其余与原函数一致。
          public Object selectUserByNameBlockHandler(String username, BlockException ex)
          {
              System.out.println("selectUserByNameBlockHandler异常信息:" + ex.getMessage());
              return "{\"code\":\"500\",\"msg\": \"" + username + "服务流量控制处理\"}";
          }
      
          // 服务熔断降级处理,函数签名与原函数一致或加一个 Throwable 类型的参数
          public Object selectUserByNameFallback(String username, Throwable throwable)
          {
              System.out.println("selectUserByNameFallback异常信息:" + throwable.getMessage());
              return "{\"code\":\"500\",\"msg\": \"" + username + "服务熔断降级处理\"}";
          }
      
      }
      
    3. 测试接口请求TestUserController.java

      @RestController
      public class TestUserController
      {
          @Autowired
          private IUserService userService;
      
          @GetMapping("/info/{username}")
          public Object info(@PathVariable("username") String username)
          {
              return userService.selectUserByName(username);
          }
      }
      
  2. 流量规则
    1. 控制台定义
      在这里插入图片描述
      1. 资源名: 唯一名称,默认请求路径
      2. 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
      3. 阈值类型/单机阈值:
        1. QPS(每秒请求数量):当调用该api的QPS达到阈值的时候,进行限流
        2. 线程数:当调用该api的线程数达到阈值的时候,进行限流
      4. 是否集群: 不需要集群
      5. 流控模式:
        1. 直接:api达到限流条件时,直接限流
        2. 关联:当关联的资源达到限流阈值时,就限流自己
        3. 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到峰值,就进行限流)【api级别的针对来源】
      6. 流控效果
        1. 快速失败:直接失败,抛异常
        2. Warm Up:根据coldFactor(冷加载因子,默认3)的值,从阈值/coldFactor,经过预热时长,才达到设置的QPS阈值
        3. 排队等待:匀速排队,让请求以匀速通过,阈值类型必须设置为QPS,否则无效
  3. 降级规则
    1. 控制台定义: 选择降级规则,新增降级规则,填入对应信息
      在这里插入图片描述
  4. 动态配置规则
    1. Nacos配置规则
      1. 在nacos中配置自定义规则

        [
          {
            "resource": "selectUserByName",
            "count": 2,
            "grade": 1,
            "limitApp": "default",
            "strategy": 0,
            "controlBehavior": 0
          }
        ]
        
      2. 添加依赖

        <!-- springcloud alibaba nacos config -->
        <dependency>
        	<groupId>com.alibaba.cloud</groupId>
        	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        
        <!-- sentinel datasource nacos -->
        <dependency>
        	<groupId>com.alibaba.csp</groupId>
        	<artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        
      3. 添加相关配置,sentinel下面的dataSource中配置nacos

        spring: 
          application:
            # 应用名称
            name: project-xxxx 
          cloud:
            nacos:
              config:
                # 配置中心地址
                server-addr: 127.0.0.1:8848
                # 配置文件格式
                file-extension: yml
                # 共享配置
                shared-configs:
                  - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
            sentinel:
              # 取消控制台懒加载
              eager: true
              transport:
                # 控制台地址
                dashboard: 127.0.0.1:6677
              # nacos配置持久化
              datasource:
                ds1:
                  nacos:
                    server-addr: 127.0.0.1:8848
                    dataId: sentinel-ruoyi-gateway
                    groupId: DEFAULT_GROUP
                    data-type: json
                    rule-type: flow
        

总结

  1. 阅读微服务相关的姊妹篇可以更好的理解本文哦
  2. 文章列表
    1. 微服务之网关篇 Spring Cloud Gateway
    2. 微服务之注册中心篇 Nacos
    3. 微服务之配置中心篇 Naocs
    4. 微服务之远程调用篇 OpenFeign
    5. 微服务之服务监控篇 Actuator&Admin
    6. 微服务之链路追踪篇 Skywalking
    7. 微服务之分布式日志 ELK
    8. 微服务之分布式事务篇 Seata
    9. 微服务思想介绍

原文链接:https://blog.csdn.net/zwq56693/article/details/117535531


站长简介:前每日优鲜python全栈开发工程师,自媒体达人,逗比程序猿,钱少话少特宅,关注我,做朋友, 我们一起谈人生和理想吧!我的公众号:想吃麻辣香锅

关注公众号回复java,免费领取 免费领取java大神匠心打造,零基础java开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

关注公众号回复java充值+你的账号,免费为您充值1000积分

0

1

2

3

4

5

6

7



所属网站分类: 技术文章 > 博客

作者:java王侯

链接:http://www.javaheidong.com/blog/article/219616/f325486a25b3f400dea9/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)