gateway学习笔记
目录
0 环境
- 操作系统:win10
- 编辑器:idea
- springcloud版本:H版
1 简介
Spring Cloud Gateway使用的是Spring Boot和Spring Webflux提供的Netty底层环境,不能和传统的Servlet容器一起使用,也不能打包成一个WAR包。
- 特点
- 路径重写
- 动态路由
- 限流
- 集成springcloud DiscoveryClient
- 集成hystrix断路器
- 对比
- gateway是spring家族的 可以与spring家族的其他组件无缝融合
- zuul不支持长连接(websocket)
- gateway占用资源资源更新且性能强于zuul(异步+非阻塞)
- 限流
2 概念
- 概念了解
- Route --> 网关的基础元素(组成 ---> ID + URI + 断言 + 过滤器) 一个请求到达网关了 由gateway Handler Mapping通过断言进行路由匹配(mapping) 当断言为真 匹配路由(场景: 下班了 我走到了大门口 我奔着某某栋方向走去 但保安手拿温度枪 气势汹汹的拦住了我(断言) 测了一下温度 看了一下通行证 戴口罩的 确定你没毛病 进去吧 就这样回到某栋某室)
- predicate
- java8中函数 匹配HTTP请求(匹配条件)
- filter
- 在请求发送前/后进行一些业务处理
3 gateway基本用法
3.1 创建springboot项目(gateway)

3.2 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.3 yml配置
我们访问目标地址http://httpbin.org

spring:
cloud:
gateway:
routes:
- id: hi
uri: http://httpbin.org
predicates:
- Path=/get
-不建议properties这样配置(繁琐)

3.4 启动类配置bean
和yml配置效果是一样的()
/* @Bean
RouteLocator routeLocator(RouteLocatorBuilder builder){
// 可以添加多个
return builder.routes()
// 访问网址 http://httpbin.org/get
// 通过网关后访问 http://localhost:8080/get
.route("hi", r -> r.path("/get").uri("http://httpbin.org"))
.build();
}*/
3.5 启动gateway

4 结合微服务
还是延用以前的eureka server和provider以及gateway
后面说启用就是这三个启动类的启动/重启
4.1 yml配置
spring:
cloud:
gateway:
discovery:
locator:
# 开启自动代理
enabled: true
# 服务id为true --> 这样小写服务就可访问了
#lower-case-service-id: true
application:
name: gateway
eureka:
client:
service-url:
# defaultZone: http://localhost:1234/eureka
defaultZone: http://localhost:8761/eureka
#日志
logging:
level:
org.springframework.cloud.gateway:
debug
4.2 启用
- 访问 http://localhost:8080/provider/hello


 - 小写服务

#启用它设为true即可 lower-case-service-id: true
spring: cloud: gateway: discovery: locator: # 开启自动代理 enabled: true # 服务id为true --> 这样小写服务就可访问了 lower-case-service-id: true application: name: gateway eureka: client: service-url: # defaultZone: http://localhost:1234/eureka defaultZone: http://localhost:8761/eureka #日志 logging: level: org.springframework.cloud.gateway: debug
- 重启eureka server和consumer以及gateway
 - 这时访问大写服务会报错

4 断言
4.1 时间断言
- Before --> 请求时间在某个时间点之前 才会被路由
- After --> 请求时间在某个时间点之后 才会被路由
- Between --> 请求时间在2个时间点之间(两个时间点,分开)
spring:
cloud:
gateway:
routes:
- id: before_route
uri: http://www.baidu.com
# 时间断言
predicates:
- Before=2020-03-31T08:38:47+08:00

若是改为Before=2020-03-24T08:38:47+08:00

4.2 路径断言
一开始的path=get也是 就不在重复添加
spring:
cloud:
gateway:
routes:
# 路径断言 访问指定地址http://www.w3school.com.cn/tcpip/*
# 也就是localhost:8080/tcpip/*
- id: w3c_route
uri: http://www.w3school.com.cn
predicates:
- Path=/tcpip/{segment}
- 访问成功
 - 非该路径 访问失败

4.3 query断言
spring:
cloud:
gateway:
routes:
# 默认参数
- id: query_route
uri: http://httpbin.org
predicates:
# 可以指定参数和值 ?name=1开头的值 才允许访问
- Query=name,1.*
- 未加参数
 - 加参数1开头 成功

 - 加参数2开头 失败

4.4 Method断言
- yml配置
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://httpbin.org
# 该网站post请求405 --> 没有post 只能用get测试 用post测试get请求404就对了
predicates:
- Method=GET
- post请求时 404(若是post方法 405说明该网站没有post请求) 成功的截图就是一开始的那张不在粘贴了

4.5 断言组合使用
spring:
cloud:
gateway:
routes:
# 组合使用
- id: many_route
uri: http://httpbin.org
predicates:
# 可以指定参数和值 ?name=1开头的值
- Query=name,1.*
- Method=GET
- After=2020-03-01T08:38:47+08:00

4.6 自定义路由断言
- 配置自定义断言工厂
// 自定义路由断言工厂
// 命名需要以RoutePredicateFactory结尾 比aRoutePredicateFactory 那么yml在使用时a就是断言工厂的名字
@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.User> {
public CheckAuthRoutePredicateFactory() {
super(User.class);
}
// 自定义配置类
@Override
public Predicate<ServerWebExchange> apply(User config) {
return exchange -> {
System.out.println("进入apply:" + config.getName());
if (config.getName().equals("kitty")){
return true;
}
return false;
};
}
public static class User{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
- yml配置
spring:
cloud:
gateway:
routes:
# 自定义断言工厂 -name就是之前以xxxRoutePredicateFactory的xxxx为断言工厂名
- id: customer_route
uri: http://httpbin.org
predicates:
- name: CheckAuth
args:
name: kitty
- 当参数name=kitty与自定义断言工厂的getName一致时
 - 当参数name=kitty与自定义断言工厂的getName不一致时

5 过滤器
gateway过滤器分类
- GlobalFilter
- GatewayFilter
5.1 AddRequestParameter过滤器
在请求添加时 自动添加额外参数

6 小结
- 基本配置 启动类bean或是在yml中配置routes xxx
- 学习了服务整合时 eureka server和provider以及gateway 依赖的添加 yml配置 连接服务 开启自动代理以及访问时服务大小写的设置 日志的设置
- 断言的学习
- path断言 --> url匹配
- query断言 --> 参数匹配(自定义参数过滤规则) 类似?name=xxx
- method断言 --> 匹配HTTP的方法
- 时间断言 --> 之前/之后/之间
- 组合断言 --> 之前的这些断言有机的组合
- 自定义断言 --> 需要继承extends AbstractRoutePredicateFactory 在yml配置自定义工厂进行匹配
- 过滤器的学习 中的AddRequestParameter 添加额外的参数
作者:以罗伊
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。