文章目录
一、服务网关简介
1、什么是服务网关?
简单理解服务网关就是一个网络关口、通道,是整个服务的统一入口;所有客户端的请求都通过统一的网关接入服务。
2、服务网关的作用
为微服务云平台提供统一的入口是API网关最主要的用途,除此之外,网关还可承担认证授权、访问控制、路由、负载均衡、缓存、日志、限流限额、转换、映射、过滤、熔断、注册、服务编排、API管理、监控、统计分析等等非业务性的功能。
二、Spring Cloud Gateway
1、简介
SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
注意:Spring Cloud Gateway 底层使用了高性能的通信框架Netty。
2、三大核心概念
Filter(过滤器):
和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对下游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。
Route(路由):
网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。
Predicate(断言):
这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。
三、Gateway之路由
1,基础路由配置方式
server:
port: 9002
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: service1
uri: http://127.0.0.1:9001
predicates:
- Path=/api/bill
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9004/eureka
各字段含义如下:
● id:我们自定义的路由 ID,保持唯一
● uri:目标服务地址
● predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
上面这段配置的意思是,配置了一个id为service1的URI代理规则,路由的规则为,当访问地址http://localhost:9002/api/bill时,会路由到上游地址http://127.0.0.1:9001/api/bill
2,基于代码的路由配置方式
转发功能同样可以通过代码来实现,我们可以在启动类 GateWayApplication 中添加方法 customRouteLocator() 来定制转发规则:
3,和服务注册中心相结合的路由配置方式
server:
port: 9002
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: service1
uri: http://127.0.0.1:9001
predicates:
- Path=/api/bill
- id: service2
uri: lb://cloud-payment-service
predicates:
- Path=/payment/id
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9004/eureka
其中,id为service2的路由,通过loadbalancer负载均衡的方法对注册的服务进行路由(调用)
四、Gateway之断言条件
1、简介
Predicate 来源于 Java 8,是 Java 8 中引入的一个函数,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。
2、常见predicate的使用
Spring Cloud GateWay 内置的几种Predicate如下:转发规则(predicates),假设转发uri都设定为http://localhost:9001
五、Gateway之过滤器
Spring-Cloud-Gateway 基于过滤器实现,同 zuul 类似,有pre和post两种方式的 filter,分别处理前置逻辑和后置逻辑。客户端的请求先经过pre类型的 filter,然后将请求转发到具体的业务服务,收到业务服务的响应之后,再经过post类型的 filter 处理,最后返回响应到客户端。