【Cloudgetway网关】 GetWay网关入门使用

一、概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ow0KO8iV-1686286922163)(null)]

GateWay是zuul的替代品,由于Zuul2.0迟迟没有出来,SpringCloud社区推出了gateWay网关来替代zuul1.x版本。提供了以下功能: 底层使用netty通讯

  • 反向代理

  • 鉴权

  • 安全

  • 监控、指标

  • 限流

    GateWay具有以下特征: 基于Spring,PR,SpringBoot构建

  • 动态路由

  • 集成hystrix断路器功能

  • 路径重写

  • 请求限流等功能

  • 断言和过滤器

1. 非阻塞异步模型

​ Getway是基于异步非阻塞模型上进行开发,性能更优秀。

  • 阻塞处理模型就是: 当请求进入ServletContainer,它就会为之绑定一个线程,这种模型只适合用于并发不高的情况。Zuul1.x就是基于这么一个阻塞式处理模型。

    Servlet3.1之后有异步非阻塞的支持,webFlux就是基于这么个框架,他的核心就是基于Reactor相关的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm6RKKXq-1686286919028)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128170458657.png)]

2. 三大概念

路由Route

路由是构建网关的基本模块,由ID,和目标URI,和一系列断言和过滤器组成,如果断言为True则匹配该路由。

浅浅可以与Vue的路由概念相理解

断言Predicate

断言就是Java8中Java.utils.function.Predicate,匹配Http请求中的内容,如果请求与断言相互匹配,则进行路由转发到微服务。

过滤Filter

GatewayFilter的实例,使用过滤器,在请求被路由转发之前或者之后对请求进行修改

like ServletFilter: beforeFilter doAction afterFilter

  1. 客户端向GateWay请求,先通过网关中断言
  2. 在进行n层过滤器
  3. 最后根据目标uri访问对应的微服务

【Cloudgetway网关】 GetWay网关入门使用_第1张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hx3i9eBP-1686286922136)(null)]

总结gateway的作用就是路由转发+执行过滤链

二、入门配置

1. 基础配置

1.1 Yaml方式

使用gatway网关,来访问8001的微服务

  1. 建立Pom

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-gatewayartifactId>
dependency>

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
  1. 修改YAML

由于网关也是一种微服务,因此也需要注册进入服务注册中心;

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuitBreak/**         # 断言,路径相匹配的进行路由

        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/ok/**         # 断言,路径相匹配的进行路由

eureka:
  instance:
    hostname: cloud-gateway-service
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka
  1. 启动网关和8001微服务,使用9527端口进行访问;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8wVKlev-1686286922174)(null)]


1.2 硬编码方式配置路由

【Cloudgetway网关】 GetWay网关入门使用_第2张图片

2. 通过微服务实现动态路由

通过上面的案例中,出现了两个问题

  • 路由地址是硬编码方式
  • 微服务中可能有多台机器,没有实现负载均衡

我们可以通过修改Yaml,实现动态路由来解决以上两个问题。

  1. 开启动态路由
  2. 将 uri 改成 lb: //{微服务名称}
  cloud:
    gateway:
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
         # uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-HYSTRIX-PAYMENT/
          predicates:
            - Path=/payment/circuitBreak/**         # 断言,路径相匹配的进行路由

        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-HYSTRIX-PAYMENT/
          predicates:
            - Path=/payment/ok/**         # 断言,路径相匹配的进行路由
      discovery:
        locator:
          enabled: true #开启识别动态路由

3. Predicate使用

​ 在官方自带的断言有11种

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VlMwvJvV-1686286922187)(null)]

以上各种RoutePredicateFactory都代表了HTTP请求中不同属性值,之间都可以进行组合,并且通过逻辑AND进行断言匹配。

3.1 After

匹配时间: ZonedDateTime

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EuUVhQu-1686286919029)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128211153223.png)]

3.2 cookie

  • 匹配是否有Cookie,若有,匹配成功,否则拒绝访问。
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOOQ3DKM-1686286919029)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213100527.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNvO7sFW-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213157753.png)]

3.2 Header

  • 匹配中检测是否有请求头,若有匹配成功,否则拒绝访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JON9M7x9-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213331414.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NpDwlLJb-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213426307.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-69ll88c0-1686286919030)(C:\Users\JaneOnly\AppData\Roaming\Typora\typora-user-images\image-20221128213459763.png)]

3.3 Method

  • 匹配请求方式GETPost等等。

predicate就是为了实现一组匹配规则,让请求过来找到对应的route进行处理。

4. Filter

使用过滤器,可以在路由转发请求前,或者请求后,对请求进行一定的修改,也就是可以修改进入的HTTP请求和返回的HTTP相应,路由过滤器只能指定路由进行使用。

  • 生命周期-pre|post
  • 种类-GetwayFilter|GlobalFilter

根据官网文档,添加配置:

简单实例:

yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgQUxGVh-1686286922201)(null)]

自定义过滤器**

可以进行全局日志记录,同一网关鉴权等…

  1. 实现两个接口 GlobalFilter,Ordered
@Component
public class MyLoagGatewayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if(uname == null){
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    /**
     * 优先级
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

测试:

不带uname访问:

【Cloudgetway网关】 GetWay网关入门使用_第3张图片

带着uname访问成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiEmVJhl-1686286922148)(null)]

  1. 重写两个方法

你可能感兴趣的:(SpringCloud,java,spring,boot,spring)