当前位置:网站首页 > 技术博客 > 正文

spring cloud gateway 服务发现




微服务架构的兴起已经改变了软件开发的面貌,使得开发者能够更灵活地构建、部署和维护应用程序。而在这个微服务的时代,强大而灵活的网关是确保微服务之间通信顺畅的关键之一。在本文中,我们将深入研究Spring Cloud Gateway,一款开源的、基于Spring Framework的微服务网关,带领你从零开始构建强大的微服务架构。

单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务
在这里插入图片描述注:图片来自网络

Spring Cloud Gateway是Spring Cloud生态系统中的一员,它被设计用于处理所有微服务的入口流量。作为一个反向代理,它不仅提供了负载均衡和路由功能,还支持灵活的过滤器机制,过滤器可以在请求进入网关和离开网关时执行,用于处理各种逻辑,如身份验证、日志记录和性能监测,使得开发者能够定制和扩展其功能。

在这里插入图片描述网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上。
在这里插入图片描述

注:图片来自网络

在SpringCloud中网关的实现包括两种:

  • gateway
  • zuul

Zuul 是基于Servlet的实现,在1.x版本属于阻塞式编程,在2.x后是基于netty,是非阻塞的。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

目前一般都选用SpringCloudGateway,毕竟都是Spring家族一员,支持性更好。

需要先搭建一个SpringBoot项目,在父pom中引入依赖

 

在gateway服务中引入相关依赖

 

此外,请检查一下你的依赖中是否含有spring-boot-starter-web,如果有, 请干掉它 。因为我们的SpringCloud Gateway是一个netty+webflux实现的web服务器,和Springboot Web本身就是冲突的。

 

网关路由可以配置的内容包括:

  • 路由id:路由唯一标示
  • uri: 路由目的地,支持lb和http两种
  • predicates: 路由断言,判断请求是否符合要求,符合则转发到路由目的地
  • filters:路由过滤器,处理请求或响应

做到这里,一个简易的路由转发网关服务就搭建成功了,直接运行GatewayApplication服务,得到结果如图:

在这里插入图片描述
接下来在网页直接访问:http://127.0.0.1:8081/order-service/xx,网关就会将路由转发到orderService服务。

如果你是通过负载均衡路由到其他服务,这时候可能会报问题:

这是由于缺少一个相关的依赖

 

原因:

引入依赖重新运行,OK!

网关服务一个主要作用就是路由配置,通过不同的路由配置实现相应的功能。

1)Route:路由是网关的基本构件。它由ID、目标URI、路由断言工厂(谓语动词)和过滤器集合定义。如果断言工厂判断为真,则匹配路由。
2)Predicate:路由断言工厂,参照Java8的新特性Predicate。这允许开发人员匹配HTTP请求中的任何内容,比如请求头或参数。
3)Filter:路由过滤器。可以在发送下游请求之前或之后修改请求和响应。

下面看一个案例:

 

在这里插入图片描述
注:图片来自网络

网关的核心逻辑就是路由转发,执行过滤器链。在下面的处理过程中,Gateway Handler Mapping将请求和路由进行匹配,这时候就需要用到predicate,它是决定了一个请求是否走哪一个路由。
在这里插入图片描述

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件。

例如Path=/user/是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的。

像这样的断言工厂在SpringCloudGateway还有十几个:

在这里插入图片描述

 

这个路由规则会在东8区的2023-12-25 14:33:47后,将请求转跳到订单服务。

cookie类型的CookieRoutePredicateFactory,cookie名字和正则表达式的value作为两个输入参数,请求的cookie需要匹配cookie名和符合其中value的正则,才会进入此router;

 

路由匹配请求存在cookie名为cookiename,cookie内容匹配cookievalue的,将请求转发到订单服务。

以及host、method、path、querparam、remoteaddr类型的predicate,每一种predicate都会对当前的客户端请求进行判断,是否满足当前的要求,如果满足则交给当前请求处理。

如果有很多个Predicate,并且一个请求满足多个Predicate,则按照配置的顺序第一个生效。

请注意:一个请求满足多个路由的谓词条件时,请求只会被首个成功匹配的路由转发。

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

针对某些特殊的场景,Spring Cloud Gateway提供了31种不同的路由过滤器工厂。例如

在这里插入图片描述
在这里插入图片描述
注:图片来自网络

案例:

  1. AddRequestHeader:给所有进入orderService的请求添加一个请求头: mark=specifications
 

对匹配的请求,会额外添加mark:specifications的header。

AddRequestParameter、AddResponseHeader 类似。

  1. RemoveRequestHeader:移除请求的header
 

上面路由在发送请求给订单服务时,会将请求中的mark头信息去掉。

  1. StripPrefix:截断请求路径前缀
 

StripPrefix GatewayFilter Factory通过配置parts来表示截断路径前缀的数量。上面例子中,如果请求的路径为/order-service/order/1,则路径会修改为/order/1。

gateway提供的过滤器很多,这里不一一做展示。

自定义网关过滤器

定义方式是实现AbstractGatewayFilterFactory<>类。

 

自定义过滤器实现黑名单功能

 

配置自定义过滤器

 

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下

 

default-filters下的过滤器将对所有的路由都生效。

我们可以通过GlobalFilter实现日志记录、权限校验、流量监控等功能

定义方式是实现GlobalFilter接口:
在这里插入图片描述
自定义全局过滤器实现网关鉴权:

 

请求进入网关会碰到三类过滤器: 当前路由的过滤器、DefaultFilter、GlobalFilter。

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。
在这里插入图片描述

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器>GlobalFilter的顺序执行

可以参考下面几个类的源码查看:

在这里插入图片描述

Spring Cloud Gateway 根据作用范围划分为 GatewayFilter 和 GlobalFilter,二者区别如下:

  • GatewayFilter:网关过滤器,需要通过 spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过 spring.cloud.default-filters 配置在全局,作用在所有路由上。
  • GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,它为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。

同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域。

  • 同一协议, 如http或https
  • 同一IP地址或域名, 如127.0.0.1
  • 同一端口, 如8080

以上三个条件中有一个条件不同就会产生跨域问题。

例如:

  • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com
  • 域名相同,端口不同: localhost:8080和localhost:8081

解决方案:

跨源资源共享 (CORS):(或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch)使用 CORS,以降低跨源 HTTP 请求所带来的风险。

网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现。

CORS跨域要配置的参数包括:

  • 允许哪些域名跨域?
  • 允许哪些请求头?
  • 允许哪些请求方式?
  • 是否允许使用cookie?
  • 有效期是多久?
 

504 Gateway Timeout 错误是一个 HTTP 状态码,表示网关或代理服务器在尝试从上游服务器(如 Web 服务器或另一个代理)获取响应时,等待的时间超过了指定的超时限制。

在 Spring Cloud Gateway 中,这个错误通常是由以下原因引起的:

  1. 上游服务响应缓慢:上游服务(可能是您的微服务或其他后端服务)可能由于性能问题、资源瓶颈或处理逻辑复杂而响应缓慢。
  2. 网络问题:网络延迟或不稳定也可能导致请求在传输过程中花费的时间超过预期。
  3. 配置不当:Spring Cloud Gateway 的超时配置可能设置得太低,不适合您的应用或服务。

为了解决这个问题,您可以尝试以下步骤:

  1. 检查上游服务:确保上游服务正在运行并且性能良好。您可以使用工具(如 Prometheus、Grafana、JMeter 等)来监控和分析服务的性能和响应时间。
  2. 增加超时时间:在 Spring Cloud Gateway 的配置中增加超时时间。您可以在配置文件中(如 application.yml 或 application.properties)设置 spring.cloud.gateway.httpclient 相关的属性来调整超时时间。
    例如,在 application.yml 中:
 

我们在通过gateway进行路由转发时,可能会遇到各种的问题,通过统一异常处理器,可以将不同的异常进行集中式处理和管理。在开发或者使用过程中报错时,可以更加清晰明了的发现错误提示信息,方便更快地理解和解决问题,还可以优化用户体验并降低维护成本。

自定义异常处理器方式:
可以通过实现ErrorWebExceptionHandler接口来自定义异常处理器,对全局异常进行统一处理。
在这个处理器中,可以根据异常的类型、状态码等信息,返回不同的响应结果给前端。


                            

  • 上一篇: argphe
  • 下一篇: usermod-c
  • 版权声明


    相关文章:

  • argphe2025-01-26 15:30:02
  • ldap server2025-01-26 15:30:02
  • c语言结构体怎么初始化2025-01-26 15:30:02
  • 目前主流的中间件标准2025-01-26 15:30:02
  • 滑动验证码怎么做2025-01-26 15:30:02
  • usermod-c2025-01-26 15:30:02
  • bzero函数使用方法2025-01-26 15:30:02
  • css 栅格2025-01-26 15:30:02
  • emule服务器地址列表地址2025-01-26 15:30:02
  • opcache_compile_file2025-01-26 15:30:02