用SpringCloud Alibaba搭建属于自己的微服务(十八)~基础搭建~alibaba sentinel流控规则

一.概述

sentinel提供了限流的功能,本章节讲解如何使用sentinel对我们开发的接口进行限流.

二.sentinel限流

1.server-user服务,加入了spring.cloud.sentinel和management的相关配置.

(1)management.endpoints.web.exposure.include这个配置属于springboot Actuator,众所周知,这个包的主要作用是服务健康监控,提供了大量的接口,很多监控服务的组件比如nacos都是以调用这个包提供的一些接口实现的,该配置的作用允许sentinel调用springboot Actuator提供的一些接口,做到完善的监控功能.
(2)spring.cloud.sentinel相关配置已经在代码的注释中给出.
server:
  port: 1001  #服务端口
spring:
  application:
    name: server-user #服务名称
  cloud:
    nacos:
      discovery:
        server-addr: 47.96.131.185:8848
      config:
        server-addr: 47.96.131.185:8848  #nacos config配置中心ip和端口
        file-extension: yaml  #文件扩展名格式,针对于默认的{spring.application.name}-${profile}.${file-extension:properties}配置
        enabled: true #开启或关闭配置中心
        shared-dataids: mysql-user.yaml #自定义的配置文件dataid,以逗号分隔
        refreshable-dataids: mysql-user.yaml #自定义的配置文件dataid实现自动刷新,以逗号分隔(其实就是热加载配置文件)
    sentinel:
      transport:
        dashboard: 47.96.131.185:8080 #sentinel服务端的地址
      eager: true #取消控制台懒加载

management:
  endpoints:
    web:
      exposure:
        include: '*'

ribbon:
  #对所有操作请求都进行重试,默认false(false=只有get请求才会进行重试)
  OkToRetryOnAllOperations: false
  #负载均衡超时时间,默认值5000
  ReadTimeout: 4000
  #ribbon请求连接的超时时间,默认值2000
  ConnectTimeout: 1
  #对当前实例的重试次数,默认0
  MaxAutoRetries: 0
  #对切换实例的重试次数,默认1
  MaxAutoRetriesNextServer: 0

2.启动server-user服务,查看sentinel控制台.

在这里插入图片描述
在这里插入图片描述
可以看到sentinel已经监控到了server-user服务.

3.编写测试代码,查看sentinel的实时监控.

package com.ccm.server.user.controller;


import com.ccm.common.exception.result.ResultSet;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *  @Description sentinel限流测试控制层
 *  @Author zhouzhiwu
 *  @CreateTime 2020/07/28 15:17
 */
@RestController
@RequestMapping(value = "sentinelCurrentlimitingTest")
@Api(tags = "sentinel限流测试控制层")
public class SentinelCurrentlimitingTestController {


    @ApiOperation(value = "限流测试")
    @GetMapping(value = "test01")
    public ResultSet test01() {
        return ResultSet.success("笑脸");
    }

}

在这里插入图片描述
在这里插入图片描述可以看到我们访问接口,实时监控tab会有记录.

3.sentinel流量控制规则.

从弹出框,我们可以看到几个名词和两种类型的配置.

(1).名词解释

a.针对来源:

可以针对调用者进行限流,填写微服务名,默认default(不区分来源).

b.资源名称:

唯一名称,默认请求路径.

c.阈值类型:

qps: 当调用该api的qps达到阈值的时候,进行限流.
线程数: 当调用该api的线程数达到阈值的时候,进行限流.

d.是否集群:

意入其名.

e.流控模式:
直接:
	当api达到限流条件时直接限流
关联:
	当关联资源达到限流条件时限流自己
链路:
	当请求链路上的流量达到阈值,就进行限流:
e.流控效果:
快速失败:
	直接失败,抛出异常
warm up:(预热/冷启动的方式,当系统长期处于低水位的情况下),当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮.通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮.
排队等候:
	均匀排队,阈值类型必须设置qps,否则无效

在这里插入图片描述

4.为接口添加流控规则.

在这里插入图片描述

5.使用jmeter进行压力测试.

一秒钟20个请求.
在这里插入图片描述填写请求路径和参数.
在这里插入图片描述

请求后的结果树,可以看到20个请求中有部分请求失败,响应数据为Blocked by Sentinel (flow limiting),证明我们的流量控制规则生效.
在这里插入图片描述
至此,完事!

三.注意事项:Failed to fetch metric from http://ip/metric?startTime=1595987362000&endTime=1595987368000&refetch=false (ConnectionException: Connection refused)

1.如何我们的项目是本地启动,sentinel服务端部署在云服务器,接口被访问的时候,sentinel服务端控制台会报这个错误,这个错误的含义就是sentinel服务端无法访问到我们的微服务.

2.如何解决呢,其实大家都明白,需要解决的问题是我们的微服务能够被外网访问到,可以去做个内网ip到外网ip的映射,或者把我们的微服务部署到云服务器上.

源码地址:https://gitee.com/chouchimoo/ccm-mall.git(本章节分支:zj-18)

猜你喜欢

转载自blog.csdn.net/theOldCaptain/article/details/107635505