SpringCloud Gateway是什么?优缺点分析

springCloud Gateway优点

springCloud Gateway缺点

编写SpringCloundGateway

pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
server:
port: 8040
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
# 让gateway通过服务发现组件找到其他的微服务
enabled: true
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
logging:
level:
org.springframework.cloud.gateway: trace

核心概念

路由配置示例

架构剖析

路由谓词工厂详解

路由谓词工厂的作用是:符合Predicate的条件,就使用该路由的配置,否则就不管。

路由谓词工厂详解

自定义路由谓词工厂

TimeBetweenRoutePredicateFactory
@Component
public class TimeBetweenRoutePredicateFactory
extends AbstractRoutePredicateFactory<TimeBeweenConfig> {
public TimeBetweenRoutePredicateFactory() {
super(TimeBeweenConfig.class);
} @Override
public Predicate<ServerWebExchange> apply(TimeBeweenConfig config) {
LocalTime start = config.getStart();
LocalTime end = config.getEnd();
return exchange -> {
LocalTime now = LocalTime.now();
return now.isAfter(start) && now.isBefore(end);
};
} @Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("start", "end");
} public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
System.out.println(formatter.format(LocalTime.now()));
}
}
TimeBeweenConfig
@Data
public class TimeBeweenConfig {
private LocalTime start;
private LocalTime end;
}
application.yml

内置过滤器工厂详解

过滤器工厂详解

示例

自定义过滤器工厂

过滤器生命周期

自定义过滤器工厂方式01

自定义过滤器工厂方式02

自定义过滤器工厂核心API

编写代码 PreLogGatewayFilterFactory
@Slf4j
@Component
public class PreLogGatewayFilterFactory
extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return ((exchange, chain) -> {
log.info("请求进来了...{},{}", config.getName(), config.getValue());
ServerHttpRequest modifiedRequest = exchange.getRequest()
.mutate()
.build();
ServerWebExchange modifiedExchange = exchange.mutate()
.request(modifiedRequest)
.build(); return chain.filter(modifiedExchange);
});
}
}

全局过滤器

Spring Cloud Gateway-全局过滤器

示例代码
@Bean
@Order(-1)
public GlobalFilter a() {
return (exchange, chain) -> {
log.info("first pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("third post filter");
}));
};
} @Bean
@Order(0)
public GlobalFilter b() {
return (exchange, chain) -> {
log.info("second pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("second post filter");
}));
};
} @Bean
@Order(1)
public GlobalFilter c() {
return (exchange, chain) -> {
log.info("third pre filter");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("first post filter");
}));
};
}

监控Spring Cloud Gateway

Spring Cloud Gateway监控

排错,调试技巧总结

Spring Cloud Gateway排错、调试技巧总结

第一式:Actuator监控端点
借助Actuator的监控端点,可分析全局过滤器、过滤器工厂、路由详情。详见:Spring Cloud Gateway监控 第二式:日志
加日志,按需将如下包的日志级别设置成 debug 或 trace ,总有一款对你有用。 org.springframework.cloud.gateway
org.springframework.http.server.reactive
org.springframework.web.reactive
org.springframework.boot.autoconfigure.web
reactor.netty
redisratelimiter
配置示例: logging:
level:
org.springframework.cloud.gateway: trace 第三式:Wiretap【从Greenwich SR3及更高版本才会支持】
Reactor Netty HttpClient 以及 HttpServer 可启用 Wiretap 。将reactor.netty 包设置成 debug 或 trace ,然后设置如下属性: spring.cloud.gateway.httpserver.wiretap=true
spring.cloud.gateway.httpclient.wiretap=true
分别开启HttpServer及HttpClient的Wiretap。 然后,就可以分析日志啦。

过滤器的执行顺序

SpringCloudGateway限流

Spring Cloud Gateway限流详解

本章总结

最新文章

  1. UVALive - 4513 Stammering Aliens ——(hash+二分 || 后缀数组加二分)
  2. hadoop2.6源码导入mvn出错Missing tools.jar问题解决方案
  3. 转换primitive主数据类型
  4. JS几种数组遍历方式以及性能分析对比
  5. Mysql-学习笔记(==》插入修改数据二)
  6. PHP 防范xss攻击
  7. 压力测试之TCPP
  8. 机器学习基石的泛化理论及VC维部分整理(第五讲)
  9. linux主要目录的作用
  10. [Locked] Binary Tree Upside Down
  11. 【IOS实例小计】图像移动--可扩展为动态实现图标变化
  12. mac双系统用磁盘工具合并windows分区后,开机还会 出现win分区
  13. TPshop之短信注册配置(阿里云)
  14. mysql 下 计算 两点 经纬度 之间的距离(转)
  15. react 动态修改 document.title
  16. [Converge] Training Neural Networks
  17. jquery 进阶 bootstrap
  18. Ajax(javascript)案例
  19. ionic获取ios唯一设备id的解决方案
  20. Mysql中使用Group_Concat将列组合进来。

热门文章

  1. kubernetes concepts -- Pod Lifecycle
  2. 在Navicat新建Oracle表及用户
  3. Centos7安装 Anaconda + jupyter notebook
  4. markdown时序图语法
  5. 使用springboot Admin 2.0.6版本 集成监控springcloud微服务应用
  6. hadoop-2.10.0安装hive-2.3.6
  7. mac如何用quick look预览多个文件或者图片
  8. Codeforces Round #618 (Div. 2)
  9. kubernetes容器端口设置的坑
  10. 练习2-14 求奇数分之一序列前N项和 (15 分)