SpringCloud 原生的网关组件Gateway

互动: 为什么学习了网关 Zuul,又要讲 Spring Cloud Gateway 呢?
原因很简单,就是 Spring Cloud 已经放弃 Zuul 了。现在 Spring Cloud 中引用的还是 Zuul 1.x 版本,而 这个版本是基于过滤器的,是阻塞 IO,不支持长连接,spring 官网上也已经没有 zuul 的组件了,所以给大家讲下 SpringCloud 原生的网关产品 Gateway。
Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul,由 spring 官方基于Spring5.0,Spring Boot2.0,Project Reactor 等技术开发的网关,该项目提供了一个构建在 Spring Ecosystem 之上的 API 网关,旨在提供一种简单而有效的途径来发送 API,并向他们提供交叉关注点,例如:安全性,监控/指标和弹性。

SpringCloud Gateway 特征


SpringCloud 官方对 SpringCloud Gateway 特征介绍如下:

(1)集成 Hystrix 断路器
(2)集成 Spring Cloud DiscoveryClient
(3)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(4)具备一些网关的高级功能:动态路由、限流、路径重写
从以上的特征来说,和 Zuul 的特征差别不大。SpringCloud Gateway 和 Zuul 主要的区别,还是在底层的通信框架上。
简单说明一下上文中的三个术语:
1)Filter(过滤器):
和 Zuul 的过滤器在概念上类似, 可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。 过滤器为 org.springframework.cloud.gateway.filter.GatewayFilter 类的实例。

2)Route(路由):
网关配置的基本组成模块,和 Zuul 的路由配置模块类似。 一个 Route 模块由一个 ID,一个目标 URI,组断言和一组过滤器定义。如果断言为真,则路由匹配,目标 URI 会被访问。

3)Predicate(断言):
这是一个 Java8 的 Predicate, 可以使用它来匹配来自 HTTP 请求的任何内容 ,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
spring:
  cloud:
    gateway:
      discovery:
        locator:
          #开启以服务id去注册中心上获取转发地址
          enabled: true
          ##小写serviceId
          lower-case-service-id: true
      routes:
        - id: product-service
          uri: lb://product-service
          filters:
            - StripPrefix=1
          predicates:
            - Path=/product/**

        - id: order-service
          uri: lb://order-service
          filters:
            - StripPrefix=1
          predicates:
            - Path=/order/**

        - id: stock-service
          uri: lb://stock-service
          filters:
            - StripPrefix=1
          predicates:
            - Path=/stock/**

API网关


微服务架构的应用客户端如何访问各项服务?这会涉及到以下需求:

微服务提供的API粒度通常与客户端需要的有所不同。微服务通常提供的是细粒度API,这意味着客户端需要同多项服务进行交互。

不同客户端需要不同的数据,同时不同客户端的网络性能亦有所区别。

服务实例数量与其位置(主机与端口)会发生动态变化,服务的划分方式会随时间的推移而改变,且不应被客户端所感知。

使用API网关作为全部客户端的单一入口点。该API网关通过以下两种方式之一处理请求。部分请求会被直接代理/路由至对应的服务,另一部分请求则需要接入多项服务。

相比提供满足所有需求的API,API网关可以针对不同客户端提供出不同的API。 

SpringCloud 原生的网关组件Gateway_第1张图片

SpringCloud 原生的网关组件Gateway_第2张图片

[root@master js]# ls
index.js  jquery-1.8.2.min.js  layui  orderList.js  productList.js

[root@master js]# grep "http://gateway.ctnrs.com:8000" -r
productList.js:      , url: 'http://gateway.ctnrs.com:8000/product/queryAllProduct'
productList.js:            url: "http://gateway.ctnrs.com:8000/order/submitOrder",
orderList.js:      , url: 'http://gateway.ctnrs.com:8000/order/queryAllOrder'

你可能感兴趣的:(k8s与微服务)