Spring Cloud Gateway 网关使用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
应用型负载均衡 ALB,每月750个小时 15LCU
简介: Gateway 底层基于 Netty 异步通讯的,使用的是 Webflux 框架处理请求。本文中所用到的 Spring Cloud 和 Spring Boot 相关的版本说明版本概述: spring-boot 2.4.2 spring-cloud 2020.0.1服务注册: eureka-client服务熔断: reactor-resilience4j本文主要是通过一个 demo 来对 Gateway 的核心功能进行简要的介绍。demo 项目地址. github 地址

Gateway 核心功能


一. 路由


  1. 配置负载均衡


uri: lb://SERVICE-MEMBER


这里 lb 就是用到了负载均衡, 由于我这里使用的是 eureka-client 3.0.1 内部使用的是loadbalancer 作为负载均衡框。


  1. 配置断言


predicates:
  # 路由断言对符合条件的接口断言
  - Path=/member/**


predicates 下面的所有配置信息都是对服务节点接口的断言,我们还可以对参数, cookie, header 等各方面进行断言


  1. 配置过滤器


filters:
  # 熔断器
  - name: CircuitBreaker
  args:
  name: myCircuitBreaker
  fallbackUri: forward:/fallback


gatway 还提供过滤器的配置,支持自定义过滤器,来控制路由规则


二. 鉴权


实现鉴权咱们的主要主要实现手段是通过 GlobalFilter 的方式来实现的,下面是一个简单的例子判断咱们 cookie 中是否包含 login 信息。如果包含就表示用于已经登录,如果没有就返回 UNAUTHORIZED


  1. 对用户登录进行鉴权,首先定义全局过滤器


/**
 * 自定义登录过滤器判断是否登录
 *
 * @author zhengsh
 * @date 2021-01-31
 */
public class LoginFilter implements GlobalFilter, Ordered {
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    MultiValueMap<String, HttpCookie> cookies = exchange.getRequest().getCookies();
    for (Map.Entry<String, List<HttpCookie>> cookie : cookies.entrySet()) {
      // 如果 cookie 中包含 login 信息就表示通过
      if (cookie.getKey().equals("login")) {
        System.out.println(1);
        return chain.filter(exchange);
      }
    }
    System.out.println(2);
    // 401
    ServerHttpResponse response = exchange.getResponse();
    response.setStatusCode(HttpStatus.UNAUTHORIZED);
    return response.setComplete();
  }
  @Override
  public int getOrder() {
    return -1;
  }
}


三. 降级/熔断


resilience4j 进行服务降级


filters:
  # 熔断器
  - name: CircuitBreaker
  args:
  name: myCircuitBreaker
  fallbackUri: forward:/fallback


Resilience4j 是一个受hystrix启发的一款轻量级容错类库, 在分布式系统中,许多不可避免的调用会失败, 比如超时,一场等。Resilience4j 能够保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性


“断路器” 本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似保险熔断),向调用方法返回一个符合预期的,可处理的被选相应(FallBack), 而不是长时间的等待或者跑出调用方法无法处理的异常,这样就保证了服务调用方的线程不会长时间,不必要地占用,从而避免了故障在分布式系统中进行蔓延,从而导致雪崩效应。


四. 限流


通过 gateway 自带的 redislimiter 算法进行限流


配置参数:


filters:
  # 令牌桶
  - name: RequestRateLimiter
  KeyResolver: userKeyResolver
  args:
    redis-rate-limiter.replenishRate: 10
    redis-rate-limiter.burstCapacity: 20
    redis-rate-limiter.requestedTokens: 1


userKeyResolver 定义


@Bean
public KeyResolver userKeyResolver() {
  return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}


访问方式:

http://127.0.0.1:4001/member/test?user=100


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
17天前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
|
22天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
22天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
40 5
|
22天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
31 5
|
1月前
|
负载均衡 Java 应用服务中间件
Gateway服务网关
Gateway服务网关
53 1
Gateway服务网关
|
24天前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
32 0
|
3月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
81 3
|
2月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
57 0
|
Dubbo Java 应用服务中间件
深入了解Spring Cloud Alibaba Dubbo
在现代分布式系统开发中,构建高性能、可伸缩性和弹性的微服务架构变得越来越重要。Spring Cloud Alibaba Dubbo(简称Dubbo)是一个开源的分布式服务框架,可以帮助开发者构建强大的微服务架构,具备负载均衡、服务治理、远程调用等强大功能。本文将深入介绍Spring Cloud Alibaba Dubbo,帮助你理解它的核心概念、工作原理以及如何在你的项目中使用它。
|
Kubernetes Java 微服务
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)
148 0
Spring Boot 单体应用一键升级成 Spring Cloud Alibaba(1)