千家信息网

Spring Cloud中怎么定制路由功能

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要讲解了"Spring Cloud中怎么定制路由功能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring Cloud中怎么定制路由功能
千家信息网最后更新 2025年12月03日Spring Cloud中怎么定制路由功能

这篇文章主要讲解了"Spring Cloud中怎么定制路由功能",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Spring Cloud中怎么定制路由功能"吧!

使用API网关可统一流量入口,对客户端屏蔽内部多个微服务的域名,实现负载均衡,并可以统一鉴权、接口访问控制、流量管控。

作为网关,代理了所有流量,对性能要求更高,介于网关核心功能是路由、代理后端服务,主要处理请求转发,如果使用同步阻塞方式,后端接口响应耗时越长,对网关性能的影响就越大。nginx作为反向代理中的佼佼者,基于nginx开发的Kong网关性能更是毋庸置疑。但作为内部网关,我们需要更好的定制,选择Java系的网关对我们来说更容易驾驭。

在选定编程语言后,我们就需要考虑性能问题。而网关的性能损耗无非就是I/O阻塞,只有纯异步才能有更好的性能表现,所以我们选择至少是基于实现Reactive Streams规范的反应式编程库开发的网关。

Spring cloud gateway作为spring cloud生态系统中的网关,基于Spring Boot、Project Reactor开发,不仅实现异步非阻塞,并且更快速与spring cloud生态中的其它组件整合,这是我们选择Spring cloud gateway的原因。

我们基于Spring Cloud Gateway开发内部微服务网关,并结合注册中心实现自动服务发现路由。

就在最近将项目部署测试环境的Kubernetes集群上时,发现路由失败。经调试源码发现是因为没有导入Ribbon的依赖,所以Gateway注册的是非负载均衡路由过滤器(NoLoadBalancerClientFilter),当路由规则配置以"lb://"开头时,该路由过滤器直接响应503(目标服务不可达)。

Gateway使用全局过滤器实现路由功能,其按照全局过滤器指定的排序值顺序调用,每个过滤器都可终止请求的调用。

Gateway允许每个全局过滤器重写路由URL,通过将重写后的URL更新到请求的attribute向下传递,下游过滤器可重新修改路由URL,最初的路由URL从路由规则取得。

// 从ServerWebExchange#getAttribute取得路由urlURI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);

Gateway使用一个链表将每个过滤器替换前的路由URL串起来,如果想获取URL被替换为目标服务URL过程的变化,可获取该链表、遍历该链表。

// 记录修改前的urladdOriginalRequestUrl(exchange, url);// public static void addOriginalRequestUrl(ServerWebExchange exchange, URI url) {    exchange.getAttributes().computeIfAbsent(GATEWAY_ORIGINAL_REQUEST_URL_ATTR,        s -> new LinkedHashSet<>());    LinkedHashSet uris = exchange        .getRequiredAttribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR);    uris.add(url);}

Gateway接收到一个请求后,请求从FilteringWebHandler传送到全局过滤器链上(GatewayFilterChain),在过滤器链上向下传递,经过中间过滤器将请求URL替换后,由最后的请求转发过滤器(ForwardRoutingFilter)将请求交给DispatcherHandler向目标服务发起请求并将结果响应给调用端。

在了解路由失效的原因后、在尝试依赖Ribbon的starter包依然路由失败后,笔者决定自己实现路由功能,并使用Ribbon实现的负载均衡算法在网关实现负载均衡。

由于项目是基于Spring Cloud Kubernetes开发的微服务项目,使用Kubernetes云原生服务作为"注册中心",服务无需注册,可通过kubernete API读取Service或Endpoints资源,并且spring-cloud-kubernete-core提供了读取Service或Endpoints资源的API,因此自己实现路由功能相比于依赖一堆无关紧要的jar包更轻量。

负载均衡功能是次要的,如果不需要在网关实现负载均衡,则可以将服务发现模式改为Service,读取Kubernetes中的Service资源的Cluster IP;如果想要在网关实现负载均衡,而可以将服务发现模式改为Pod,读取Kubernetes的Endpoints资源。

自实现路由功能分为以下几个步骤:

  • 1、使用spring cloud kubernetes core提供访问kubernetes资源的客户端接口定时拉取服务目录缓存到本地;

  • 2、自实现负载均衡算法,或使用Ribbon的ribbon-loadbalancer包提供的负载均衡算法(IRule),每次路由根据算法从服务列表中选择一个节点调用;

  • 3、自定义实现理由功能的全局过滤器(GlobalFilter),指定该过滤器排在Gateway注册的非负载均衡过滤器之前,在它之前完成将url中的"lb://serviceId"替换为"http://ip:port"。

感谢各位的阅读,以上就是"Spring Cloud中怎么定制路由功能"的内容了,经过本文的学习后,相信大家对Spring Cloud中怎么定制路由功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

路由 过滤器 服务 网关 功能 均衡 性能 全局 资源 开发 算法 选择 流量 目标 项目 代理 学习 阻塞 内容 原因 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全报告200字 北京华为服务器虚拟化部署 帮助搭档找到服务器机房 江西省大眼界网络技术有限公司 2019北京展览馆网络安全 需求分析对软件开发的要求 东莞教育软件开发设计 传奇服务器聊天栏显示不全 arm集群服务器 网络安全泄密宣传 冀州网络安全态势感知装置 网络安全相关知识案例 旅游商品数据库设计 普陀区工商软件开发包括什么 软件开发人力资源渠道 网络安全管理制度及应急处置预案 自助终端机软件开发 网络安全技术培训材料 厦门思明软件开发外包 ps5连接不了ea服务器 网络安全提示用户 网络安全隐患包括哪几个方面 Jan16公司搭建了网站服务器 广州市贝佳软件开发公司 可以异地登录服务器地址是什么 南京智能化软件开发产品介绍 确保 软件开发安全 小规模软件开发服务的税率 车载网络技术的功能和特点 学生网络安全宣传语创新
0