SpringCloud网关Gateway功能实现

 更新时间:2025年09月19日 11:11:54   作者:咖啡Beans  
本文介绍SpringCloud网关Gateway功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

摘要

本文介绍微服务中网关的功能,并通过代码展示如何实现服务发现、路由转发、统一认证、日志监控、跨域处理等功能。

认识网关Gateway

网关Gateway是微服务项目的后端入口,负责请求路由、负载均衡、安全控制、协议转换等功能,对整个微服务项目做出统一的请求前置处理功能。通过网关的转发,可避免直接暴露具体服务实例。  

功能

  • 路由转发:作为API网关,核心功能之一是将请求路由到正确的后端服务,可灵活地定义路由规则,将不同的请求路径、主机或参数等映射到不同的服务。 
  • 过滤器:用于修改请求和响应,如添加请求头、修改响应体、限流、熔断等。  
  • 服务发现:与SpringCloud的服务发现组件nacos等集成,自动发现和路由到后端服务实例。 
  • 统一认证:进行统一的身份认证和授权,保护后端服务不受未授权访问。
  • 监控与日志:方便统一收集和处理请求日志,监控系统运行状态。 
  • 负载均衡:与SpringCloudLoadBalancer集成,实现对后端服务的负载均衡,将请求分发到多个实例上。 
  • 限流与熔断:支持Hystrix等组件,实现限流和熔断功能,保护后端服务免受过载影响。 
  • 断言功能:通过断言工厂来实现对请求的灵活匹配,如根据请求路径、方法、参数、头信息等进行路由决策。

代码示例

导入依赖

<!--nacos 注册中心 客户端依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关依赖 路由转发+请求限流+身份认证+负载均衡-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

1)路由转发

配置application.yml

spring:
  application:
    name: springgateway-use   #服务名
servlet:
    context-path: /
cloud:
    nacos:
      server-addr: localhost:8848 #nacos服务端地址,默认8848
      discovery:
        ephemeral: true   #默认是临时实例
    gateway:
      discovery:
        locator:
          enabled: true # 启用服务发现
          lower-case-service-id: true # 服务名小写
      # 路由配置
      routes:
        -id: feign-producer-route #确保路由 ID 唯一,路径匹配规则正确。
          uri: lb://feign-producer # 负载均衡到服务名 feign-producere
          predicates:
            - Path=/producer/** # 匹配路径 /producer/**
          filters:
            - StripPrefix=1      # 过滤器,去掉路径前缀 去除路径前缀 /producer

配置类

package org.coffeebeans.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;

@Configuration
public class GatewayConfig {
    //配置自定义的路由规则
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("feign-producer", r -> r
                        .path("/producer/**") // 匹配 "/producer/**" 路径的请求
                        .uri("lb://feign-producer")) // 转发到名为 "feign-producer" 的微服务
                .build();
    }
}

2)过滤器 权限校验

package org.coffeebeans.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//统一认证 自定义全局过滤器 应用于所有请求 权限校验
@Component
public class GlobalAuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 检查请求头中的 authorization
        String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (authHeader == null || !authHeader.equals("admin")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -1; // 设置过滤器的优先级
    }
}

3)过滤器 日志监控

package org.coffeebeans.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//日志过滤
@Slf4j
@Component
public class GlobalLogFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
       long startTime = System.currentTimeMillis(); // 记录请求开始时间
       String requestUri = exchange.getRequest().getURI().toString(); // 获取请求地址
       // 替换响应对象并继续过滤器链
       return chain.filter(exchange.mutate().build())
             .doOnSuccess(aVoid -> {
                long endTime = System.currentTimeMillis();
                long duration = endTime - startTime;
                log.info("请求地址: {}, 耗时: {}ms", requestUri, duration);
             });
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

缓存请求

package org.coffeebeans.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;


//缓存请求正文 避免Stream closed 错误
@Component
public class GlobalCacheRequestFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (request) ->
          chain.filter(exchange.mutate().request(request).build())
       );
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

4)过滤器 跨域处理

package org.coffeebeans.filter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpMethod;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

//过滤器 统一cors跨域策略
@Configuration
public class GlobalCorsFilter {
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public CorsWebFilter filter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod(HttpMethod.GET);  // 允许GET请求
        config.addAllowedMethod(HttpMethod.POST); // 允许POST请求
        config.addAllowedMethod(HttpMethod.OPTIONS); // 允许OPTIONS预检请求
        config.addAllowedHeader(CorsConfiguration.ALL); // 允许所有请求头
        config.addAllowedOriginPattern(CorsConfiguration.ALL); // 允许所有来源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(newPathPatternParser());
        source.registerCorsConfiguration("/**", config); // 应用到所有路径
        return new CorsWebFilter(source);
    }
}

总结

以上我们了解了SpringCloudGateway的功能,并通过代码展示了如何实现服务发现、路由转发、统一认证、日志监控、跨域处理的基本功能。

到此这篇关于SpringCloud网关Gateway功能实现的文章就介绍到这了,更多相关SpringCloud网关Gateway内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java基本教程之常用的实现多线程的两种方式 java多线程教程

    java基本教程之常用的实现多线程的两种方式 java多线程教程

    下面开始学习“常用的实现多线程的2种方式”:Thread 和 Runnable。之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程
    2014-01-01
  • Mybatis Limit实现分页功能

    Mybatis Limit实现分页功能

    这篇文章主要介绍了Mybatis Limit实现分页功能,使用Limit实现分页可以减少数据的处理量,本文通过代码讲解的非常详细,需要的朋友可以参考下
    2021-04-04
  • Java 添加文本框到PPT幻灯片过程解析

    Java 添加文本框到PPT幻灯片过程解析

    这篇文章主要介绍了Java 添加文本框到PPT幻灯片过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java新人基础入门之递归调用

    java新人基础入门之递归调用

    这篇文章主要给大家介绍了关于java新人基础入门之递归调用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL安装与idea的连接实现

    MySQL安装与idea的连接实现

    本文主要介绍了MySQL安装与idea的连接实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅谈Spring嵌套事务是怎么回滚的

    浅谈Spring嵌套事务是怎么回滚的

    本文主要介绍了Spring嵌套事务是怎么回滚的,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • springboot如何通过接口实现动态二维码的定时刷新

    springboot如何通过接口实现动态二维码的定时刷新

    这篇文章主要为大家详细介绍了springboot如何通过接口实现动态二维码的定时刷新功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05
  • SpringFox实现自动生成RESTful API文档

    SpringFox实现自动生成RESTful API文档

    在开发 RESTful API 时,编写 API 文档是一个重要的任务,这篇文章为大家介绍了如何使用 SpringFox 自动生成 RESTful API 文档,并提供示例代码,需要的可以参考一下
    2023-06-06
  • Java关于List集合去重方案详细介绍

    Java关于List集合去重方案详细介绍

    实际项目开发中,很多业务场景下都会遇见集合去重。在说到List集合去重之前,首先我们回顾下普通类型的list如何去重
    2021-09-09
  • Java遗传算法之冲出迷宫

    Java遗传算法之冲出迷宫

    这篇文章首先详细介绍了什么是遗传算法,然后通过遗传算法的思想用实例解析使用遗传算法解决迷宫问题,需要的朋友可以参考下
    2017-09-09

最新评论