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路由动态配置Nacos实现

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

    2024年02月07日
    浏览(50)
  • springcloud gateway正确路由配置 uri找不到服务?

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

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

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

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

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

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

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

    2024年02月17日
    浏览(58)
  • 【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日
    浏览(60)
  • 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日
    浏览(73)
  • springcloud gateway 配置predicates 多个path;路由请求头新增参数

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

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

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

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

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

    2024年02月13日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包