IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SpringCloud.服务限流与熔断 -> 正文阅读

[大数据]SpringCloud.服务限流与熔断

在昨天的基础上增加代码

一、限流

限流的目的是通过对并发访问 / 请求进行限速或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可由 拒绝服务 ,就是定向到错误页或友好的展示页,排队或等待。
限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击。在高并发的应用中,限流是一个绕不开的话题。
令牌桶算法
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

?

QPS
每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
提高带宽

1、Gateway限流的实现

①、pom.xml(gateway)

降版本,

Spring Cloud Gateway 官方提供了 RequestRateLimiterGatewayFilterFactory 类,使用 redis lua 脚本来实现令牌桶的方式。

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
Gateway 通过内置的 RequestRateLimiter 过滤器实现限流,使用令牌桶算法,借助 Redis 保存中间数据。用户可通过自定义KeyResolver 设置限流维度。
·对请求的目标 URL 进行限流
·对来源 IP 进行限流
·特定用户进行限流

②、application.yml

添加 redis 配置

? redis:
? ? host: 127.0.0.1
? ? port: 6379
? ? # password: 123
? ? database: 0

如果 redis 连接失败,限流功能将不能开启。因为没有 redis 作为容器来保存令牌,限流功能自然就失效了。
可以将 redis 的配置信息保存到 nacos 中,通过添加 nacos 配置中心客户端的方式进行读取

③、增加请求限流配置类

RequestRateLimiterConfig :

package com.mwy.code;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import reactor.core.publisher.Mono;

/**
 * 请求限流配置
 */
@Configuration
public class RequestRateLimiterConfig {

    /**
     * 按IP来限流
     */
    @Bean
    @Primary
    public KeyResolver ipAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }

    /**
     * 按用户限流
     */
    @Bean
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    }

    /**
     * 按URL限流,即以每秒内请求数按URL分组统计,超出限流的url请求都将返回429状态
     *
     * @return
     */
    @Bean
    KeyResolver apiKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getPath().toString());
    }

}

④、application.yml

关掉自定义配置

添加限流配置
- name: RequestRateLimiter
  args:
    #用于限流的键的解析器的 Bean 对象的名字,使用 SpEL表达式根据#{@beanName}获取Bean对象
    key-resolver: '#{@ipAddrKeyResolver}'
    #令牌桶填充速率,允许用户每秒处理多少个请求
    redis-rate-limiter.replenishRate: 10
    #令牌桶总容量,允许在一秒钟内完成的最大请求数
    redis-rate-limiter.burstCapacity: 20

注掉这个依赖,与版本有问题,这个依赖是用来读取远程nacos配置

?⑤、测试从网关访问

说明我们已经通过网关访问到消费者了

?2、压力测试

知乎好的文章:

压力测试是每一个 Web 应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率
预估系统的承载能力,使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步

我们虽然访问成功了,但是并不知道有没有限流,所以进行压力测试;

解压:

①、apache-jmeter-5.2.1->bin->双击打开:jmeter.bat

改为中文

??②、进行压力测试

添加线程组,模拟多个人去访问

?并不知道运作的对象是谁,所以添加HTTP请求

?添加查看请求结果:

?③、进行压力测试

HTTP请求中点击启动:选择no

?表格查看运行结果:代码中允许访问人数为10人,最大访问人数为20人,超过允许访问请求就会变为红色:

二、熔断

知乎好的文章:服务降级与服务熔断区别 - 知乎

在分布式系统中,网关作为流量的入口,大量请求进入网关,向后端远程系统或服务发起调用,后端服务不可避免的会产生调用失败(超时或者异常),失败时不能让请求堆积在网关上,需要快速失败并返回回去,
这就需要在网关上做熔断、降级操作

1、增加熔断的依赖

2020版左右的idea熔断就已经停止了,可以进行降版本操作,还可以进行

sentinel (史上最全+入门教程) - 疯狂创客圈 - 博客园

降级操作在上面就已经写好了

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、application.yml

增加熔断配置

? ? ? ? ? ? - name: Hystrix
? ? ? ? ? ? ? args:
? ? ? ? ? ? ? ? name: fallback
? ? ? ? ? ? ? ? fallbackUri: forward:/fallback

?转发,新建填写路径

3、新建TestController类

package com.mwy.code;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class TestController {

    @RequestMapping("fallback")
    public Object fallback(){
        Map<String,Object> map=new HashMap<>();
        map.put("code","204");
        map.put("msg","服务已降级");
        return map;
    }
}

4、测试

①、正常访问

?②、关闭消费者服务服务

?熔断成功

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:14:20  更:2022-02-19 01:16:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:09:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码