浅谈微服务中Gateway网关
什么是网关
网关可以提供一个统一的API入口,用于访问一个或多个接口,提供统一的路由方式且基于Filter链;
路由转发
接收请求,转发到后台微服务中,是构建网关的基本模块,一系列的断言和过滤器组成,如果断言为true则匹配该路由
过滤器:
在网关服务中可以完成的一系列横切操作,使用过滤器,可以在请求被路由前或之后对请求进行修改;
为什么需要网关
在微服务架构中,整个大项目是由多个小的服务系统提供出来,其中每个小的服务系统被成为微服务,他们可以拥有自己独立的插件、框架、数据库甚至是语言,API网关可以为外部用户提供一个独立于内部微服务组件的统一入口,所有的客户端和消费端都通过统一的API网关接入微服务,统一规范与管理,兼容各客户端请求;
为什么选择Gateway
一方面因为Zuul1.0已经进入了维护阶段,而且Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖。
Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心。虽然Netflix早就发布了最新的Zuul2.x,但Spring Clpud 貌似没有整合计划。而且Netflix相关组件都宣布进入维护期;
多方面综合考虑Gateway是很理想的网关选择
特征-路由转发,执行过滤链
动态路由:
构建网关的基本模块,由ID、目标URI、一系列的断言和过滤器组成,如果断言为true则匹配该路由
Predicate(断言):
参考的是Java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤器):
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
Web请求处理:
web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。predicate就是我们的匹配条件;而filter,就可以理解为一个无所不能的截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了
与Zuul区别
Zuul基于阻塞I/O的API网关,不支持长连接,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程工作;
Spring Cloud Gateway支持WebSocket,并且与Spring紧密集成
比较 | Gateway | Zuul |
---|---|---|
连接 | 支持长连接 | 不支持长连接 |
堵塞 | 阻塞I/O | 非阻塞I/O |
WebSocket | 支持 | 不支持 |
配置及测试过程
配置-配置文件配置
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯
配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** # 断言,路径相匹配的进行路由