当前位置: 首页 > news >正文

微服务网关全解析:从入门到实践

引言

在微服务架构中,服务数量众多,调用关系复杂。如果没有一个统一的入口来进行流量调度、权限控制和安全管理,系统的可维护性和安全性都会大大降低。Spring Cloud Gateway 作为新一代网关组件,基于 Spring 5、Spring Boot 2.0 和 Project Reactor 的响应式编程模型,为我们提供了一种高性能、统一的 API 路由与管理方式。

本文将从 为什么需要网关快速入门断言与过滤器机制同源策略与跨域问题 等方面进行系统性梳理,帮助读者快速掌握 Gateway 的核心思想与实践技巧。


一、为什么需要网关

在微服务系统中,网关扮演着“守门人”的角色,所有外部请求都会先进入网关,然后再根据规则路由到对应的服务。它的核心价值主要体现在以下几个方面:

  1. 统一入口

    • 外部访问全部先经过 Gateway,便于集中管理和监控。

  2. 请求路由与负载均衡

    • 根据配置的规则转发请求,并在多实例时进行负载均衡。

  3. 权限控制

    • 拦截请求,校验用户是否有访问权限,防止非法访问。

  4. 限流保护

    • 在流量过大时按下游服务的承受能力进行流控,避免雪崩效应。

Spring Cloud Gateway 相比传统的 Zuul,采用响应式编程(WebFlux),性能更高,延迟更低,尤其适合高并发场景。


二、快速入门 Gateway

2.1 创建工程与依赖引入

 pom.xml 中添加以下依赖:

<!-- Gateway 网关核心依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos 服务发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.2 配置路由规则

application.yml 中定义路由规则:

server:port: 7000
spring:application:name: api-gatewaycloud:gateway:routes:- id: product_routeuri: http://localhost:8081/predicates:- Path=/product-serv/**filters:- StripPrefix=1

此时,访问 http://localhost:7000/product-serv/product/19 会被代理到 http://localhost:8081/product/19

2.3 高级版本:结合 Nacos 服务发现

通过 lb:// 方式实现负载均衡:

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: trueroutes:- id: product_routeuri: lb://service-productpredicates:- Path=/product-serv/**

这样,网关会自动从 Nacos 获取服务实例并按策略进行负载均衡。


三、断言工厂(Predicate Factory)

断言(Predicate)决定了请求是否满足路由条件。Spring Cloud Gateway 提供了十几种常见的断言类型:

  • Path:请求路径匹配

    • Path=/user/**

  • Method:请求方法限制

    • Method=GET,POST

  • Header:请求头条件

    • Header=X-Request-Id, \d+

  • After/Before/Between:时间范围限制

  • CookieHostQueryRemoteAddr

这些断言通过工厂类(如 PathRoutePredicateFactory)转换为路由条件,实现灵活的流量分发。


四、过滤器工厂(Filter Factory)

4.1 路由过滤器

对特定路由生效,例如:

filters:- AddRequestHeader=msg, hello

4.2 默认过滤器(DefaultFilter)

对所有路由生效:

default-filters:- AddRequestHeader=msg, wake up!

4.3 全局过滤器(GlobalFilter)

需要自定义逻辑,例如权限校验、限流等。
示例:拦截请求,校验 authorization=admin,否则拒绝访问。

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String auth = exchange.getRequest().getQueryParams().getFirst("authorization");if ("admin".equals(auth)) {return chain.filter(exchange);}exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}

4.4 执行顺序

  • 优先级规则:order 值越小,执行越靠前。

  • 同 order 时,执行顺序为:DefaultFilter > 路由过滤器 > GlobalFilter。


五、浏览器同源策略与跨域问题

浏览器的 同源策略 要求协议、域名和端口一致,否则会被视为跨域请求。
例如:

  • http://www.example.com:80 http://www.example.com:81 不同源。

跨域会导致 AJAX 请求被拦截。解决方案是开启 CORS(跨源资源共享)

Gateway 配置 CORS

spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:'[/**]':allowedOrigins: "http://localhost:8090"allowedMethods: [ "GET", "POST", "DELETE", "PUT", "OPTIONS" ]allowedHeaders: "*"allowCredentials: truemaxAge: 360000

这样就可以允许前端跨域请求,避免浏览器拦截。


六、总结

Spring Cloud Gateway 为微服务提供了一个 统一的请求入口,通过 断言与过滤器机制 实现灵活的路由控制、权限校验和流量治理。同时,内置的 CORS 配置 也帮助我们轻松解决前后端分离下的跨域问题。

整体而言,Gateway 是微服务架构中不可或缺的组件。掌握它的配置与原理,将大大提升系统的稳定性与可维护性。


文章转载自:

http://YUnhyBEt.bLqgc.cn
http://ZuZAu2rw.bLqgc.cn
http://W9QUEDkL.bLqgc.cn
http://C8lyl5Pg.bLqgc.cn
http://SCpdWJ8W.bLqgc.cn
http://50TvfE6b.bLqgc.cn
http://pP6xTvn2.bLqgc.cn
http://5SsVYNXO.bLqgc.cn
http://OiZefHyK.bLqgc.cn
http://7iQVNodb.bLqgc.cn
http://fbJ7uRnx.bLqgc.cn
http://SJo2fYAj.bLqgc.cn
http://9hv7a8zp.bLqgc.cn
http://3Lw3WisH.bLqgc.cn
http://a784U1GU.bLqgc.cn
http://8z4O7Oyb.bLqgc.cn
http://EHPhgEbC.bLqgc.cn
http://eTy05JwL.bLqgc.cn
http://938ZEhC3.bLqgc.cn
http://DZVwNJJ5.bLqgc.cn
http://MRYrrLC7.bLqgc.cn
http://q7m44cEz.bLqgc.cn
http://KTSYDJb1.bLqgc.cn
http://hqTBIx5u.bLqgc.cn
http://B03q8Hog.bLqgc.cn
http://IAdbt2dW.bLqgc.cn
http://iSQzMOFZ.bLqgc.cn
http://ZTfFhXeI.bLqgc.cn
http://AK7mfTb4.bLqgc.cn
http://tvF2SoyK.bLqgc.cn
http://www.dtcms.com/a/377537.html

相关文章:

  • 《sklearn机器学习——数据预处理》类别特征编码
  • #C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!
  • 深入剖析 Chrome PartitionAlloc 内存池源码原理与性能调优实践
  • Shell 脚本编程:函数
  • C++ STL 容器的一个重要成员函数——`emplace_back`
  • vue3:触发自动el-input输入框焦点
  • python range函数练习题
  • Q2(门座式)起重机司机的理论知识考试考哪些内容?
  • 企业微信消息推送
  • 顺序表:数据结构中的基础线性存储结构
  • 什么是X11转发?
  • OpenCV计算机视觉实战(24)——目标追踪算法
  • 4.2 I2C通信协议
  • Spring Boot 读取 YAML 配置文件
  • 【系统分析师】第20章-关键技术:微服务系统分析与设计(核心总结)
  • SAP-MM:SAP MM模块精髓:仓储地点(Storage Location)完全指南图文详解
  • Shell脚本周考习题及答案
  • 广东省省考备考(第九十六天9.10)——言语(刷题巩固第二节课)
  • Pthread定时锁与读写锁详解
  • Go模块自动导入教学文档
  • 技术文章大纲:开学季干货——知识梳理与经验分享
  • TensorFlow平台介绍
  • Vue3 中实现按钮级权限控制的最佳实践:从指令到组件的完整方案
  • 生成模型与概率分布基础
  • Cookie之domain
  • JavaSSM框架-MyBatis 框架(五)
  • 中州养老:设备管理介绍
  • 【Day 51|52 】Linux-tomcat
  • MySQL - 如果没有事务还要锁吗?
  • “高德点评”上线,阿里再战本地生活