Gateway

Gateway网关是我们服务的守门神,所有微服务的统一入口。
网关的核心功能特性:
请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

简单使用(网关本身也是一种服务,需要注册到注册中心,才能从注册中心发现其他在注册中心的服务)

  1. 引依赖 spring-cloud-starter-gateway spring-cloud-starter-alibaba-nacos-discovery
  2. 启动类
  3. 配置文件:
点击查看代码
spring:
  cloud:
    gateway:
      routes:  #路由
        - id: #路由id,自定义,唯一即可。  这里的  "-" ,代表的数组或者集合(反正就是多个的意思),因为路由规则可以有多个
          uri: lb://user-server   # "lb",负载均衡,后面跟服务名称
          predicates: #路由断言,按照以下路径匹配,只要符合要求就路由到 uri
            - Path=/user/**    # "-" 代表有多个该属性(这里是 Path),  - Path=/user/**。 **注意大小写,  Path**  。断言规则只是字符串,符合yaml的写法
**本地配置文件(bootstarp.yaml) 只配置了连接远程配置文件(Nacos 的 gateway-dev.yaml )。 就算本地文件写了 spring.cloud.nacos.. , 在远程配置文件里要配置网关 ,而网关 gateway在 spring.cloud下,也要在重写一遍。 即远程网关配置 spring.cloud.gateway.....**

全局过滤器
gateway包括 route 和 filter。用户要访问服务,发请求到网关,然后根据路由断言匹配到设置的服务,但在这之前必须要经过 过滤器的过滤处理。
网关提供了31种过滤器,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现。

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
自定义全局过滤器的方式是 实现 GlobalFilter接口,然后在实现方法 Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) 中编写自定义逻辑(登录状态,权限校验,请求限流等)
Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)
处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
@param exchange 请求上下文,里面可以获取Request、Response等信息
@param chain 用来把请求委托给下一个过滤器
@return {@code Mono} 返回标示当前过滤器业务结束

**请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter,一般优先规则是 默认>路由>全局。
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
**

关于跨域问题, 解决方案推荐 CORS 即可

posted @ 2023-05-23 05:54  mty072788  阅读(5)  评论(0编辑  收藏  举报