Sentinel概述

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。

gitee:https://gitee.com/rmlb/Sentinel/

github: https://github.com/alibaba/Sentinel

1.服务保护策略有哪些?
2.服务限流框架有哪些
3.服务限流算法有哪些?
4.令牌桶、漏桶、滑动窗口
5.RateLimiter Api接口接口限流
6.Nginx实现接口限流
7.Getway实现API接口限流
8.纯手写封装自己的微服务限流框架

服务保护策略

服务限流、降级、熔断、隔离策略

服务限流

服务限流概念:限定固定请求数量 访问服务器端 保护服务接口

限流框架:1.nginx限流 2.谷歌 Guava限流 3.阿里巴巴 Sentinel限流 4.Redis+lua实现限流

本质限流框架底层 都是基于 漏桶、令牌桶、滑动窗口算法实现。

补充概念:qps为1 表达意思就是 每s最多只能够处理1个请求

限流算法

漏桶算法

令牌桶算法

令牌桶的算法:

1.创建一个令牌桶 它的容量假设可以存放2个token;

2.以恒定的速度,生成令牌 如果令牌桶满了,则直接废弃 如果令牌桶

没有满 则存入到令牌桶中;

3.客户端请求过来,从令牌桶中获取令牌,如果能够获取到令牌就可以执行业务

代码,如果获取不到令牌就拒绝该请求。

滑动窗口法

Guava限流

Google的Guava工具包中就提供了一个限流工具类——RateLimiter,RateLimiter是基于“令牌通算法”来实现限流的。

RateLimiter实现接口限流

1.maven依赖

        <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>

2.相关代码

   /*** 限流 qps 1  每s 只会向 令牌桶中 投递一个token*/private RateLimiter rateLimiter = RateLimiter.create(1);/*** 根据RateLimiter 限流** @return*/@RequestMapping("/getMayikt")public String getMayikt() {if (!rateLimiter.tryAcquire()) {log.info("<接口被限流了>");return "您访问次数过多,请稍后重试!";}// 正常执行业务逻辑return "getMayikt";}

基于RateLimiter封装限流框架

1.自定义注解

package com.mayikt.service.ext;import java.lang.annotation.*;/*** @author 余胜军* @ClassName MayiktRateLimiter* @qq 644064779* @addres www.mayikt.com* 微信:yushengjun644*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MayiktRateLimiter {/*** 默认QPS是1 每s 向 令牌桶投递 1s 令牌** @return*/double aqs() default 1;/*** 接口限流的名称** @return*/String name() default "";/*** 限流之后报错提示** @return*/String msg() default "当前访问人数过多,请稍后重试!";
}

2.aop拦截自定义注解

import com.google.common.util.concurrent.RateLimiter;
import com.mayikt.service.ext.MayiktRateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;/*** @author 余胜军* @ClassName AopRateLimiter* @qq 644064779* @addres www.mayikt.com* 微信:yushengjun644*/
@Aspect
@Component
@Slf4j
public class AopRateLimiter {/*** 定义RateLimiter 限流集合容器*/private static ConcurrentHashMap<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();/*** 环绕通知** @param pjp* @return*/@Around(value = "@annotation(com.mayikt.service.ext.MayiktRateLimiter)")public Object currentLimit(ProceedingJoinPoint pjp) throws Throwable {// 1.获取拦截到目标方法MethodSignature methodSignature = (MethodSignature) pjp.getSignature();// 2.获取目标方法Method method = methodSignature.getMethod();// 3.获取目标方法上的注解MayiktRateLimiter mayiktRateLimiter = method.getDeclaredAnnotation(MayiktRateLimiter.class);// 4.获取到请求方法名称String requestMethodName = method.getName();// 5.从容器查找该 请求方法 对应的 rateLimiter 是否有创建 如果没有创建 就创建RateLimiter rateLimiter = rateLimiters.get(requestMethodName);if (rateLimiter == null) {// 防止多个线程同时创建RateLimiter 使用双重检验锁 判断synchronized (this) {if (rateLimiter == null) {// 获取注解上mayiktRateLimiter.aqs参数值rateLimiter = RateLimiter.create(mayiktRateLimiter.aqs());rateLimiters.put(requestMethodName, rateLimiter);}}}try {// 6.判断是否被限流 如果是被限流 则 获取mayiktRateLimiter注解中的 msg 返回if (!rateLimiter.tryAcquire()) {return mayiktRateLimiter.msg();}} catch (Exception e) {log.error("<e:{}>", e);}// 没有被限流 则直接放行return pjp.proceed();}
}

3.限流框架使用案例

    @RequestMapping("/getMeite")@MayiktRateLimiter(aqs = 2, msg = "当前接口已经被限流")public String getMeite() {return "getMayikt";}

Nginx限流

蚂蚁课堂 nginx 1个ip 过来 访问 nginx 1s 10次

根据ip来做限流。

Nginx接入层限流可以使用Nginx自带的两个模块:

1.连接数限流模块ngx_http_limit_conn_module

2.漏桶算法实现的请求限流模块ngx_http_limit_req_module

limit_req_zone b i n a r y r e m o t e a d d r z o n e = o n e : 10 m r a t e = 1 r / s ; 第 一 个 参 数 : binary_remote_addr zone=one:10m rate=1r/s; 第一个参数: binaryr​emotea​ddrzone=one:10mrate=1r/s;第一个参数:binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次
配置演示:

upstream backserver {server 127.0.0.1:22222;}limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=1r/s;server {listen       80;server_name  localhost;location /{limit_req zone=myRateLimit;      proxy_pass http://backserver/;proxy_set_header   Host             $host;proxy_set_header   X-Real-IP        $remote_addr;                       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
  1. 在html 目录下创建一个

50x.html

<html><head><meta charset="utf-8"/></head>
<body>您当前访问人数频率过高,请稍后重试!
</body>

Getway限流

1.配置文件内容

server:port: 81
####服务网关名称
spring:application:name: mayikt-gatewaycloud:gateway:discovery:locator:####开启以服务id去注册中心上获取转发地址enabled: true###路由策略routes:###路由id- id: mayikt-member#### 基于lb负载均衡形式转发uri: lb://mayikt-memberfilters:- StripPrefix=1###匹配规则predicates:- Path=/mayikt-member/**nacos:discovery:server-addr: 127.0.0.1:8848

2.定义过滤器

import com.google.common.util.concurrent.RateLimiter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @author 余胜军* @ClassName RateLimiter* @qq 644064779* @addres www.mayikt.com* 微信:yushengjun644*/
@Component
public class RateLimiterFilter implements GlobalFilter {/*** 限流 qps 1  每s 只会向 令牌桶中 投递一个token*/private RateLimiter rateLimiter = RateLimiter.create(1);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {boolean result = rateLimiter.tryAcquire();if (!result) {ServerHttpResponse response = exchange.getResponse();String msg = "Interface access frequency is too high, please try again later";DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());return response.writeWith(Mono.just(buffer));}// 放行请求return chain.filter(exchange.mutate().build());}
}

3.通过网关访问接口:

http://127.0.0.1:81/mayikt-member/getGatewayLimiter

Redis限流

Sentinel限流

服务降级

服务熔断

服务隔离

Sentinel环境搭建

03.服务限流实现方案相关推荐

  1. 14 基于网关Spring Cloud Zuul的接口限流实现方案

    在Spring Cloud Zuul网关中,限流业务是放在前置过滤器实现的,也就是在请求被Zuul转发给微服务之前进行限流.另外,当前置过滤器中同时存在限流.鉴权.身份认证等业务时,应该将限流业务放在 ...

  2. 如何计算服务限流的配额

    文章来源:https://zhenbianshu.github.io/2020/03/how_to_cal_isolation_limit.html | 问题 请求被限流 之前的文章提到过我们服务使用 ...

  3. 亿级流量架构之服务限流思路与方法

    为什么要限流 日常生活中,有哪些需要限流的地方? 像我旁边有一个国家AAAA景区,平时可能根本没什么人前往,但是一到五一或者春节就人满为患,这时候景区管理人员就会实行一系列的政策来限制进入人流量, 为 ...

  4. 架构设计之「服务限流」

    架构设计之「服务限流」 原文:架构设计之「服务限流」 上一篇我们聊过了架构设计中的「服务隔离」模式,今天我们继续来探索一下在分布式系统架构中的另一个常用的设计:服务限流. 那么,什么是「服务限流」呢? ...

  5. 10分钟带你彻底搞懂服务限流和服务降级

    文章目录 十分钟搞懂系列 服务限流 计数器法 滑动窗口法 漏桶算法 令牌桶算法 服务降级 十分钟搞懂系列 序号 标题 链接 1 10分钟带你彻底搞懂企业服务总线 https://blog.csdn.n ...

  6. 【服务治理】服务熔断、服务降级、服务限流、流量削峰、错峰

    文章目录 服务熔断.服务降级和服务限流 服务熔断 服务降级 服务限流 实现 步骤三.Polly在.NetCore项目中封装 流量错峰.流量限流.流量削峰 流量错峰 服务端错峰策略 客户端错峰策略 流量 ...

  7. 秒杀项目之网关服务限流熔断降级分布式事务

    目录 一.网关服务限流熔断降级 二.Seata--分布式事务 2.1 分布式事务基础 2.1.1 事务 2.1.2 本地事务 2.1.3 分布式事务 2.1.4 分布式事务场景 2.2 分布式事务解决 ...

  8. Sentinel微服务限流、熔断、降级介绍(一)

    概述 在互联网应用中,会有很多突发性的高并发访问场景,比如双11大促.秒杀等.这些场景最大的特点就是访问量会远远超出系统所能够处理的并发数. 在没有任何保护机制的情况下,如果所有的流量都进入服务器,很 ...

  9. 微服务架构 — 服务治理 — 服务限流、服务降级、服务熔断

    目录 文章目录 目录 服务限流 服务降级 服务熔断 服务限流 C ⇄ S 的异常问题:C 的请求太多,超出 S 的服务能力,导致 S 不可用.例如:DoS 攻击,企图耗尽被攻击对象的资源,让目标系统无 ...

最新文章

  1. SpringBoot静态资源的映射
  2. 查询两个日期间隔天数怎么算_大厂都是怎么用Java8代替SimpleDateFormat?
  3. php通过ajax下载文件,通过ajax调用php下载文件
  4. [渝粤教育] 西南科技大学 高频电子线路 在线考试复习资料2021版
  5. 小程序 封装table组件
  6. java:去除字符串中空格 、 oracle (+) 、 mysql中数值运算符和函数
  7. laravel 创建自定义的artisan make命令来新建类文件
  8. php输出因子,如何在PHP因子程序中返回值
  9. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
  10. 渗透之——Metasploit命令及模块
  11. 一次监视雷达行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  12. SAP 工单报工批次确定自动带出批次并拆分
  13. psn账号修改地址可以转服务器,PSN换卡换服换账户教程
  14. 九宫格C语言递归程序,九宫格程序代码 共享并希望大家多提意见
  15. 百家号运营技巧:如何发布图集获得高收益呢?
  16. android卡在gradle,Android Studio打开新项目卡在Gradle的问题
  17. 判断深度学习的效果好坏loss和val_loss比较
  18. 2019年谷歌SEO排名主要因素
  19. 计算机系统i3和i6区别,英特尔内核迭代,有i3 i5 i7,没有i4 i6吗?
  20. 中学教学参考杂志中学教学参考编辑部中学教学参考杂志社2022年第18期目录

热门文章

  1. FreeRTOSMini
  2. mac命令行挂载群晖nas
  3. DecisionTreeRegressor参数详解
  4. Java中的过滤器doFilter里的chain.doFilter()函数理解
  5. 每周读书#3 - 《活着本来单纯》
  6. c语言收银系统程序编码,C语言 超市收银系统.doc
  7. 【VINS-Mono】Estimator::initialStructure
  8. echarts的series配置
  9. vue监听dom元素变化修改echar图表
  10. QIIME2得到PICRUSt2结果后如何分析