1. 网关介绍
1.1 问题
通过Eureka/Nacos 解决了服务注册/服务发现的问题。使用Spring Cloud LoadBalance 结局了负载均衡的文艺,使用OpenFeign解决了远程调用的问题
但是目前所有微服务的接口都是直接对外暴露的,可以直接通过外部访问,为了保证对外服务的安全性,服务端实现的为服务接口通常带有一定的权限校验机制,由于使用了微服务,原本一个应用的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑,当这套逻辑需要修改时,需要修改多个应用
针对以上问题,一个常用的解决方案时使用API网关
1.2 声明时API网关
API网关也是一个服务,通常时后端读完的唯一入口,它定义类似设计模式的Facade模式(厂面模式,也称外观模式),它里斯整个微服务的架构门面,所有的外部客户端访问,都需要金国它来进行调度和过滤

网关核心功能:
权限控制:作为微服务入口,对用户进行权限校验,如果校验失败则进行拦截
动态路由:一切请求先经过网关,但网关不处理业务,而是根据某种规则,将请求转发到某个为服务
负载均衡:当路由的目标服务有多个时,还需要做负载均衡
限流:请求流量过高时,按照网关中配置微服务能够接收的流量进行放行,避免服务压力过大
1.3 常见的网关实现
Zuul
Zuul 是MNetfix 公司开源的一个API网关组件,可以和Eureka/Ribbon等组件配合使用,但是后续进入维护状态
Spring Cloud Gateway
是Spring Cloud 的一个全新的API网关项目,基于Spring+SpringBoot等奇数开发,旨在为微服务架构提供一种简单而有效的途径来转发请求,并为题目提供横切关注点,比如安全性/监控/指控和弹性
2. Spring Cloud Gateway
2.1 快速上手
引入依赖
编写启动类
配置

uri:目标服务地址,支持普通url及 lb://应用注册服务名称,lb表示负载均衡,使用lb;//方式表示从注册中心获取服务地址
predicates:路由条件,根据匹配结果决定是否执行该请求路由
访问时,网关服务从Nacos获取服务列表
2.2 Route Predicate Factories
Predicate
Predicate 是Java 8 提供的一个函数式编程接口,它接收一个参数并返回一个布尔值,用于条件过滤,请求参数的校验
java
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
//...
}


匿名内部类

lambda

Predicate的其他方法



Route Predicate Factories
路由断言工厂,在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制


2.3 Gateway Filter Factories(网关过滤工厂)
Predicate 决定了请求由哪一个路由处理,如果在请求处理亲厚需要加一些逻辑,这就是Filter(过滤器)的作用范围了
Filter分为两种类型:Pre类型和Post类型
Pre类型过滤器:路由处理之前中心(请求转发到后端服务之前执行),在pre类型过滤器中可以做鉴权,限流等
Post过滤器:请求中心完成之后,将结果返回给客户端之前执行
Spring Cloud Gateway 中内置了很多Filter,用于拦截和链式处理web请求,比如权限校验,访问超时等设定
Spring Cloud Gateway从作用范围上,可以分为
**GatewayFilter:**应用到单个路由或者一个分组的路由上
**GlobalFilter:**应用到所有的路由上,也就是对所有的请求生效
GatewayFilter






Default Filters
前面的filter添加在指导路由下,所以只对当前路由生效,若需要对全部路由生效,可以使用
spring.cloud.gateway.default-filters



GlobalFilter
GlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作⽤是相同的. GlobalFilter 会应⽤到所有的路由请求上,全局过滤器通常⽤于实现与安全性,性能监控和⽇志记录等相 关的全局功能.
Spring Cloud Gateway内置的全局过滤器也有很多,⽐如:
• GatewayMetricsFilter: ⽹关指标,提供监控指标
• ForwardRoutingFilter: ⽤于本地forword,请求不转发到下游服务器
• LoadBalancerClientFilter: 针对下游服务,实现负载均衡.
.......


2.4 过滤器执行顺序
请求路由后,网关会把当前项目中的GatewayFilter 和 GlobalFilter 合并到一个过滤器链中,并进行排序,一次执行过滤器

每一个过滤器都必须指导一个int类型和order值,默认值为0,表示过滤器的优先级,order越校,优先级越高,执行顺序越靠前
- Filter通过实现Order接口或者添加@Order注解来指定order值
- Spring Cloud Gateway 提供的Filter由Spring指定,用户也可以自定义Filter,由用户指定
- 当过滤器的order值一样时,会按照defaultFilter>GatewayFilter>GlobalFilter
2.5 自定义过滤器
Spring Cloud Gateway提供了过滤器的扩展功能,开发者可以根据实际业务来自定义过滤器,同样自定义过滤器也支持GatewayFilter和GlobalFilter两种
GatewayFilter




GlobalFilter

需求是拦截所有进入网关的请求 (比如全局限流、全局鉴权、全局日志),你只需要直接实现 GlobalFilter 接口并加上 @Component 注解即可。
一旦写了 GlobalFilter,它会对所有路由自动生效,YAML 中不需要写任何配置。


