1.开篇
Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等
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 1.x非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。Gateway能干嘛?(反向代理、鉴权、流量控制、熔断、日志监控等)
Gateway三大核心概念:(路由转发+ 执行过滤链)
· Route(路由):路由是构建网关的基本模块,它由ID、目标URI、一系列的断言和过滤器组成,如果断言为true则匹配该路由。
· Predicate(断言):参考Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容,如果请求与断言相匹配则进行路由。
· Filter(过滤):指的是Spring中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后,对请求进行修改。
2.项目源码
github源码地址:https://github.com/2656307671/SpringCloud-Hoxton-Gateway
gitee源码地址:https://gitee.com/szh-forever-young/SpringCloud-Hoxton-Gateway
启动7001、8001、8002、9527。
在没有添加网关的时候,我们访问url是:http://localhost:8001/payment/get/1;添加网关之后,url是:http://localhost:9527/payment/get/1?uname=szh
因为我们后来添加了相关断言和过滤器,所以测试在浏览器中输入 http://localhost:9527/payment/lb?uname=szh
eureka7001这个注册中心中,可以看到我们的两个微服务已经注册进来了。
添加网关之后,再输入http://localhost:9527/payment/get/1则无法访问,此时会被过滤器给过滤拦截,需要根据我们自定义的业务逻辑,在后面加上uname参数。即url为http://localhost:9527/payment/get/1?uname=szh 才可以正常访问。
刷新页面,可以在serverPort中看到8001、8002交替访问,这是因为配置文件中的 uri协议lb表示启用Gateway的负载均衡功能,同时实现动态路由功能。
下面的 http://localhost:9527/payment/lb?uname=szh 也是同样的道理。(9527就是套在8001、8002外的一层保护罩,如果断言、过滤器等相关配置信息不符合要求,则访问出错;想要成功访问,则必须请求url必须与断言、过滤器相匹配,才可进行路由)