SpringCloud Gateway详解与配置

这篇具有很好参考价值的文章主要介绍了SpringCloud Gateway详解与配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从0到1构建Gateway

手动构建

基本配置

Route组成

配置方式

 1.yml文件配置

 2.New Bean配置

常用的 Route Predicate Factory介绍


简介

用来构建 API 网关。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。 


特点

  • 动态路由:能够匹配任何请求属性的路由
  • 谓词和过滤器特定于路由
  • 熔断器集成
  • 易于编写谓词和过滤器
  • 集成SpringCloud的服务发现功能
  • 请求速率限制
  • 路径重写

从0到1构建Gateway

手动构建

1.点击SpringGateway初始化 会显示如下页面,点击GENRATE下载配置好的压缩包。

请按需和实际场景选择 构建方式、语言、SpringBoot版本、打包方式和Java版本。

SpringCloud Gateway详解与配置

 2.解压缩下载好的Gateway项目压缩包,用你喜欢的IDE打开,项目结构如下:

SpringCloud Gateway详解与配置

基本配置

Route组成

Route是网关的基本组成单元,它是由ID,目标URI和一组predicates和一组filters组成,如果一组断言结果为真,则匹配路由,目标URI会被访问。

注意:

  • 多个 Predicate 之间是 逻辑and 的关系。
  • 多个Predicate是从定义的顺序从上到下依次执行,也可以指定 order 属性的值。

配置方式

Gateway 提供了两种不同的方式来配置路由,一种是通过yml文件来配置,另一种是通过New Bean来配置。

uri解析

  • http前缀 

        路由匹配完成后跳转到此地址

  • lb前缀

         lb代表负载均衡,service-name代表服务注册中心该服务注册的服务名

 yml文件配置

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
          #路由的ID 唯一即可
        - id: USER-CENTER
          #路由的地址
          uri:  http://localhost:8888/
         #uri:  lb://service-name 
          predicates:
            - Path=/user/**

 New Bean配置

package com.example.gateway.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Yellow Duck 🦆
 * @date 2022-04-27 15:21
 */
@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                //配置路由
                .route("USER-CENTER", r -> r.path("/user")
                        .uri("http://localhost:8888"))
                .build();
    }
}

使用效果: 

  • 启动服务后,可以通过终端或者Postman等工具调用 http://localhost:8889/user
  • 会发现请求被路由转发到http://localhost:8888/user

SpringCloud Gateway详解与配置

Route Predicate Factory

1.After

 作用:请求在指定时间之后才匹配

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
                - After=2022-04-27T16:35:04.030+08:00[Asia/Shanghai]

2.Before 

 作用:请求在指定时间之前才匹配

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
                - Before=2022-04-27T16:35:04.030+08:00[Asia/Shanghai]

3.Between 

作用:请求在指定时间区间之内才匹配,

🦆:第一个时间需要小于第二个时间。

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Between=2022-04-22T16:00:00.020+08:00[Asia/Shanghai],2022-04-22T16:30:00.020+08:00[Asia/Shanghai]

4.Cookie 

作用:请求携带指定Cookie才匹配
🦆:只有当请求Cookie中带有 name=yellowDuck 才可以匹配到此路由

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Cookie=name,yellowDuck

5.Header 

作用:请求携带指定Header才匹配

🦆:只有当请求Header种中带有 X-User-Id:001 才可以匹配到此路由,其中\d+为校验数字正则表达式,可以根据需要自己定制。

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Header=X-User-Id,\d+

6.Host

作用:请求携带指定Host才匹配

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Host=**.yellowDuck.com

7.Method 

作用:请求指定Mehtod请求方式才匹配

🦆:只有GET,POST,DELETE请求才可以访问

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Method=GET,POST,DELETE

8.Path 

作用:请求路径匹配

🦆:只有包含配置的路径才可以匹配 也可以支持/duck/{color}参数形式

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Path=/duck/**

9.Query 

作用:请求参数包含匹配

🦆:请求中必须有duck这个参数才可以访问

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Query=duck

10.RemoteAddr 

作用:请求的IP/IP段一致才可以访问

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - RemoteAddr=127.0.0.1/24

11.Weight 

作用:根据权重的分配路由到相应的请求

🦆:group分组,wight权重,是一个int值,下面代表有90%的请求会分配到http://localhost:8888/有10%请求会分配到http://localhost:8887

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          predicates:
            - Weight=group1,9
        - id: DUCK-CENTER #路由的ID
          uri: http://localhost:8887/ #匹配后路由地址
          predicates:
            - Weight=group2,1

Route Filters

过滤器 Filter 将会对请求和响应进行修改处理,路由过滤器只能指定路由进行使用。

1.AddRequestParameter

作用:对请求添加参数

🦆:如下对GET请求添加 duck=yellow 相当于 ?duck=yellow

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          filters:
            - AddRequestParameter=duck,yellow
          predicates:
            - Method=GET

2.StripPrefix GatewayFilter

作用:对指定数量的路径进行删除过滤

🦆:比如 http://localhost:8888/yellow/big/duck 过滤前两个路径后会变成 http://localhost:8888/duck

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          filters:
            - Path=/duck/**
          predicates:
            - StripPrefix=2

3.PrefixPath GatewayFilter

作用:对指定的路径进行增加

 🦆:比如 http://localhost:8888/duck 过滤增加路径后会变成 http://localhost:8888/yellow/duck

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          filters:
            - Method=POST
          predicates:
            - PrefixPath=/yellow

4.Hystrix GatewayFilter

 1.首先需要添加Hystrix依赖,Hystrix提供了熔断和降级。 

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

2.编写服务降级的处理类

package com.gostop.cloud.gateway.config;

import com.gostop.cloud.gateway.handle.HystrixFallbackHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;

/**
 *
 * @date 2022-04-28 15:02
 * @author YellowDuck
 */
@Configuration
public class GatewayFallbackConfiguration {

    @Autowired
    private HystrixFallbackHandler hystrixFallbackHandler;

    @Bean
    public RouterFunction routerFunction() {
        return RouterFunctions.route(
                RequestPredicates.GET("/defaultfallback")
                        .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), hystrixFallbackHandler);
    }
}
package com.gostop.cloud.gateway.handle;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;


/**
 * 覆盖异常处理
 * @date 2022-04-28 15:03
 * @author Yellow Duck
 */
@Slf4j
@Component
public class HystrixFallbackHandler implements HandlerFunction<ServerResponse> {

    @Override
    public Mono<ServerResponse> handle(ServerRequest serverRequest) {
        serverRequest.attribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR)
                .ifPresent(originalUrls -> log.error("=====网关执行请求:{}失败,服务降级处理=====", originalUrls));

        return ServerResponse
                .status(HttpStatus.INTERNAL_SERVER_ERROR)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .body(BodyInserters.fromValue("网络繁忙!"));
    }
}

作用:提供了熔断和降级功能

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          filters:
            - name: Hystrix
              args:
                name: fallback
                fallbackUri: forward:/defaultfallback
          predicates:
            - Method=GET

5.RequestRateLimiter GatewayFilter

引入Redis限流

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

作用:用于限流

#GateWay项目端口号
server:
  port: 8889
spring:
  cloud:
    gateway:
      routes:
        - id: USER-CENTER #路由的ID
          uri:  http://localhost:8888/ #匹配后路由地址
          filters:
            - name: RequestRateLimiter
              args:
                #每秒允许处理的请求数量
                redis-rate-limiter.replenishRate: 10 
                #每秒最大处理的请求数量
                redis-rate-limiter.burstCapacity: 20 
                redis-rate-limiter.requestedTokens: 1
          predicates:
            - Method=GET,POST

SpringCloud Gateway详解与配置文章来源地址https://www.toymoban.com/news/detail-403434.html

到了这里,关于SpringCloud Gateway详解与配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • springcloud gateway正确路由配置 uri找不到服务?

    引言 在集成nacos组件以及springcloudalibaba 的gateway时,出现正确配置,如下文配置,却在测试demo调用该服务的时候,无法路由到此服务,说是无效服务。经过查阅资料得知其命名不符合gateway的命名规范,因而无法识别。规范详情见下文。 gateway可以识别的nacos服务名,命名规范

    2024年01月19日
    浏览(11)
  • SpringCloud-Gateway路由动态配置Nacos实现

    编写配置类 properties添加配置 自定义RouteDefinitionLocator 编写GatewayDynamicConfiguration配置类

    2024年02月07日
    浏览(13)
  • 【springcloud 微服务】Spring Cloud 微服务网关Gateway使用详解

    目录 一、微服务网关简介 1.1 网关的作用 1.2 常用网关 1.2.1 传统网关 1.2.2 云原生网关

    2023年04月16日
    浏览(19)
  • 【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

    【SpringCloud技术专题】「Gateway网关系列」(2)微服务网关服务的Gateway功能配置指南分析

    Spring Cloud Gateway简介 Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。 Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了

    2024年02月11日
    浏览(23)
  • SpringCloud Gateway网关多路由配置访问404解决方案

    SpringCloud Gateway网关多路由配置访问404解决方案

    现象:网关成功注册进Eureka,但是通过网关访问时出现404 可以通过以下几种方式尝试解决,不是必须都配置,根据自己项目情况处理。 配置 filters: - StripPrefix=1,与路由id同级,去除前缀 网关中如果有 spring-boot-starter-actuator、spring-boot-starter-web 依赖,删除。 启动类没有直接写

    2024年02月17日
    浏览(11)
  • 【SpringCloud Alibaba】Nacos Config配置管理与Gateway 网关

    【SpringCloud Alibaba】Nacos Config配置管理与Gateway 网关

    目录 一、Config 远程配置 1.1 config 介绍 1.2 bootstrap.yml 配置文件 二、Gateway 网关 2.1 gateway 介绍 2.2 gateway 使用 2.2.1 方式一 2.2.2 方式二(动态路由)         微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大 量的服务。

    2024年02月02日
    浏览(39)
  • 39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

    39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

    目录 一、SpringCloud。 (1)Nacos配置管理。 (1.1)nacos中添加配置文件、微服务引入依赖,并配置bootstrap.yml文件。 (1.2)获取配置文件信息,实现热更新。 (1.3)多环境配置共享。 (1.4)多服务共享配置。 (2)http客户端Feign。 (2.1)RestTemplate方式调用存在的问题。 (2.2)

    2024年02月10日
    浏览(40)
  • springcloud gateway 配置predicates 多个path;路由请求头新增参数

    一、 在一个微服务节点的predicates下配置多个path: - Path=/test/batis/test,/test/testJmeter,具体配置如下: 二、 在请求头中新增header参数,yml文件配置如下: 三、自定义filter中新增请求头参数:

    2024年02月16日
    浏览(14)
  • SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)

    SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)

    Apache Dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力 1、协议支持方面 Feign更加优雅简单。Feign是通过REST API实现的远程调用,基于Http传输协议,服务提供者需要对外暴露Http接口供消费者调用,服务粒度是http接口级的。通过短连接的方式进行通信,

    2024年02月06日
    浏览(592)
  • SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

    SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包