统一服务入口-Gateway

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等奇数开发,旨在为微服务架构提供一种简单而有效的途径来转发请求,并为题目提供横切关注点,比如安全性/监控/指控和弹性

GitHub - spencergibb/spring-cloud-gateway-bench: Simple benchmark comparing zuul and spring cloud gateway · GitHub

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提供了路由规则的匹配机制

Spring Cloud Gateway

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 中不需要写任何配置。

相关推荐
墨着染霜华7 小时前
SpringCloud Gateway线上Nginx代理后自定义下划线请求头丢失(app_name/app_version获取不到)完美解决
nginx·spring cloud·gateway
晏宁科技YaningAI10 小时前
企业通信系统技术规划方法:从业务需求到可演进架构
网络·性能优化·架构·gateway·paas
Raas1001 天前
MAI Gateway(魔芋企业级AI网关)详解:AI网关在架构中的位置,一文读懂企业AI流量治理
大数据·人工智能·架构·gateway·ai网关·mai gateway
Raas1001 天前
AI网关在架构中的位置?MAI Gateway(魔芋企业级AI网关)给出企业级答案
大数据·网络·人工智能·架构·gateway·ai网关·mai gateway
随遇而安zx2 天前
SpringCloud---Gateway vs Netflix Zuul 网关对比深度解析
spring·spring cloud·gateway
Raas1003 天前
MAI Gateway(魔芋企业级AI网关)详解:企业为什么需要AI网关,一文读懂企业AI流量治理
大数据·人工智能·gateway·api·ai网关·mai gateway
tryxr3 天前
Chat2Excel 项目网关服务开发
java·gateway·网关模块开发