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

Spring Cloud Zuul实战:5分钟搞定微服务网关配置(含Eureka集成)

Spring Cloud Zuul极速实践从零构建高可用微服务网关微服务架构的流行让系统拆分变得更加灵活但同时也带来了新的挑战——如何优雅地管理众多服务的入口想象一下当你的系统由数十个微服务组成时客户端需要记住每个服务的地址和API规范这简直是一场噩梦。而Spring Cloud Zuul正是为解决这类问题而生的网关利器。1. 环境准备与基础配置在开始Zuul的实战之前我们需要搭建好基础环境。不同于简单的示例这里我会分享生产级配置中容易被忽略的关键细节。1.1 项目初始化使用Spring Initializr创建项目时除了选择Zuul和Eureka Client依赖外建议额外添加以下依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-sleuth/artifactId /dependency这些依赖将为后续的监控和链路追踪打下基础。创建完成后项目结构应包含以下核心文件src/main/java/ └─com.example.zuul ├─config # 配置类目录 ├─filter # 过滤器目录 └─ZuulApplication.java # 启动类1.2 启动类配置启动类需要添加EnableZuulProxy注解这是Zuul的核心开关。但更专业的做法是同时配置健康检查SpringBootApplication EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } Bean public HealthIndicator zuulHealthIndicator() { return () - Health.up().withDetail(status, Active).build(); } }1.3 基础YAML配置application.yml的基础配置需要特别注意以下几个参数server: port: 8060 max-http-header-size: 32KB # 防止头部过大导致请求被截断 spring: application: name: gateway-service sleuth: sampler: probability: 1.0 # 全量采集链路数据 zuul: host: connect-timeout-millis: 5000 socket-timeout-millis: 10000 retryable: false # 生产环境建议关闭重试 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ healthcheck: enabled: true # 启用健康检查2. 高级路由配置实战基础路由配置虽然简单但在实际生产环境中往往需要更精细的控制。下面介绍几种高级路由配置技巧。2.1 动态路由策略静态路由配置在application.yml中虽然方便但缺乏灵活性。我们可以通过代码实现动态路由Configuration public class DynamicRouteConfig { Autowired private ZuulProperties zuulProperties; Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(user-service, r - r.path(/user/**) .filters(f - f.addRequestHeader(X-Request-Source, gateway)) .uri(lb://USER-SERVICE)) .route(order-service, r - r.path(/order/**) .filters(f - f.retryable(false)) .uri(lb://ORDER-SERVICE)) .build(); } }这种配置方式相比YAML有以下优势支持条件路由可通过代码实现复杂逻辑可以动态修改路由规则便于与配置中心集成2.2 路由缓存优化在高并发场景下路由信息的频繁获取可能成为性能瓶颈。可以通过以下配置优化ribbon: eager-load: enabled: true # 启动时立即加载服务列表 ServerListRefreshInterval: 30000 # 服务列表刷新间隔(毫秒) zuul: ribbon: eager-load: enabled: true2.3 跨域与路径处理处理前后端分离架构中的跨域问题时可以在网关层统一配置Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); final CorsConfiguration config new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin(*); config.addAllowedHeader(*); config.addAllowedMethod(OPTIONS); config.addAllowedMethod(HEAD); config.addAllowedMethod(GET); config.addAllowedMethod(PUT); config.addAllowedMethod(POST); config.addAllowedMethod(DELETE); config.addAllowedMethod(PATCH); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); }对于路径处理常见需求是去除前缀zuul: routes: user-service: path: /api/user/** serviceId: USER-SERVICE stripPrefix: true # 移除/api/user前缀3. 过滤器开发与安全实践Zuul的过滤器体系是其最强大的特性之一合理使用过滤器可以实现各种业务需求。3.1 认证过滤器实现一个典型的JWT认证过滤器实现public class JwtAuthFilter extends ZuulFilter { Override public String filterType() { return pre; } Override public int filterOrder() { return 0; } Override public boolean shouldFilter() { RequestContext ctx RequestContext.getCurrentContext(); return !ctx.getRequest().getRequestURI().startsWith(/auth/); } Override public Object run() { RequestContext ctx RequestContext.getCurrentContext(); HttpServletRequest request ctx.getRequest(); String token request.getHeader(Authorization); if (StringUtils.isEmpty(token)) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); ctx.setResponseBody(Missing authorization token); return null; } try { Claims claims Jwts.parser() .setSigningKey(secretkey) .parseClaimsJws(token) .getBody(); ctx.addZuulRequestHeader(X-User-ID, claims.getSubject()); } catch (Exception e) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(403); ctx.setResponseBody(Invalid token); } return null; } }3.2 限流过滤器实现使用Guava的RateLimiter实现简单限流public class RateLimitFilter extends ZuulFilter { private final RateLimiter rateLimiter RateLimiter.create(100.0); Override public String filterType() { return pre; } Override public int filterOrder() { return 1; } Override public boolean shouldFilter() { return true; } Override public Object run() { RequestContext ctx RequestContext.getCurrentContext(); if (!rateLimiter.tryAcquire()) { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(429); ctx.setResponseBody(Too many requests); } return null; } }3.3 响应修改过滤器在POST过滤器中修改响应内容public class ResponseWrapperFilter extends ZuulFilter { Override public String filterType() { return post; } Override public int filterOrder() { return 999; } Override public boolean shouldFilter() { return true; } Override public Object run() { RequestContext ctx RequestContext.getCurrentContext(); try { InputStream is ctx.getResponseDataStream(); String body StreamUtils.copyToString(is, Charset.forName(UTF-8)); ctx.setResponseBody({\data\: body ,\timestamp\: System.currentTimeMillis() }); } catch (IOException e) { throw new RuntimeException(e); } return null; } }4. 生产环境优化策略将Zuul投入生产环境前还需要考虑以下关键优化点。4.1 性能调优参数以下参数对性能有显著影响zuul: semaphore: max-semaphores: 5000 # 最大并发请求数 host: max-total-connections: 500 # 最大连接数 max-per-route-connections: 100 # 每路由最大连接数 ribbon: ReadTimeout: 5000 ConnectTimeout: 2000 MaxAutoRetries: 1 MaxAutoRetriesNextServer: 14.2 高可用部署方案推荐的多节点部署架构客户端 → 负载均衡器(Nginx) ├─ Zuul节点1 ├─ Zuul节点2 └─ Zuul节点3每个Zuul节点配置相同的路由规则通过Eureka实现服务发现。关键配置eureka: instance: prefer-ip-address: true lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30 client: registry-fetch-interval-seconds: 54.3 监控与告警配置集成Prometheus监控的配置示例dependency groupIdio.micrometer/groupId artifactIdmicrometer-registry-prometheus/artifactId /dependencyapplication.yml中启用端点management: endpoints: web: exposure: include: health,info,prometheus,metrics metrics: tags: application: ${spring.application.name}关键监控指标包括请求吞吐量(http_server_requests_seconds_count)错误率(http_server_requests_seconds_count{status500})路由延迟(zuul_route_requests_seconds)5. 常见问题解决方案在实际使用中开发者常会遇到以下典型问题。5.1 文件上传问题处理大文件上传时需要调整以下参数spring: servlet: multipart: max-file-size: 50MB max-request-size: 100MB zuul: servlet-path: / # 重要解决上传文件时404问题5.2 超时与重试机制合理的超时设置可以避免级联故障zuul: host: connect-timeout-millis: 5000 socket-timeout-millis: 10000 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 15000 ribbon: ReadTimeout: 10000 ConnectTimeout: 5000 OkToRetryOnAllOperations: false5.3 会话保持问题在需要会话保持的场景下可以启用以下配置zuul: routes: user-service: path: /user/** serviceId: USER-SERVICE sensitiveHeaders: Cookie,Set-Cookie # 传递Cookie对于灰度发布场景可以通过过滤器实现public class GrayReleaseFilter extends ZuulFilter { Override public Object run() { RequestContext ctx RequestContext.getCurrentContext(); String version ctx.getRequest().getHeader(X-Version); if (v2.equals(version)) { RibbonFilterContextHolder.getCurrentContext() .add(version, v2); } return null; } // 其他方法省略... }在微服务架构中Zuul网关的质量直接决定了整个系统的稳定性和可用性。经过多个项目的实践验证合理的路由配置加上完善的过滤器体系可以解决90%以上的网关需求。对于特别复杂的场景建议考虑结合Spring Cloud Gateway进行混合部署。

相关文章:

Spring Cloud Zuul实战:5分钟搞定微服务网关配置(含Eureka集成)

Spring Cloud Zuul极速实践:从零构建高可用微服务网关 微服务架构的流行让系统拆分变得更加灵活,但同时也带来了新的挑战——如何优雅地管理众多服务的入口?想象一下,当你的系统由数十个微服务组成时,客户端需要记住每…...

你还在使用HAL_Delay吗

HAL_Delay 是STM32HAL库提供的毫秒级延时函数, 相信所有STM32开发人员都对它非常的熟悉, 那么你曾经或者是现在是否还在频繁的使用HAL_Delay呢? 现在的你是否还记得自己点亮的第一颗Led灯呢?看下面代码:void Led_Flicker(void){Led_On();HAL_Delay(500);Led_Off();HAL_Delay(…...

PotPlayer字幕翻译插件终极指南:5分钟实现外语视频实时翻译的完整教程

PotPlayer字幕翻译插件终极指南:5分钟实现外语视频实时翻译的完整教程 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在…...

告别模拟传感器!用DS18B20和51单片机做个智能温度计(附完整代码)

从模拟到数字:基于DS18B20与51单片机的智能温度计实战指南 在电子设计与嵌入式开发领域,温度测量是最基础却又最常遇到的需求之一。传统模拟温度传感器如热敏电阻、LM35等,虽然成本低廉,但需要复杂的信号调理电路和模数转换模块&a…...

新手友好!零成本体验Allegro自动化:YepStudy V2.0学习版安装与免费功能全指南

新手零成本玩转Allegro自动化:YepStudy V2.0学习版实战手册 刚接触Cadence Allegro的工程师常会陷入两难:这个业界标准的PCB设计工具功能强大,但操作复杂得像在驾驶航天飞机。传统学习路径往往需要投入数月时间熟悉基础操作,而自动…...

day24-数据结构力扣

122.买卖股票的最佳时机II 题目链接122. 买卖股票的最佳时机 II - 力扣(LeetCode) 思路 这个题感觉和之前一个题有点像,就是摆动序列,但是又有点不太一样 本题的核心规则: 可以无限次买卖 任何时候最多持有 1 股…...

macOS窗口管理终极指南:用Topit一键置顶解决多窗口混乱难题

macOS窗口管理终极指南:用Topit一键置顶解决多窗口混乱难题 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否曾在工作中被多个重叠的窗口搞得焦…...

如何快速解密RPG游戏资源:5分钟掌握RPG Maker加密文件提取技巧

如何快速解密RPG游戏资源:5分钟掌握RPG Maker加密文件提取技巧 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https:/…...

Python实战:全球植被生产力BEPS模型数据(1981-2019)的读取、转换与可视化分析

1. 认识BEPS模型数据 全球植被生产力数据是研究生态系统碳循环的重要基础。居为民教授团队发布的1981-2019年全球逐日GPP/NEP/NPP数据集,采用BEPS(Boreal Ecosystem Productivity Simulator)模型生成,这个模型考虑了植被参数、气象…...

思源宋体TTF:免费商用中文字体的完美解决方案

思源宋体TTF:免费商用中文字体的完美解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量、免费可商用的中文字体而烦恼吗?今天让…...

Linux CFS 的 switched_from/switched_to:调度类切换的处理

一、简介在Linux内核的调度子系统中,任务在不同调度类之间切换是一个复杂且关键的操作。当应用程序调用sched_setscheduler()将任务从普通调度策略(SCHED_NORMAL)切换为实时策略(SCHED_FIFO/SCHED_RR),或者…...

从Word2Vec到Attention:用‘讲故事’的方式,轻松理解NLP核心模型演进史

从Word2Vec到Attention:用故事串联NLP模型演进之路 想象一下,你正在教一个刚学会认字的孩子理解"国王-男人女人≈女王"这样的词语关系。这看似简单的语言游戏背后,隐藏着自然语言处理(NLP)技术数十年的智慧结晶。让我们穿越时空&am…...

Windows 11任务栏拖放修复:让消失的拖拽功能重获新生

Windows 11任务栏拖放修复:让消失的拖拽功能重获新生 【免费下载链接】Windows11DragAndDropToTaskbarFix "Windows 11 Drag & Drop to the Taskbar (Fix)" fixes the missing "Drag & Drop to the Taskbar" support in Windows 11. It…...

别再手动删注册表了!一个PowerShell脚本搞定eNSP安装时的WinPcap 4.1.3报错

告别手动清理:用PowerShell自动化解决eNSP与WinPcap的版本冲突 当网络工程师在Windows系统上安装华为eNSP模拟器时,WinPcap 4.1.3的安装报错堪称经典难题。传统解决方案往往要求用户手动操作注册表、系统目录和服务管理器——这种繁琐过程不仅效率低下&a…...

SRE面试必问:K8s生产环境故障排查实战案例解析(附避坑指南)

SRE面试必问:K8s生产环境故障排查实战案例解析(附避坑指南) 在当今云原生技术蓬勃发展的时代,Kubernetes(K8s)已成为企业级容器编排的事实标准。作为Site Reliability Engineer(SRE)…...

RK3588开发板Android系统多屏显示方向动态调整实战

1. RK3588开发板多屏显示基础认知 第一次拿到RK3588开发板时,最让我惊艳的就是它强大的多屏显示能力。这块板子不仅能同时驱动MIPI、HDMI、DP等多种接口的显示屏,还能让每个屏幕独立设置显示方向。在实际项目中,这种特性特别适合数字标牌、互…...

GIS小白必看:如何用GeoServer把普通图片变成可交互地图(附QGIS配准技巧)

GIS入门实战:从普通图片到可交互地图的完整指南 引言:为什么需要将图片转换为可交互地图? 在日常工作中,我们经常会遇到这样的场景:客户提供了一张手绘地图、历史航拍图或是扫描的规划图纸,但这些图片文件…...

CLIP-GmP-ViT-L-14图文匹配工具效果展示:多物体复杂场景中‘主对象’优先匹配

CLIP-GmP-ViT-L-14图文匹配工具效果展示:多物体复杂场景中‘主对象’优先匹配 你有没有遇到过这种情况?一张照片里,有猫、有狗、有沙发、有地毯,背景还有窗外的树。当你问一个AI模型“这张图里有什么”时,它可能会告诉…...

Bilibili-Old:重温经典界面,找回最初的B站体验

Bilibili-Old:重温经典界面,找回最初的B站体验 【免费下载链接】Bilibili-Old 恢复旧版Bilibili页面,为了那些念旧的人。 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Old 你是否怀念那个简洁明了的B站界面?是否…...

在DEBUG环境通过AX、BX 寄存器操作命令理解ALU、ACC的运算逻辑

DEBUG环境下 AX、BX 寄存器操作命令(完整版)12 在DEBUG环境通过AX、BX 寄存器操作命令理解ALU、ACC的运算逻辑 说明:DEBUG是DOS系统下的调试工具,可直接操作CPU内部寄存器(含AX、BX),以下命令…...

告别printf调试!用Telink EVK实时监控BLE芯片变量(8258/8255实战示例)

告别printf调试!用Telink EVK实时监控BLE芯片变量(8258/8255实战示例) 调试嵌入式系统时,开发者常陷入两难:既需要观察程序运行时的内部状态,又受限于传统调试方法的低效。在BLE低功耗场景下,这…...

5步掌握个人数据主权:从微信聊天到AI记忆的完整指南

5步掌握个人数据主权:从微信聊天到AI记忆的完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatM…...

告别SysML v1的混乱:手把手教你用M-Design v2搞定柴油发动机功能分解(Action Usage实战)

从SysML v1到v2的工程革命:柴油发动机功能分解的M-Design v2实践指南 当系统工程师第一次打开SysML v2的规范文档时,那种感觉就像从DOS命令行突然跳进了图形化操作系统时代。作为在汽车行业深耕十余年的系统架构师,我见证过太多团队在SysML v…...

保姆级避坑指南:用ESP-IDF v5.0给虫洞ESP32S3-EYE编译UVC固件,解决屏幕不亮和下载失败

ESP32-S3 UVC摄像头开发实战:从固件编译到屏幕显示的深度排错指南 当你第一次拿到那块印着"ESP32-S3-EYE"的开发板时,脑海中可能已经浮现出无数创意项目——智能门铃、工业检测设备、甚至是一个DIY的视频会议终端。但现实往往比理想骨感得多&a…...

【LabVIEW FPGA图形化】 跨越工具链:在Spartan-6上集成Vivado edf网表的实战解析

1. 当Spartan-6遇上Vivado:工具链冲突的破局之道 遇到Xilinx Spartan-6这类经典FPGA型号时,很多工程师都会头疼一个问题:它只能用老旧的ISE工具链开发,而手头现成的Vivado工程生成的edf网表文件直接导入会报错。去年我在做工业控…...

旅游安全监控:紧急求助与位置追踪的系统

旅游安全监控:紧急求助与位置追踪的系统 随着旅游业的蓬勃发展,游客的安全问题日益受到关注。无论是独自探险的背包客,还是家庭出游的亲子团,都可能面临迷路、突发疾病或意外事故等风险。为此,旅游安全监控系统应运而…...

126. 如何为 Elemental OS Machine 创建网络绑定

Procedure 程序Configuring NIC Teaming for OS Elemental 为操作系统 Elemental 配置 NIC 分组 Overview 概述 This article provides the procedure for configuring NIC Teaming (bonding) in SUSE Elemental OS. It includes an example configuration that can be adjus…...

Mermaid Live Editor终极指南:实时图表编辑与可视化工具深度解析

Mermaid Live Editor终极指南:实时图表编辑与可视化工具深度解析 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-l…...

邻架控制器4C型护套连接器BMJDDL conm/12c(4000)

在煤矿综采工作面液压支架电液控制系统中,邻架控制器之间的级联通信是实现支架群组协同动作的关键。BMJDDL conm/12c(4000) 是一款专为邻架通信设计的12芯钢丝编织橡胶护套连接器,其长度4000mm(4米)适配液压支架的标准中心距&…...

ncmdump终极指南:3步解锁网易云音乐NCM格式,实现音乐自由播放

ncmdump终极指南:3步解锁网易云音乐NCM格式,实现音乐自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾在网易云音乐下载了心爱的歌曲,却发现在车载音响、其他播放器或设备上无法播…...