一、 什么是Gateway?

1.网关的由来

单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务

2.网关的作用

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

网关功能

  • 身份认证和权限校验
  • 服务路由、负载均衡
  • 日志监控
  • 限流熔断

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

3.Gateway 和 Nginx 的区别

Nginx主要作用是反向代理, 实现负载均衡, 负载均衡就是我们将项目部署到多个服务器上, 然后通过使用统一的域名去访问, 如通过 Nginx 对请求进行分发, 从而减轻服务器的压力,换句话说, Nginx 服务器起到了分发的作用, 但是真正的实现可以放在其他的服务器上, Nginx 作为隔离层, 也对我们项目起到了安全壁障. 那么 Gateway 和 Nginx 有什么区别呢?

首先要区分这两个概念先要区分流量网关业务网关的概念, Nginx 作为流量网关, 相当于访问的一个总入口, 也就是说我们会将所有的 html 页面放到 Nginx 的容器中, 从而起到流量的监控及日志的管理, 全局的限流等; 而业务网关则是针对具体的后端应用和服务, 也可以总结为 Nginx 主要配置在前端, 而 Gateway 则是配置在后端;
其次 Gateway 主要是利用路由, 断言及过滤器进行流量的控制等; Nginx 主要是负载均衡, 反向代理及当做 Web 服务器,虽然 Gateway 也有实现负载均衡的作用.
总之, Gateway 是前端工程到后端服务器之间的一个业务网关, 而 Nginx 是用户到前端工程的流量网关.

二、搭建一个简易网关服务

 1.引入依赖

<dependencies>
        <!--spring cloud gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos 服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

      <!--客户端负载均衡loadbalancer,如果是通过负载均衡到其他服务,则需要引入-->
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
     </dependency>

    </dependencies>

2.配置application.yml文件 

server:
  port: 8081 # 网关端口
spring:
  application:
    name: gateway # 服务名称
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 # nacos地址
    gateway:
      routes: # 网关路由配置
        - id: baidu # 路由id, 自定义,唯一即可
          # uri: 127.0.0.1:/qb-service # - 路由目的地,支持lb和http两种
          uri: lb://qb-service # 路由的目的地,lb是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断是否符合路由规则的条件
            - Path=/qb/** # path 按照路径进行匹配,只要以/qb/开头就符合规则
          filters:
            - StripPrefix=1 # 过滤器,去除请求的前缀路径,StripPrefix=1 表示去除请求路径的第一个路径片段

网关路由流程:

4.断言工厂

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

5.过滤器 

过滤器的作用
  • 对路由的请求或者响应做加工处理, 如上面的案例添加请求头;
  • filters: 配置在路由下的过滤器只对当前路由的请求生效, default-filters 则是对所有路由都生效.
过滤器种类
网关过滤器

可以自定义网关过滤器,定义方式是实现AbstractGatewayFilterFactory<>类。

默认过滤器

对所有的路由都生效

全局过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义(即在 yml 中配置使用,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现,即实现GlobalFilter接口。

具体实现步骤:

  • 实现 GlobalFilter 接口;
  • 添加 @Order 注解或者是实现 Ordered 接口;
  • 编写处理逻辑.

过滤器实现顺序

请求路由后, 会将三个路由器合并到一个过滤器中, 排序后一次进行执行, 如上图所示;

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

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐