Spring Cloud Gateway 是什么
Gateway是Spring Cloud 第二代网关,第一代是Zuul。
- Spring Cloud Gateway是Spring官网基于
Spring 5.0、 Spring Boot 2.0、Project Reactor
等技术开发等网关。 - Spring Cloud Gateway为微服务架构提供简单、有效且统一的API路由管理方式。
- Spring Cloud Gateway基于Filter链提供网关基本功能:安全、监控/埋点、限流等。
- Spring Cloud Gateway是替代Netflix Zuul的一套解决方案。
Spring Cloud Gateway 核心概念
Spring Cloud Gateway设计以降低管理成本和安全风险,包含协议适配
、协议转发
、安全策略(WAF)、防刷、流量、监控日志等功能。
Spring Cloud Gateway中重要的概念:
- 路由(route)
路由信息的组成:
由一个ID、一个目的URL、一组断言工厂、一组Filter组成。
如果路由断言为真,说明请求URL和配置路由匹配。 - 断言(Predicate)
Java 8中的断言函数。
Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。 - 过滤器(Filter)
一个标准的Spring WebFilter。
Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
Spring Cloud Gateway 工作原理
如上图所示,有几个知识点:
Gateway的客户端会向Spring Cloud Gateway发送请求,请求
首先被HttpWebHandlerAdapter进行提取组装成网关上下文.
然后网关的上下文会传递到DispatcherHandler。 DispatcherHandler是所有请求的分发处理器.
- DispatcherHandler
DispatcherHandler主要负责分发请求对应的处理器,比如将请求分发到对应RoutePredicate-HandlerMapping(路由断言处理映射器)。
- RoutePredicate-HandlerMapping(路由断言处理映射器)
路由断言处理映射器主要用于路由的查找,以及找到路由返回对应的FilteringWebHandler。
- FilteringWebHandler
FilteringWebHandler主要负责组装Filter链表并调用Filter执行一系列Filter处理,然后把请求转到后端对应的代理服务处理,处理完毕之后将Response返回到Gateway客户端。
- Filter类型
Spring Cloud Gateway和Zuul类似,有pre和post两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如一个service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。类似在zuul中指定入口filter和出口filter。
注:在配置路由的时候,如果不指定端口的话,http默认设置端口为80,https默认设置端口为443。Spring Cloud Gateway的启动容器目前只支持Netty。
Spring Cloud Gateway 案例
网关最重要的功能是协议适配和协议转发,协议转发即基本的路由信息转发,本节演示最简单的Spring Cloud Gateway协议转发
的实现。
使用Application.java与yml两种方式分别展示基础路由
Application.java 创建项目spring-cloud-application
- pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>
- yml
server:
port: 8080
spring:
application:
name: spring-cloud-gateway
# Spring Cloud Gateway 日志配置
logging:
level:
org.springframework.cloud.gateway: TRACE
org.springframework.http.server.reactive: DEBUG
org.springframework.web.reactive: DEBUG
reactor.ipc.netty: DEBUG
JAVA API方式
@SpringBootApplication
public class CloudGatewayBasic1Application {
/**
* 通过JAVA流式API自定义RouteLocatorBuilder方式定义Spring Cloud Gateway路由
* @param builder
* @return
*/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
// basic proxy
.route(r -> r.path("/jd")
.uri("http://jd.com:80/")
.id("jd_route")
).build();
}
public static void main(String[] args) {
SpringApplication.run(CloudGatewayBasic1Application.class, args);
}
}
服务启动,访问 http://localhost:8080/jd 会自动跳转到https://www.jd.com/
yml方式
基本与上方代码一致,Application和yml有所变化:
- Application(只是一个启动程序,没有特殊东西)
@SpringBootApplication
public class CloudGatewayBasic2Application {
public static void main(String[] args) {
SpringApplication.run(CloudGatewayBasic2Application.class, args);
}
}
- yml
server:
port: 8080
spring:
application:
name: spring-cloud-gateway
cloud:
gateway:
routes:
- id: baidu_route
uri: http://www.baidu.com
predicates:
- Path=/baidu
# Spring Cloud Gateway 日志配置
logging:
level:
org.springframework.cloud.gateway: TRACE
org.springframework.http.server.reactive: DEBUG
org.springframework.web.reactive: DEBUG
reactor.ipc.netty: DEBUG
yml中体现了Spring Cloud Gateway的配置
路由端点监控
Spring Cloud Gateway提供gateway actuator
,该EndPiont提供关于Filter及routes的信息查询及指定route信息更新的Rest API接口。配置后即可查看路由情况
需在yml中添加如下配置:
......
management:
endpoints:
web:
exposure:
include: '*'
enabled: false
# Spring Cloud Gateway 日志配置
logging:
......
新增management
这段代码,然后访问地址:
http://localhost:8080/actuator/gateway/routes 查看到路由情况
参考:
https://blog.csdn.net/Cy_LightBule/article/details/86578772#