SpringCloud Gateway详细分析实现负载均衡与熔断和限流

目录
  • 环境准备
  • 1.pom依赖
  • 2.yaml配置
  • 3.路由转发和负载均衡测试
    • user服务暴露接口
    • 返回结果输出
  • 4.gateway熔断实现
    • 4.1 熔断代码
    • 4.2 测试
  • 5.gateway限流
    • 5.1 需要集成redis
    • 5.2 yaml配置
    • 5.3 注入到spring容器
    • 5.4 测试

环境准备

  • 注册中心Nacos,也可以其他
  • springboot 2.6.8
  • spring-cloud-dependencies 2021.0.3

1.pom依赖

parent包

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.6.8</version>
</parent>

gateway依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册与发现-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<version>2021.0.1.0</version>
</dependency>
<!--远程服务路由-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

springcloud版本管理

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>2021.0.3</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

2.yaml配置

spring:
  application:
    name: gatewayservice
  cloud:
    #找对应网段的网卡 不配置内部服务就走外网
    inetutils:
      preferred-networks: 192.168.0
    nacos:
      discovery:
          #nacos注册地址
        server-addr: 192.168.0.221:8848
    gateway:
      routes:
      - id: user
          #根据服务名转发 只需要名称 不用端口
        uri: lb://userservice
        #ip的形式转发
#        uri: http://127.0.0.1:7540
        predicates:
        #路由规则
        - Path=/user/**
        filters:
        #1/去掉前缀 0/保持原路径
        - StripPrefix=1
      #跨域配置 
      globalcors:
        cors-configurations:
          '[/**]':
            # 允许携带认证信息
            allowCredentials: true
            # 允许跨域的源(网站域名/ip),设置*为全部
            allowedOriginPatterns: "*"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: "*"
            # 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*"

#本地静态路由配置 jar包依赖不一样
#my-load-balanced-service:
#  ribbon:
#    listOfServers: http://127.0.0.1:7540,http://127.0.0.1:7541
    #轮询
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

3.路由转发和负载均衡测试

启动不同端口的user服务,然后通过gateway调用

user服务暴露接口

访问地址http://127.0.0.1:7500/user/test

@Value("${server.port}")
String port;
@GetMapping("/test")
public String test() {
    return new Date().getTime() + ":" + port;
}

返回结果输出

1657261506117:7540
1657261509785:7541
1657261513874:7540
1657261517464:7541

可以正常路由转发和负载均衡,默认策略是轮询

4.gateway熔断实现

熔断:就是通过在转发过程中失败的,从而采取的降级策略。良好的返回提示给前端。

4.1 熔断代码

@Component
public class FallbackHandler implements ErrorWebExceptionHandler {
    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        String message = "服务正在维护,请稍后再试!";
        byte[] bytes = String.format("{\"code\":-1,\"message\":\"%s\",\"data\":null}",
                message).getBytes(StandardCharsets.UTF_8);
        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
        return exchange.getResponse().writeWith(Flux.just(buffer));
    }
}

本来是想通过Hystrix直接配置重定向的,奈何spring-cloud-starter-netflix-hystrix已经不更新了,没法兼容。直接采用一刀切算了。

4.2 测试

开启gateway和user服务访问后,然后停掉user。结果如下

{"code":-1,"message":"服务正在维护,请稍后再试!","data":null}

在这里需要注意的两个点

  • 如果配置的是服务名,gateway先注册转发服务还没注册到Nacos时,访问就不会走熔断,会提示No servers available for service: userservice
  • 如果配置的是http地址,无对应的服务存在时则可以正常走熔断

5.gateway限流

用的是自带的令牌桶算法,例如总共十个令牌,每秒恢复一个,那么一秒内最大只能获取10个令牌,超过的则直接控制掉返回429 Too Many Requests

5.1 需要集成redis

pom依赖如下

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

5.2 yaml配置

#引入数据库
redis:
  database: 0
  host: 192.168.0.100
  port: 6379

//限流策略
gateway:
  routes:
  - id: user
    uri: lb://userservice
    predicates:
    - Path=/user/**
    filters:
    #名称不可修改
    - name: RequestRateLimiter
      args:
          #限流策略名 通过代码注入到spring容器中去
        key-resolver: "#{@ipKeyResolver}"
        #令牌桶每秒填充平均速率
        redis‐rate‐limiter.replenishRate: 1
        #令牌桶总容量
        redis‐rate‐limiter.burstCapacity: 2
        # 每次请求获取的令牌数
        redis-rate-limiter.requestedTokens: 1

上述配置含义:针对ip限流,总令牌数2,没秒恢复一个,每次获取一个。也就是说一秒内超过2次则会被限流。

注意上述限流配置缺一不可,不然启动也不会报错,也不会生效,重点是转发也不成功了

5.3 注入到spring容器

//针对ip限流
@Primary
@Bean(value = "ipKeyResolver")
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
//针对路径限流
//    @Bean(name = "apiKeyResolver")
public KeyResolver apiKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getPath().value());
}

5.4 测试

访问http://127.0.0.1:7500/user/test,一秒内访问三次

redis截图

网页端截图

限流生效!

到此这篇关于SpringCloud Gateway详细分析实现负载均衡与熔断和限流的文章就介绍到这了,更多相关SpringCloud Gateway负载均衡内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springcloud整合gateway实现网关全局过滤器功能

    目录 1.代码实现: 2.实现效果: springcloud整合gateway实现网关全局过滤器功能,在​ ​springcloud整合gateway实现网关 ​​基础功能上进行修改. 1.代码实现: 添加自定义全局过滤器 /**  * 自定义一个全局过滤器  * 实现 globalfilter , ordered接口  */ @Component public class LoginFilter implements GlobalFilter, Ordered {     /**      *

  • springCloud gateWay 统一鉴权的实现代码

    目录 一,统一鉴权 1.1鉴权逻辑 1.2代码实现 一,统一鉴权 内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己 编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验. 1.1 鉴权逻辑 开发中的鉴权逻辑: 当客户端第一次请求服务时,服务端对用户进行信息认证(登录) 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证 以后每次请求,客户端都携带认证的token 服务端对token进行解密,判断是否有效

  • SpringCloud Gateway实现API接口加解密

    目录 接口范围 启用禁用/版本 加密算法 报文格式 网关实现细节代码 filter过滤器请求配置和请求方式分发 Get请求参数解密包装 ServerHttpRequestDecorator post请求参数解密包装 ServerHttpRequestDecorator GET/POST返回值加密处理CryptoServerHttpResponseDecorator 完整CryptoFilter实现 接口范围 所有GET请求 白名单除外 body 体 是 application_json 和 ap

  • springcloud gateway网关服务启动报错的解决

    目录 gateway网关服务启动报错 集成gateway 报错 原因分析 gateway网关运行时报错问题(版本问题) 父级中的版本问题 原因:父项目中的jdk版本问题 解决方法 gateway网关服务启动报错 集成gateway springcloud网关集成gateway服务 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter

  • springcloud整合gateway实现网关的示例代码

    目录 1.项目目录: 2.代码实现: 3.实现效果: 1.项目目录: 创建项目gateway作为父类 2.代码实现: 父类依赖 ​ <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.6.2</versi

  • 基于SpringCloudGateway实现微服务网关的方式

    目录 (一)什么是微服务网关 (二)Spring Cloud Gateway网关 2.1 核心概念: 2.2 搭建环境: (三) 路由配置详解 3.1 自定义断言配置 3.2 断言不匹配404页面自定义 (四)Spring Cloud Gateway过滤器 (五) 网关限流 5.1 常见的一些限流算法: 5.2 集成Sentinel进行限流 5.3 网关实现跨域 (六)总结 (一)什么是微服务网关 后端写完所有的微服务之后,最终是要交给前端去调用.我们都知道每个微服务都有各自的端口号,如果前端直

  • SpringCloud Gateway之请求应答日志打印方式

    目录 Gateway请求应答日志打印 第一步 第二步 Gateway全局请求日志打印 把请求体的数据存入exchange 编写全局日志拦截器代码 在代码中配置全局拦截器 Gateway请求应答日志打印 请求应答日志时在日常开发调试问题的重要手段之一,那么如何基于Spring Cloud Gateway做呢,请看我上代码. 第一步 创建RecorderServerHttpRequestDecorator,缓存请求参数,解决body只能读一次问题. public class RecorderServ

  • SpringCloud Gateway读取Request Body方式

    目录 Gateway读取RequestBody 分析ReadBodyPredicateFactory 配置ReadBodyPredicateFactory 编写自定义GatewayFilterFactory 完整的yml配置 Gateway自定义filter获取body的数据为空 首先创建一个全局过滤器把body中的数据缓存起来 在自定义的过滤器中尝试获取body中的数据 解析body的工具类 Gateway读取Request Body 我们使用SpringCloud Gateway做微服务网关

  • SpringCloud GateWay网关示例代码详解

    目录 一.网关基本概念 1.API网关介绍 2.Spring Cloud Gateway 3.Spring Cloud Gateway核心概念 一.网关基本概念 1.API网关介绍 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:(1)客户端会多次请求不同的微服务,增加了客户端的复杂性.(2)存在跨域请求,在一定场景下处理相对复杂.(3)认证复杂,每个服务都

  • SpringCloud Gateway详细分析实现负载均衡与熔断和限流

    目录 环境准备 1.pom依赖 2.yaml配置 3.路由转发和负载均衡测试 user服务暴露接口 返回结果输出 4.gateway熔断实现 4.1 熔断代码 4.2 测试 5.gateway限流 5.1 需要集成redis 5.2 yaml配置 5.3 注入到spring容器 5.4 测试 环境准备 注册中心Nacos,也可以其他 springboot 2.6.8 spring-cloud-dependencies 2021.0.3 1.pom依赖 parent包 <parent> <

  • GateWay动态路由与负载均衡详细介绍

    目录 概述 项目实例 1.gateway-server模块 1.1.pom.xml文件 1.2.application.yml文件 1.3.主函数类 2.login-service模块 2.1.pom.xml文件 2.2.application.yml文件 2.3.LoginController文件 2.4.主函数类 3.功能测试 概述 从之前的配置里面我们可以看到我们的 URL 都是写死的,这不符合我们微服务的要求,我们微服务是只要知道服务的名字,根据名字去找,而直接写死就没有负载均衡的效果了

  • SpringCloud与Consul集成实现负载均衡功能

    负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术.负载均衡将特定的业务(网络服务.网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性.负载均衡基本概念有:实服务.实服务组.虚服务.调度算法.持续性等,其常用应用场景主要是服务器负载均衡,链路负载均衡. 一.背景 SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡.其主要拓扑结构

  • SpringCloud手写Ribbon实现负载均衡

    前言 前面我们学习了 SpringCloud整合Consul,在此基础上我们手写本地客户端实现类似Ribbon负载均衡的效果. 注: order 模块调用者 记得关闭 @LoadBalanced 注解. 我们这里只演示 注册中心 consul,至于 zookeeper 也是一模一样. 生产者 member模块 member 服务需要集群,所以我们copy application-consul.yml 文件命名为 application-consul2.yml 服务别名一致,只需要修改端口号即可.

  • SpringCloud Zuul实现负载均衡和熔断机制方式

    一.场景 笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖 springboot版本:1.5.9.RELEASE springcloud版本:Dalston.SR5 <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artif

  • 超级详细的nginx负载均衡配置

    目录 前言 实验准备 实验步骤 其他负载均衡配置策略 总结 前言 nginx作为一款企业级的代理服务器,不管是大中小各类生产项目中,均有广泛的使用,尤其是在前后端分离的项目中,nginx作为路由转发的功能是非常常用的: 在一些流量比较大的项目中,为了应对高并发的场景,后端服务往往采用集群部署,这时候,就需要使用到nginx的负载均衡功能: 实验准备 nginx服务器: 两个后端服务: 实验步骤 1.启动两个后端服务 这里准备了两个springboot工程,编写了2个测试使用的接口,以端口号区分

  • Springcloud ribbon负载均衡算法实现

    一 前言 经过几篇的cloud系列文章,我想大家都有一个坚实的基础,后续的学习就会轻松很多,如果是刚刚来看的读者需要有eureka基础知识,或者查阅知识追寻者的cloud系列专栏:这篇文章主要讲解如何使用ribbon实现web service客户端调用,ribbon默认算法实现负载均衡等! 二 ribbon简介 ribbon是一个客户端负载均衡器,其能够整合不同的协议工具进行web service API 调用: 主要特色如下: 提供可插拔式的负载均衡整合服务发现故障弹性恢复cloud支持客户端

  • SpringCloud Gateway 路由配置定位原理分析

    环境:springcloud Hoxton.SR11 本节主要了解系统中的谓词与配置的路由信息是如何进行初始化关联生成路由对象的.每个谓词工厂中的Config对象又是如何被解析配置的. 所有的谓词工厂中的Config中属性值是如何被配置的. 在SpringCloud Gateway中的所有谓词工厂如下: 命名规则:XxxRoutePredicateFactory.所有的这些谓词工厂都是如下的继承关系 public class MethodRoutePredicateFactory extends

  • SpringCloud LoadBalancerClient 负载均衡原理解析

    目录 深入解析 LoadBalancerClient 接口源码: 1.LoadBalancerClient 源码解析: 2.ILoadBalancer 源码解析: LoadBalancerClient 是 SpringCloud 提供的一种负载均衡客户端,Ribbon 负载均衡组件内部也是集成了 LoadBalancerClient 来实现负载均衡.那么 LoadBalancerClient 内部到底是如何做到的呢?我们先大概讲一下 LoadBalancerClient 的实现原理,然后再深入源

  • Django高并发负载均衡实现原理详解

    1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理. 那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题. 下面详细介绍负载均衡的四种实现方式 2 HTTP重定向实现负载均衡 过程描述 当用户向服务器发起请求时,请求首先

随机推荐