系列链接:
- GitHub:源码
- SpringCloud(1)–入门、版本、环境搭建
- SpringCloud(2)–服务注册与发现(Eureka、Zookeeper、Consul)
- SpringCloud(3)–服务调用(Ribbon、OpenFeign)
- SpringCloud(4)–服务降级(Hystrix、降级、熔断、监控)
- SpringCloud(5)–服务网关(GateWay)
- …
服务网关
基本架构如下:
GateWay
Gateway 是在 Spring 生态系统之上构建的 API 网关服务,基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术。它提供了一种简单且有效的方式来对 API 进行路由,并提供了一些强大的过滤器功能(熔断、限流、重试等)。
Gateway 的底层是基于 WebFlux 框架实现的,而webFlux底层使用netty通信(NIO)。
GateWay的特性:
- 基于 Spring 5、Spring Boot 2 和 Project Reactor 进行构建
- 动态路由,能够匹配任何请求属性
- 可以对路由指定和边写 Predicate(断言)和 Filter(过滤器)
- 集成 Hystrix 的断路器功能
- 集成 Spring Cloud 服务发现功能
- 请求限流功能、支持路径重写
GateWay与zuul的区别:
- Zuul 1.x 是一个基于 Servlet 2.5 的阻塞架构,性能较差。而 2.x 版本基于 Netty 非阻塞并支持长连接,但与 Spring Cloud 目前还没整合。
- Gateway 使用非阻塞 API,支持 WebSocket 且与 Spring 紧密集成。
相关概念
-
路由: 路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,就是根据某些规则,将请求发送到指定服务上。
-
断言: 断言用于匹配 HTTP 请求中的所有内容(请求头/请求参数),如果请求与断言相匹配则进行路由。
-
过滤: 实现的过滤器可以在请求被路由前或者之后,对请求进行修改。
工作原理
客户端向 Gateway 发出请求,然后在 Gateway Handler Mapping 中找到与请求匹配的路由,将其发送到 Gateway Handler。Handler 再通过指定的过滤器链,然后将请求发送到实际的服务执行业务逻辑,最后返回。
过滤器链之间用虚线分开,是因为在发送请求之前或之后执行一些其他的业务逻辑:
- 之前:参数校验、权限校验、流量监控、日志输出、协议转换等。
- 之后:相应内容与响应头的修改、日志输出、流量监控等。
GateWay的使用
-
新建名称为 cloud-gateway-gateway9527 的Module
-
pom文件
<!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
配置文件
server: port: 9527 spring: application: name: cloud-gateway