- 个人主页: 程序员爱摸鱼
- 版权: 本文由【程序员爱摸鱼】原创、在CSDN首发、需要转载请联系博主
- 如果文章对你有帮助、欢迎关注+点赞+收藏(一键三连)哦
- 想寻找共同成长的小伙伴,可以互粉哦
文章目录
1.1 概述
相关术语
1.2 入门
1.2.1 搭建环境
1.2.2 测试
2.1 routes路由
2.1.2 路由匹配规则
2.2.1 predicates 断言
7.3.3 Filter 网关过滤器
1.1 概述
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor(响应式编程) 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
1.1.1 相关术语
Gateway 目标是替代 Zuul,所有基本特性差别不大,主要的区别,底层的通信框架。
术语 | 描述 |
Route(路由) | 网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。 |
Predicate(断言) | 这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。 |
Filter(过滤器) | 和Zuul的过滤器在概念上类似,可以使用它拦截和修改请求,并且对上游的响应,进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的实例。 |
1.2 入门
1.2.1 搭建环境
创建项目:test-gateway-2.1
- 修改pom,添加坐标
org.springframework.cloudspring-cloud-starter-gatewaycom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery
- 配置 yml文件:application.yml
#端口号server:port: 10010spring:application:name: test-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848 #nacos服务地址gateway:discovery:locator:enabled: true #开启服务注册和发现的功能,自动创建router以服务名开头的请求路径转发到对应的服务
- 编写启动类
@SpringBootApplication@EnableDiscoveryClientpublic class TestGatewayApplication {public static void main(String[] args) {SpringApplication.run(TestGatewayApplication.class, args);}}
1.2.2 测试
http://localhost:10010/service-consumer/feign/echo/abc
http://localhost:10010/service-provider/echo/abc
2.1 routes路由
2.1.2 路由匹配规则
- gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分
组成 | 描述 |
路由 Route | 路由是网关的基本单元, 由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。 |
断言 Predicate | 路由转发的判断条件,目前SpringCloud Gateway支持多种方式, 常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式 |
过滤器 Filter | 过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容 |
- 修改yml文件,添加
routes:- id: consumer#自定义uri: lb://service-consumer#访问路径predicates:#断言- Path=/consumer/**filters:#过滤器- StripPrefix=1
2.2.1 predicates 断言
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件,来进行作为条件匹配到对应的路由。
简单来说, Predicate 就是一组匹配规则,方便请求过来时,匹配到对应的 Route 进行处理。
Spring Cloud GateWay 内置多种 Predicate ,如下:
规则 | 实例 |
---|---|
Path | – Path=/gate/,/rule/ |
Before | – Before=2017-01-20T17:42:47.789-07:00[America/Denver] |
After | – After=2017-01-20T17:42:47.789-07:00[America/Denver] |
Between | – Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | – Cookie=chocolate, ch.p |
Header | – Header=X-Request-Id, \d+ |
Host | – Host=www.hd123.com |
Method | – Method=GET |
Query | – Query=baz |
RemoteAddr | – RemoteAddr=192.168.1.1/24 |
- 实例1:通过请求参数匹配
spring:cloud:gateway:routes:- id: queryuri: http://www.czxy.compredicates:- Query=my,123#访问路径,有参数my将转发到www.czxy.comhttp://localhost:10010/?my=123
- 实例2:通过请求路径匹配
spring:cloud:gateway:routes:- id: pathuri: http://www.czxy.compredicates:- Path=/czxy/{flag}# http://localhost:10010/czxy/666
总结:
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。
一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发
7.3.3 Filter 网关过滤器
路由过滤器允许以某种方式修改传入的HTTP请求或传出HTTP响应。
过滤规则 | 实例 | 说明 |
---|---|---|
PrefixPath | – PrefixPath=/app | 对所有的请求路径添加前缀app |
RedirectTo | – RedirectTo=302, 首页 – 传智专修学院 | 重定向,配置包含重定向的返回码和地址 |
RemoveRequestHeader | – RemoveRequestHeader=X-Request-Foo | 去掉某个请求头信息 |
RemoveResponseHeade | – RemoveResponseHeader=X-Request-Foo | 去掉某个响应头信息 |
RemoveRequestParameter | – RemoveRequestParameter=red | 去掉某个请求参数信息 |
RewritePath | – RewritePath=/where(?/?.), /test(?/?.) | 改写路径 /where/… 改成 /test/… |
SetPath | – SetPath=/{segment} | 设置请求路径,与RewritePath类似 |
SetRequestHeader | – SetRequestHeader=X-Request-Red, Blue | 设置请求头信息 |
SetStatus | – SetStatus=401 | 设置响应状态码 |
StripPrefix | – StripPrefix=2 | 跳过指定路径 |
RequestSize | – name: RequestSize args: maxSize: 5000000 | 请求大小 |
- 实例1:跳过指定路径
spring:cloud:gateway:routes:- id: consumeruri: lb://service-consumerpredicates:- Path=/consumer/** filters:- StripPrefix=1
- 实例2:添加前缀
spring:cloud:gateway:routes:- id: PrefixPathuri: lb://service-consumerpredicates:- Path=/consumer/**filters:- StripPrefix=1- PrefixPath=/feign
- 实例3:改写路径
spring:cloud:gateway:routes:- id: RewritePathuri: lb://service-consumerpredicates:- Path=/consumer/**filters:- RewritePath=/consumer(?/?.*), $\{segment}
到这里说明你已经学会了哦,努力学习!学无止境!!!
想要了解更多吗?没时间解释了,快来点一点!!!
程序员爱摸鱼
————————————————
版权声明:本文为CSDN博主「程序员爱摸鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:程 序 员 爱 摸 鱼