Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接,如 WebSockets,Spring Cloud Gateway 使用非阻塞 API,支持 WebSockets,支持限流等新特性。
Spring Cloud Gateway介绍
Spring Cloud Gateway 是 是基于 Spring 5.0,Spring Boot 2.0, Project Reactor和WebFlux等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
相关概念:
- Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
- Predicate(断言):这是一个 Java 8 的Function Predicate。输入类型是一个 [Spring Framework
ServerWebExchange
]。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。 - Filter(过滤器):这是
org.springframework.cloud.gateway.filter.GatewayFilter
的实例,我们可以使用它修改请求和响应。
工作流程:
image客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Spring Cloud Gateway 的特征:
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
- 动态路由
- Predicates 和 Filters 作用于特定路由
- 集成 Hystrix 断路器
- 集成 Spring Cloud DiscoveryClient
- 易于编写的 Predicates 和 Filters
- 限流
- 路径重写
快速上手
Spring Cloud Gateway 网关路由有两种配置方式:
- 在配置文件 yml 中配置
- 通过@Bean自定义 RouteLocator,在启动主类 Application 中配置
这两种方式是等价的,建议使用 yml 方式进配置。
配置服务的路由:配置文件方式
新建spring cloud项目,在项目中添加spring cloud gateway的依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Spring Cloud Gateway 是使用 netty+webflux 实现因此不需要再引入 web 模块。
在.yml或.properties文件中添加如下配置:
server:
port: 8081
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://www.baidu.com
predicates:
- Path=/a/**
filters:
- StripPrefix=1
- id: host_route
uri: http://www.ityouknow.com
predicates:
- Path=/springcloud
# filters:
# - StripPrefix=1
- id:自定义
- uri:目标服务地址
- predicates:路由条件
- filters:过滤规则
上面这段配置的意思是,配置了两个 id 为 host_route 的路由规则,当访问地址 http://localhost:8081/a时会自动转发到地址:https://www.baidu.com,当访问地址 http://localhost:8081/springcloud时会自动转发到地址:http://www.ityouknow.com/springcloud。配置完成启动项目即可在浏览器访问进行测试。
配置服务的路由:代码方式
1、删除配置文件中的路由配置
2、修改 Application.java, 添加自定义路由配置
@SpringBootApplication
public class CloudgatewayApplication {
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/a/**")
// .filters(f -> f.addRequestHeader("Hello", "World"))
.filters(f -> f.stripPrefix(1))
.uri("https://www.baidu.com"))
.build();
}
public static void main(String[] args) {
SpringApplication.run(CloudgatewayApplication.class, args);
}
}
当访问地址 http://localhost:8081/a时会自动转发到地址:https://www.baidu.com
路由规则
Spring Cloud Gateway 内置了很多 Predicates 工厂,这些 Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。
Spring Cloud Gateway 的功能很强大,我们仅仅通过 Predicates 的设计就可以看出来,前面我们只是使用了 predicates 进行了简单的条件匹配,其实 Spring Cloud Gataway 帮我们内置了很多 Predicates 功能。
Spring Cloud Gateway 是通过 Spring WebFlux 的 HandlerMapping 做为底层支持来匹配到转发路由,Spring Cloud Gateway 内置了很多 Predicates 工厂,这些 Predicates 工厂通过不同的 HTTP 请求参数来匹配,多个 Predicates 工厂可以组合使用。
Predicate 介绍
Predicate 来源于 Java 8,是 Java 8 中引入的一个函数,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。如果对Predicate不了解的,可以先了解一下JAVA 8函数式编程。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。具体可以查看可参考 官方文档,网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。
说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理。具体的配置可以参考官方文档。
网友评论