博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用SpringCloud Alibaba搭建属于自己的微服务(十八)~基础搭建~alibaba sentinel限流
阅读量:4205 次
发布时间:2019-05-26

本文共 3006 字,大约阅读时间需要 10 分钟。

一.概述

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 ccm *  @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 (ConnectionException: Connection refused)

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

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

源码地址:

您的点赞、收藏、转发和关注是我持续创作的动力!

转载地址:http://sktli.baihongyu.com/

你可能感兴趣的文章
创建自定义控件2-自定义绘制
查看>>
创建自定义控件3-可交互性
查看>>
创建自定义控件4-优化
查看>>
android 当系统存在多个Launcher时,如何设置开机自动进入默认的Launcher?
查看>>
Launcher介绍总结
查看>>
对View进行截图 View.getDrawingCache return NULL
查看>>
Using Touch Gestures 》Managing Touch Events in a ViewGroup
查看>>
Using Touch Gestures 》Tracking Movement
查看>>
Using Touch Gestures 》Detecting Common Gestures
查看>>
Using Touch Gestures 》Handling Multi-Touch Gestures
查看>>
SQL WHERE 子句
查看>>
android ViewFlipper的使用
查看>>
FrameLayout
查看>>
Android中Touch事件的处理逻辑
查看>>
Android开发指南-用户界面-事件处理
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
开发者选项中动画时长原理分析(Android M)
查看>>
GE如何测试大型客机引擎
查看>>
Android基础知识4-如何在初始化的时候得到控件的宽和高
查看>>
代码追踪 20130419
查看>>