一文掌握spring cloud gateway(总结篇)

 更新时间:2024年12月23日 11:09:03   作者:壹佰大多  
Spring Cloud Gateway是Spring Cloud的全新项目,该项目是基于Spring 5.0,Spring WebFlux和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式,本文通过实例代码总结介绍spring cloud gateway的相关知识,感兴趣的朋友一起看看吧

什么是gateway

在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个关键功能:
1.请求路由:根据请求的URL路径和其他参数,将请求路由到正确的后端服务。
2.负载均衡:在多个服务实例之间分配流量,以提高可用性和可扩展性。
3.认证和授权:检查用户是否有权访问特定的服务。
4.限流:控制访问后端服务的请求速率,以防止过载。
5.监控:收集关于API使用情况的统计数据,用于分析和计费。
6.日志记录:记录所有通过网关的请求和响应,以便进行问题排查和性能监控。
7.缓存:提高响应速度和减少后端负载,通过缓存常见的响应。
8.过滤:检验当前的请求是否符合请求的规则。

客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 确定请求与路由匹配,则将其发送到 Gateway Web Handler。此处理程序通过特定于该请求的过滤器链运行该请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。所有“前”过滤器逻辑都​​会执行。然后发出代理请求。发出代理请求后,运行“后”过滤器逻辑。

如何导入gateway依赖

1.导包

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.6.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
 		</dependency>

2.配置yaml文件

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lower-case-service-id: true
          enabled: true
      default-filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback //默认的兜底策略
      routes:
      - id: fee-service
        uri: lb://fee-service //指定的服务
        predicates:
        - Path=/query  //断言

路由配置

1.配置路由谓词工厂和网关过滤器工厂
配置谓词和过滤器有两种方式:快捷方式和完全展开参数。
名称和参数名称将列code在每个部分的第一句或第二句中。参数通常按快捷方式配置所需的顺序列出。
快捷方式配置由过滤器名称识别,后跟等号(=),后跟用逗号分隔的参数值(,)。
配置文件实现:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

java代码实现过滤方式:

@Configuration
public class GateConfig {
    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/check")
                        .filters(f -> f.filter(new IpWhitelistFilter()))  // 注册过滤器
                        .uri("lb://fee-service"))
                .build();
    }
}
package com.umpay.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
 * @author zq
 * data 2024-12-18
 */
@Configuration
@Slf4j
public class IpWhitelistFilter implements GatewayFilter, Ordered {
    private static final String ALLOWED_IPS = "allowedIps";
    private static final String DENIED_IPS = "deniedIps";
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String clientIp=exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        log.info("获取到的ip:============:{}",clientIp);
        String responseBody = "{\"error\": \"Custom error message\"}";
        if(!"1111111".equals(clientIp)){
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            exchange.getResponse().getHeaders().add("Content-Type", "application/json");
            return exchange.getResponse()
                    .writeWith(Mono.just(exchange.getResponse()
                            .bufferFactory().wrap(responseBody.getBytes())));
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 0;
    }
}

gateway配置断路器

导包

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>io.github.resilience4j</groupId>
            <artifactId>resilience4j-reactor</artifactId>
        </dependency>

配置

spring:
  cloud: 
    gateway:
      discovery:
        locator:
          lower-case-service-id: true
          enabled: true
      default-filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback
      routes:
      - id: fee-service
        uri: lb://fee-service
        predicates:
        - Path=/query
        filters:
        - name: CircuitBreaker
          args:
            name: myCircuitBreaker
            fallbackUri: forward:/fallback
 //断路器配置
 resilience4j:
  circuitbreaker:
    instances:
      myCircuitBreaker:
        slidingWindowSize: 10
        failureRateThreshold: 50
        minimumNumberOfCalls: 5
        waitDurationInOpenState: 10s

兜底接口

@RestController
@Slf4j
public class GateController {
    @Autowired
    private FeginClients feginClients;
    @GetMapping("/fallback")
    public Wrapper query(){
        log.info("test:================");
        return WrapperMapper.error();
    }
}

到此这篇关于spring cloud gateway 总结的文章就介绍到这了,更多相关spring cloud gateway内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud Feign多参数传递及需要注意的问题

    SpringCloud Feign多参数传递及需要注意的问题

    这篇文章主要介绍了SpringCloud Feign多参数传递及需要注意的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO

    本文主要介绍了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java中常用加密/解密方法详解

    Java中常用加密/解密方法详解

    本文主要介绍了Java中常用加密/解密方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java8新特性之Optional使用详解

    Java8新特性之Optional使用详解

    这篇文章主要介绍了Java8新特性之Optional使用详解,为了解决空指针异常更加优雅,Java8 提供了 Optional 类库,Optional 实际上是个容器,它可以保存类型T的值,或者仅仅保存null,,需要的朋友可以参考下
    2023-08-08
  • MyBatis-Plus整合金仓数据库KingbaseES的实战指南

    MyBatis-Plus整合金仓数据库KingbaseES的实战指南

    随着数字中国建设的深入推进,国产数据库在关键业务系统中扮演着越来越重要的角色,本文将通过一个电商系统的实战案例,深入探讨MyBatis-Plus整合KingbaseES的详细步骤吧
    2025-10-10
  • 基于restTemplate遇到的编码问题及解决

    基于restTemplate遇到的编码问题及解决

    这篇文章主要介绍了restTemplate遇到的编码问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 25个最好的免费Eclipse插件

    25个最好的免费Eclipse插件

    这篇文章为大家分享了25个让Java程序员更高效的Eclipse插件,感兴趣的朋友可以参考一下
    2015-12-12
  • Java并发编程之重入锁与读写锁

    Java并发编程之重入锁与读写锁

    这篇文章主要介绍了Java并发编程之重入锁与读写锁,文中相关实例代码详细,测试可用,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • java 出现Zipexception 异常的解决办法

    java 出现Zipexception 异常的解决办法

    这篇文章主要介绍了java 出现Zipexception 异常的解决办法的相关资料,出现 java.util.zip.ZipException: error in opening zip file 异常的原因及解决方法,需要的朋友可以参考下
    2017-08-08
  • 基于Java+SpringBoot+Vue前后端分离实现仓库管理系统

    基于Java+SpringBoot+Vue前后端分离实现仓库管理系统

    这篇文章主要介绍了一个完整的仓库管理系统是基于Java+Springboot + Vue前后端分离编写的,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论