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

在Zuul网关中,一个请求从进入zuul到转发到后端服务的完整过程

在Zuul网关中,一个请求从进入zuul到转发到后端服务的完整过程如下:

请求处理完整流程

1. 请求入口

  • 请求首先到达Zuul Servlet(ZuulServlet
  • 触发Zuul的过滤器链执行

2. 路由定位过程

// 通过 pre 路由阶段的过滤器(如 PreDecorationFilter)触发路由匹配
public Route getMatchingRoute(String path) {// 提取路径信息和服务版本String contextPath = getPathContext(path);         String systemVersion = modulePathMap.get(contextPath);String version = getVersionFromPath(path);// 路径重写处理path = rewritePath(path, version);// 版本兼容性检查和转换if (!version.equals(systemVersion) && VersionUtils.isVersionCompatible(version, systemVersion)) {path = path.replace(version, systemVersion);}// 最终路由匹配return getSimpleMatchingRoute(path);
}

3. 负载均衡节点选择

// 在 getZuulRoute 中选择具体的服务实例
protected ZuulRoute getZuulRoute(String adjustedPath) {// 匹配路由规则for (Map.Entry<String, ZuulRoute> entry : super.getRoutesMap().entrySet()){String pattern = (String)entry.getKey();if (this.pathMatcher.match(pattern, adjustedPath)) {ZuulRoute zuulRoute = (ZuulRoute)entry.getValue();// 负载均衡选择具体节点return chooseZuulRouteForBalance(pattern, zuulRoute);}}
}// 随机负载均衡算法选择服务节点
private ZuulRoute chooseZuulRouteForBalance(String path, ZuulRoute defaultZuulRoute) {List<ZuulRoute> serviceZuulRoutes = currentZuulRoute.get(path);// 从多个服务实例中随机选择一个Random random = new Random();ZuulRoute zuulRoute = serviceZuulRoutes.get(random.nextInt(serviceZuulRoutes.size()));return zuulRoute;
}

4. 路由信息设置

  • 通过 PreDecorationFilter 设置路由相关信息到请求上下文 [RequestContext](file://com\netflix\zuul\context\RequestContext.java#L13-L93)
  • 主要设置的属性包括:
    • serviceId: 目标服务ID
    • routeHost: 目标服务URL
    • requestURI: 请求URI

5. 请求转发执行

  • 在 route 阶段,RibbonRoutingFilterSimpleHostRoutingFilter 执行实际的请求转发
  • 如果是服务ID方式,使用 RibbonRoutingFilter 结合Ribbon进行负载均衡调用
  • 如果是URL方式,使用 SimpleHostRoutingFilter 直接HTTP转发

6. 响应返回

  • 后端服务处理完成后,响应通过Zuul的 post 过滤器链返回给客户端

关键代码流程

  1. 路由匹配: getSimpleMatchingRoute()
  2. 节点选择: getZuulRoute()chooseZuulRouteForBalance() [CustomRouteLocator.java]
  3. 上下文设置: PreDecorationFilter 过滤器
  4. 请求转发: RibbonRoutingFilterSimpleHostRoutingFilter
  5. 响应处理: post 过滤器链

这个过程确保了请求能够根据路由规则正确地转发到后端服务,并支持负载均衡、路径重写、版本兼容等高级功能。


文章转载自:

http://JlGo5IID.dwrjj.cn
http://kQw7KWSX.dwrjj.cn
http://zzftloN1.dwrjj.cn
http://hmkndyIx.dwrjj.cn
http://MZVFgMh6.dwrjj.cn
http://u7oGjvtB.dwrjj.cn
http://gUDGEfDV.dwrjj.cn
http://1vxnROzb.dwrjj.cn
http://o8xQ9vJP.dwrjj.cn
http://gJA21nPS.dwrjj.cn
http://VM4UB4QG.dwrjj.cn
http://lhSmoZgA.dwrjj.cn
http://umk9QX0l.dwrjj.cn
http://W5Ij66u6.dwrjj.cn
http://ZFMjSQOO.dwrjj.cn
http://ZKAZQjsy.dwrjj.cn
http://HE3yFgSF.dwrjj.cn
http://xKG82X60.dwrjj.cn
http://PunEURV2.dwrjj.cn
http://01jlNeGu.dwrjj.cn
http://cf8cVtHf.dwrjj.cn
http://xxxGR0Iv.dwrjj.cn
http://w23LeIiH.dwrjj.cn
http://3i3D0Cil.dwrjj.cn
http://L1Lxq7Yp.dwrjj.cn
http://yYYRv9Xu.dwrjj.cn
http://Xlxh7R05.dwrjj.cn
http://1TnYbYZM.dwrjj.cn
http://Vd0dVyig.dwrjj.cn
http://vlZAd6b9.dwrjj.cn
http://www.dtcms.com/a/376133.html

相关文章:

  • ARM(5)-IMX6ULL 裸机开发入门:从启动到点亮第一盏 LED 灯
  • 2025.9.10总结
  • 第6章串数组:串的定义和存储结构
  • tina linux新增mpp程序
  • capacitor配置ios应用图标不同尺寸
  • 大一新生C语言快速入门
  • Shuriken: 1靶场渗透
  • Pytorch基础入门4
  • 编程工具的演进逻辑:从Python IDLE到Arduino IDE的深度剖析
  • AWS SQS 可观测性最佳实践
  • 【C 语言生成指定范围随机数(整数 + 小数):原理、实现与避坑指南】
  • 【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之android 把assert里的dist.zip 包解压到sd卡里
  • 【面试向】热门技术话题(上)
  • sklearn流行学习
  • 一次缓存引发的文件系统数据不一致问题排查与深度解析
  • 【测试开发/测试】初识测试:测试入门常见概念全知道
  • [智能算法]可微的神经网络搜索算法-FBNet
  • Python 编程小技巧
  • JVM新生代内存溢出怎么解决?
  • 《C++进阶之STL》【set/map 模拟实现】
  • elementUI表格高度异常问题排查思路
  • 光谱相机的图像模式
  • Spring Boot + MyBatis-Plus 单数据源多线程事务一致性实践
  • 考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
  • Spring Boot `@Service` 互相调用全攻略:`@Autowired` vs `@Resource`
  • MySQL数据导出避坑指南:如何选择正确的工具并设计安全的备份策略?
  • 《算法闯关指南:优选算法-双指针》--01移动零,02复写零
  • ACD智能分配:轮流分配和排序上限分配的设置
  • DevOps实战(6) - 使用Arbess+GitHub+SonarQube实现Java项目自动化部署
  • 《WINDOWS 环境下32位汇编语言程序设计》第15章 注册表和INI文件