Spring Cloud微服务网关Gateway组件

什么是Spring Cloud Gateway

网关作为流量的入口,常见的功能包括路由转发,权限校验,限流等。
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,定位于取代Netflix Zuul1.0。相比Zuul来说,Spring Cloud Gateway提供更优秀的性能,更强大的功能。
Spring Cloud Gateway是由WebFlux + Netty + Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不构建成war包。
Spring Cloud Gateway旨在为微服务架构提供一种简单且有效的API路由的管理方式,并基于Filter的方式提供网关的基本功能,例如说安全认证、监控、限流等等。

1.其它的网关组件:
在SpringCloud微服务体系中,有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;但在2.x版本中,Zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloud Gateway
网上很多地方都说Zuul是阻塞的,Gateway是非阻塞的,这么说是不严谨的,准确的讲Zuul.x是阻塞的,而在2.x的版本中,Zuul也是基于Netty,也是非阻塞的,如果一定要说性能,其实这个真没多大差距。

而官网出过一个测试项目,创建了一个benchmark的测试项目:spring-cloud-gateway-bench,其中对比了:
在这里插入图片描述

性能强劲:是第一代网关Zuul的1.6倍

官网文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

Spring Cloud Gateway功能特征

  1. 基于Spring Framework 5,Project Reactor 和 Spring Boot2.0进行构建;
  2. 动态路由:能够匹配任何请求属性;
  3. 支持路径重写;
  4. 集成Spring Cloud服务发现功能(Nacos、Eruka);
  5. 可集成流控降级功能(Sentinel、Hystrix);
  6. 可以对路由指定易于编写的Predicate(断言)和Filter(过滤器);

核心概念

  1. 路由(route)
    路由是网关中最基础的部分,路由信息包括一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。
  2. 断言(predicates)
    Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。
  3. 过滤器(Filter)
    SpringCloud Gateway中的filter分为Gateway Filter和Global Filter。Filter可以对请求和响应进行处理。

工作原理

Spring Cloud Gateway的工作原理跟Zuul的差不多,最大的区别就是Gateway的Filter只有pre和post两种。
在这里插入图片描述

客户端向Spring Cloud Gateway发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关Web处理程序,此时处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有pre过滤器逻辑先执行,然后执行代理请求;代理请求完成后,执行post过滤器逻辑。

Spring Cloud Gateway快速开始

1.环境搭建
1》引入依赖

<!--gateway的依赖 spring cloud开发-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

注意:会和spring-webmvc的依赖冲突,需要排除spring-webmvc

2》编写yml配置文件

server:
  port: 8088
# 应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: api-gateway
  cloud:
    # gateway的配置
    gateway:
      # 路由规则
      routes:
        - id: order_route  # 路由的唯一标识,路由到order
          uri: http://localhost:8020 # 需要转发的地址
          # 断言规则 用于路由规则的匹配
          predicates:
            - Path=/order-serv/**
              # http://localhost:8020/order-serv/order/add
          filters:
            - StripPrefix=1  # 转发之前去掉第一层路径
              # http://localhost:8020/order/add
        #- id: stock_route

3》测试
在这里插入图片描述

gateway整合nacos

现在在配置文件中写死了转发路径的地址,当面我们已经分析过地址写死带来的问题,接下来我们从注册中心获取此地址。
1.引入依赖

<!--nacos服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--gateway的依赖 spring cloud开发-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.编写yml配置文件

server:
  port: 8088
# 应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: api-gateway
  cloud:
    # gateway的配置
    gateway:
      # 路由规则
      routes:
        - id: order_route  # 路由的唯一标识,路由到order
          uri: lb://order-service # 需要转发的地址  lb:  使用nacos中的本地负载均衡策略
          # 断言规则 用于路由规则的匹配
          predicates:
            - Path=/order-serv/**
              # http://localhost:8020/order-serv/order/add
          filters:
            - StripPrefix=1  # 转发之前去掉第一层路径
              # http://localhost:8020/order/add
        #- id: stock_route
    # 配置nacos
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

3.测试
在这里插入图片描述
4.简写:去掉关于路由的配置,自动寻找服务

server:
  port: 8020
# 应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

5.测试
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/muriyue6/article/details/121573199