分布式微服务--GateWay(1)

一、什么是微服务网关(API Gateway)

  • 定义:微服务网关是整个系统请求的统一入口,负责请求转发、过滤处理、安全校验等。

  • 作用

    • 请求路由

    • 日志记录

    • 权限控制

    • 参数校验

    • 解决跨域问题

    • 黑白名单控制

    • 限流、熔断、降级

    • 统一前后端接口调用


二、过滤器与网关的区别

对比项过滤器(Filter)网关(Gateway)
作用范围单个微服务内部整个微服务系统
实现方式@WebFilter、OncePerRequestFilterSpring Cloud Gateway
适用场景局部处理、日志、拦截器全局处理、统一入口、鉴权


三、Zuul vs Gateway

对比项Zuul(1代网关)Gateway(2代网关)
所属公司NetflixSpring 官方
技术架构Servlet、阻塞式WebFlux、非阻塞响应式
性能较差高性能、支持长连接
生态整合较弱完美整合 Spring 生态
适合场景兼容性要求高的旧项目新项目优选、高并发场景

四、快速构建 Gateway 项目

Maven 依赖

//注意:会和spring-webmvc的依赖冲突,需要排除spring-webmvc
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

        在使用 spring-cloud-starter-gateway 时,不能再同时使用 spring-boot-starter-web,否则会产生冲突或运行时报错。


✅ 原因详解
🔧 spring-cloud-starter-gateway 是基于 Spring WebFlux(响应式编程)
  • 内部依赖的是 spring-boot-starter-webflux

  • 使用响应式的非阻塞式 Netty 服务器(不是 Tomcat)

  • 框架核心类如:WebHandlerServerWebExchangeMonoFlux

spring-boot-starter-web 是基于 Spring MVC(Servlet 阻塞式编程)
  • 内部使用的是 spring-web + spring-webmvc

  • 默认使用嵌入式 Tomcat

  • 与 WebFlux 核心机制不兼容

application.yml 配置

server:port: 80spring:application:name: gateway-servicecloud:gateway:discovery:  //二选一locator:enabled: true  # 开启服务注册自动路由routes:     //二选一- id: example-routeuri: http://www.example.com/predicates:- Path=/example/**
discovery.locator.enabled: true(自动路由)
  • 自动将注册中心的服务映射成路由,无需手动配置。

  • 访问格式:http://网关地址/服务名/**

  • 适合:快速开发、测试环境。

  • 不灵活:路径固定为服务名,不能自定义。


✅ 手动配置 routes
  • 你手动指定路由规则(路径、服务名、过滤器等)。

  • 更灵活:可以自定义路径、加过滤器、权限控制等。

  • 适合:生产环境。


✅ 是否二选一?
  • 一般只用一个即可

  • 正式环境推荐:关闭 discovery.locator.enabled,手动写 routes


五、整合 Nacos 实现服务注册与发现

添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml 示例

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: trueroutes:- id: memberuri: lb://member-servicepredicates:- Path=/member/**filters:- StripPrefix=1
✅ 两种 uri 写法的区别
🟩 第一种:
routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/user/**

解释:

  • uri: lb://user-service 表示使用服务发现 + 负载均衡

  • lb:// 前缀 = load balancer,Spring Cloud Gateway 会去注册中心(如 Nacos)里找名为 user-service 的服务,并自动负载均衡调用。

  • 这个写法 必须依赖 Nacos 或其他服务注册中心,否则会报错:服务找不到。


🟩 第二种:
routes:- id: example-routeuri: http://www.example.com/predicates:- Path=/example/**

解释:

  • uri: http://... 表示直接转发到固定的 HTTP 地址。

  • 不需要注册中心,Gateway 会将请求直接转发到 www.example.com

  • 不需要 Nacos 等服务发现组件


✅ 总结对比表
配置方式是否需要注册中心(如 Nacos)说明
uri: lb://user-service✅ 需要从注册中心获取服务实例,负载均衡
uri: http://www.example.com/❌ 不需要直接转发到固定地址

✅ 最常用的判断逻辑

是否用到了 lb://?如果用到了,就需要服务注册中心(Nacos)。否则不需要。


六、Nginx 与 Gateway 的区别

项目NginxSpring Cloud Gateway
编程语言C语言Java
扩展性靠 Lua 二次开发基于 Java/Spring 插件式开发
所属层级网络层(L7)反向代理微服务层
适合高性能网络转发服务间通信、认证授权、动态路由


七、自定义全局过滤器(如 Token 拦截)

想要了解更多过滤器的知识可以去看博主的另一篇文章的第四节有讲解及小例子

分布式微服务--GateWay(补充)-CSDN博客

@Component
public class TokenFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");if (token == null || token.isEmpty()) {ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.BAD_REQUEST);DataBuffer buffer = response.bufferFactory().wrap("token not is null".getBytes());return response.writeWith(Mono.just(buffer));}return chain.filter(exchange);}
}

八、接口安全措施总结

  1. 幂等性控制:使用 token 防重复提交

  2. HTTPS 加密传输

  3. MD5 签名防篡改

  4. API 权限控制(白名单、黑名单、OAuth2)

  5. 熔断、降级、隔离防止雪崩

  6. Swagger 文档统一管理


九、网关高可用架构

  • 使用 Nginx / LVS + Gateway 实现高可用网关

  • 网关本身无状态,可水平扩展

  • 示例 Nginx 配置:

upstream gateway_cluster {server 127.0.0.1:8081;server 127.0.0.1:8082;
}server {listen 80;server_name gateway.example.com;location / {proxy_pass http://gateway_cluster;}
}

🔁 十、动态路由实现(基于数据库)

表结构

CREATE TABLE boyatop_gateway (id INT AUTO_INCREMENT PRIMARY KEY,route_id VARCHAR(50),route_name VARCHAR(255),route_pattern VARCHAR(255),route_type VARCHAR(10),route_url VARCHAR(255)
);

核心代码

public void loadRoute(GateWayEntity gateway) {RouteDefinition definition = new RouteDefinition();definition.setId(gateway.getRouteId());PredicateDefinition predicate = new PredicateDefinition();predicate.setName("Path");predicate.addArg("pattern", gateway.getRoutePattern());FilterDefinition filter = new FilterDefinition();filter.setName("StripPrefix");filter.addArg("_genkey_0", "1");URI uri = gateway.getRouteType().equals("0") ?UriComponentsBuilder.fromUriString("lb://" + gateway.getRouteUrl()).build().toUri(): UriComponentsBuilder.fromHttpUrl(gateway.getRouteUrl()).build().toUri();definition.setUri(uri);definition.setPredicates(List.of(predicate));definition.setFilters(List.of(filter));routeDefinitionWriter.save(Mono.just(definition)).subscribe();publisher.publishEvent(new RefreshRoutesEvent(this));
}

🔄 十一、谓词(断言)与过滤器

  • 谓词(Predicates):判断是否匹配请求

    • Path=/xxx/**

    • After=时间

    • Host=xxx.example.com

    • Method=GET

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

    • Weight=group1, 2

  • 过滤器(Filters):处理请求前/后逻辑

    • StripPrefix=1

    • AddRequestHeader=X-Name, value

    • RewritePath=/old/(?<segment>.*), /new/${segment}

    • Retry、CircuitBreaker


🌍 十二、解决跨域问题(CORS)

全局跨域过滤器实现

@Component
public class CorsFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpResponse response = exchange.getResponse();HttpHeaders headers = response.getHeaders();headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "*");headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");return chain.filter(exchange);}
}

🔬 十三、源码启动流程(核心组件)

  1. GatewayClassPathWarningAutoConfiguration:校验是否依赖 webflux

  2. GatewayAutoConfiguration:加载所有核心 Bean(如 RouteDefinitionLocator)

  3. RoutePredicateHandlerMapping:路由匹配

  4. FilteringWebHandler:执行过滤器链

  5. GatewayFilterChain:按顺序执行自定义/内置过滤器

  6. GatewayLoadBalancerClientAutoConfiguration:整合负载均衡器

  7. GatewayRedisAutoConfiguration:限流配置

  8. GatewayDiscoveryClientAutoConfiguration:注册中心服务发现


🧠 十四、常见错误总结

  • 错误:required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer'

  • 原因:Spring Cloud Gateway 使用 webflux,请删除 spring-boot-starter-web 依赖,使用 spring-boot-starter-webflux


📚 十五、关键词汇速查表

名称说明
Route路由配置(包含 id、uri、predicates、filters)
Predicate请求匹配规则(Path、Method、Header、Host)
Filter请求过滤器,可修改请求/响应
lb://使用服务名转发(注册中心)
StripPrefix去除路径前缀
RefreshRoutesEvent动态刷新路由事件

📎 官方参考文档

  • Spring Cloud Gateway

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92360.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大文件断点续传(vue+springboot+mysql)

断点续传vue前端代码后端代码controller 层service层持久层主表&#xff0c;初始化单次上传文件表&#xff0c;单次上传所有的文件记录文件分块表科普信息参考其他博主 流程图 vue前端代码 这里是只做了demo示例&#xff0c;主线测试没什么问题&#xff0c;前端同学可参考修…

Nodejs》》MySql

Node.js 操作MySQL数据库 文档 # 项目要先安装mysql包npm i mysqlxx // 安装指定版本npm i mysql // 默认安装最新版本 # 连接 mysq// 使用连接池连接const mysql require(mysql)# 建立连接const db mysql.createPool({host:, // 数据库的IP地址user:ro…

金仓数据库常见问题(持续更新)

目录 1.查看大小是否敏感写参数&#xff0c;提示&#xff1a;未认可的配置参数 "case_sensitive" 2.sys_backup.sh init时提示can not connect the primary node 3.设置逻辑备份运行脚本时提示错误are not allowed to use this program (crontab) 4.修改表字段类…

Docker Buildx最佳实践:多架构镜像构建指南

文章目录为什么需要 Docker Buildx安装与启用 Docker Buildx创建多架构构建器实例构建多架构镜像优化构建性能调试多架构构建实战案例&#xff1a;构建 Go 应用多架构镜像总结Docker Buildx 是 Docker 官方推出的扩展工具&#xff0c;用于支持多平台镜像构建&#xff0c;简化跨…

你用的是什么键盘?

在电竞行业飞速发展的当下&#xff0c;游戏键盘作为玩家操作的核心载体&#xff0c;其性能表现直接影响着游戏体验与竞技结果。而赛卓电子推出的磁轴键盘专用芯片 SC4823&#xff0c;凭借一系列突破性的技术特性&#xff0c;正成为游戏键盘领域的性能革新者。​对于游戏玩家而言…

Activiti 中各种 startProcessInstance 接口之间的区别

前言在用 RuntimeService 接口启动流程实例时&#xff0c;总是分不清楚不同 startProcessInstanceXXX 接口之间的区别&#xff0c;这篇文章基于 Activiti 7.0.0.GA 版本&#xff0c;对这一类接口进行一个梳理和归类。详解接口列表RuntimeService 接口中以 startProcessInstance…

新手BUG:函数中 static 变量的赋值语句只会执行一次

在 C 函数中使用 static 变量时&#xff0c;很多新手会陷入一个认知误区&#xff1a;认为变量的初始化语句会在每次函数调用时执行。比如在bool funcA() { // Q&#xff1a;多次调用funcA&#xff0c;funcB会被执行几次&#xff1f;// A&#xff1a;1次static bool value func…

Python 基础详解:数据类型(Data Types)—— 程序的“数据基石”

一、引言&#xff1a;为什么数据类型如此重要&#xff1f;在 Python 编程中&#xff0c;数据类型决定了&#xff1a;数据的存储方式可以对数据执行的操作数据的取值范围不同类型之间的运算规则理解数据类型是编写正确、高效程序的基础。Python 是动态类型语言&#xff0c;虽然你…

WindowsLinux系统 安装 CUDA 和 cuDNN

Windows安装前的准备工作 检查硬件兼容性&#xff1a;确认电脑显卡为 NVIDIA GPU。通过快捷键 Win R 唤出“运行”&#xff0c;输入“control /name Microsoft.DeviceManager”唤出“设备管理器”&#xff0c;点击“显示适配器”查看是否有 NVIDIA 字样。 验证 CUDA 支持性&a…

工业数采引擎-通信链路SOCKET

通信库&#xff1a;DotNetty 封装实现&#xff1a;TcpServer、TcpClient、Udp TCP协议特性&#xff1a;面向连接协议&#xff1b;每个新连接都会创建独立的ChannelHandler实例&#xff1b;TcpHandler构造函数在每次客户端连接时触发 UDP协议特性&#xff1a;无连接协议&#…

PHP小白零基础入门(附视频教程)

概述 PHP是一种通用开源脚本语言&#xff0c;常用于服务器端Web开发&#xff0c;具有语法简单、上手快等特点。视频教程&#xff1a;https://pan.quark.cn/s/8f214c23301b 搭建开发环境&#xff1a; 选择集成工具&#xff1a;可选择XAMPP&#xff08;支持Windows/Mac/Linux…

验证码等待时间技术在酒店自助入住、美容自助与社区场景中的应用必要性研究—仙盟创梦IDE

代码 代码 完整<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>验证码倒计时</title><s…

Flask从入门到实战:基础、进阶、项目架构与接口测试

本文将带你从零开始掌握Flask框架&#xff0c;涵盖基础使用、进阶技巧、项目架构设计&#xff0c;并提供完整的接口测试客户端代码。 目录一、Flask基础入门1.1 Flask简介与安装1.2 第一个Flask应用1.3 路由与请求处理1.4 请求与响应处理二、Flask进阶使用2.1 模板引擎Jinja22.…

华为云产品图解

框架图核心说明: 1. 分层逻辑清晰 基础设施层(IaaS):提供最基础的计算(ECS/BMS)、存储(OBS/EVS)、网络(VPC/CDN)资源,是所有上层服务的 “物理底座”。 平台服务层(PaaS):基于 IaaS 构建,提供容器编排(CCE)、数据库(GaussDB)、大数据与 AI(ModelArts)、中…

Git 中如何回退到以前的提交记录?

回答重点要在 Git 中回退到以前的提交记录&#xff0c;你可以使用 git reset 命令。这个命令有三个常用选项来控制你想要回退的程度&#xff1a;1&#xff09; git reset --soft <commit> &#xff1a;仅修改 HEAD 指针&#xff0c;不修改索引和工作区内容。2&#xff09…

JavaWeb03——基础标签及样式(表单)(黑马视频笔记)

1.表单标签 及 表单属性表单标签是 &#xff1a;<form> 表单属性有&#xff1a;action 和 method&#xff1b;action属性&#xff1a;规定向何处发送表单数据。method属性&#xff1a;规定用什么方法发送数据。&#xff08;get和post&#xff09;get:在发送的url后面拼接…

STM32的SPI通信(软件读写W25Q64)

在了解完I2C通信后&#xff0c;不免会接触到到SPI通信。而一开始&#xff0c;可能会觉得两者好似没什么区别。为什么要学SPI呢&#xff0c;I2C和SPI有什么区别呢。为此我详细展开说说。1.什么是 SPI&#xff1f;SPI&#xff0c;全称 Serial Peripheral Interface&#xff0c;中…

子词分词器(Byte Pair Encoding + WordPiece)

参考文章&#xff1a;子词分词器BPE和WordPiece理解_wordpeice-CSDN博客 子词分词器BPE和WordPiece理解_wordpeice-CSDN博客 WordPiece 和 BPE 的区别-CSDN博客 点互信息&#xff08;PMI&#xff09;和正点互信息&#xff08;PPMI&#xff09;-CSDN博客 https://zhuanlan.z…

阿里招AI产品运营

AI产品运营&#xff08;岗位信息已经过jobleap.cn授权&#xff0c;可在csdn发布&#xff09;灵犀互娱 广州收录时间&#xff1a; 2025年08月05日职位描述负责AI技术在游戏行业的应用与落地&#xff0c;专注于海外市场的运营中台建设&#xff1b; 将结合AI技术与游戏行业特点&a…

Git 分支迁移完整指南(结合分支图分析)

基于分支图的当前状态分析 分支图关键信息解读​分支结构​&#xff1a; #mermaid-svg-gc9SPnwlbrM2FzHf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gc9SPnwlbrM2FzHf .error-icon{fill:#552222;}#mermaid-svg-…