第九章 Springcloud Getway学习笔记
一、概念介绍
******1、**SpringCloud Gateway简介
作为Spring Cloud最新推出的创新项目之一,在这一版本中它采用了全新的架构设计,在构建网络功能方面展现出显著优势。该网关系统整合了包括Spring 5.0、Spring Boot 2.0以及Project Reactor在内的多项先进技术和组件,并非简单的功能堆砌而是经过精心设计以实现高效可靠地处理网络请求的目的。其主要目标是通过标准化且高效的API路由管理系统来优化微服务架构下的网络流量,并在保证性能的同时简化复杂性确保系统的可维护性和扩展性得到提升。
SpringCloud Gateway被视为Spring Cloud生态系统中的关键节点,在这一架构中旨在取代Zuul系统。具体而言,在当前及后续发布版本中,默认情况下并未对最新的Zuul 2.0及以上性能优化版本进行集成配置。因此继续采用的是较为老旧的非Reactor模式运行状态。然而为了进一步提升整体性能水平,则采用了基于WebFlux框架的实现方案,并依赖Netty这一高性能通信框架作为其底层支撑。
Spring Cloud Gateway的目标不仅实现了统一路由,并且通过Filter链实现了网关的基本功能。例如安全、监控与指标收集以及限流处理。
提前声明:
Spring Cloud Gateway 底层使用了高性能的通信框架Netty。
Spring Cloud Gateway relies on the Netty runtime provided by Spring Boot and Spring Webflux. It cannot function in a traditional Servlet Container or when deployed as a WAR.

二、路由规则配置:
1、 Route Predicate Factories
- 后续路由谓词工厂
- 前向路由谓词工厂
- 中间路由谓词工厂
- 饼干路由谓词工厂
- 头部路由谓词工厂
- 主机路由谓词工厂
- 方法路由谓词 factories
- 路径 routing predicate 工厂
- 查询 query routing predicate 工厂
- 远程地址 remote_addr routing predicate 工厂
- 重量 weight routing predicate 工厂
2、新建测试模块springcloud-getway
2.1、添加pom依赖
1.2、添加配置application.yml
这里我们先以Before、After****、**** Between三种作配置为例:
- Between=2020-05-11T23:35:47.789+08:00,2022-05-07T19:52:47.789+08:00
- After=2020-02-11T20:35:47.789+08:00
- Before=2020-05-20T23:35:47.789+08:00
网关配置
Spring Cloud Gateway-路由谓词工厂详解(Route Predicate Factories)
参考文章: http://www.imooc.com/article/290804
1.3、启动类代码:
@SpringBootApplication
在开发工具注解的作用域内定义名为GatwayApplication的类{
公共 static void main(字符串数组 args){
SpringApplication.run(GatwayApplication.class, args);
}
}
@Bean
实例化一个KeyResolver对象作为名为userKeyResolver的方法返回{
覆盖现有的接口实现{
公共 Mono
HttpCookie httpCookie设为 null;
ServerHttpServletRequest request 设为交换请求;
MultiValueMap<String, HttpCookie> cookies设为请求中的cookies集合;
遍历 cookie集合中的每一个条目{
如果当前条目中的键值等于字符串“c”,则将该条目对应的 cookie的第一个对象赋给httpCookie;
}
返回取出指定 cookie的内容并返回其值;
}
}
}
1.4、路由全局配置
/**
- 全局路由配置(特别说明:在配置文件中无需配置 routes: - id: test_after_route 等其他相关参数)
*/
public class ShadowGlobaFilter implements GlobalFilter {
@Override
public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, HttpCookie> cookies = request.getCookies();
for (String s : cookies.keySet()) {
if(s.equals("x")){
// 当cookie包含x时进行过滤处理
System.out.println("----------------------");
return chain.filter(exchange);
}
// 当 cookie 中没有x时将返回未授权状态
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
}
3、其他路由配置
Getway到服务之间实现了一个负载均衡分配,并建议我们设置一个集群负载以便进行测试。
配置代码如下:
可以通过配置uri: lb://register-server # 集群可以实现负载均衡
server:
port: 8000
spring:
application:
name: springcloud-getway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway: # 网关配置
__ routes:
- id: test_after_route
uri: http://localhost:8002
predicates: # 断言,如果时间在范围内则访问uri配置地址
__ - Between=2020-05-11T23:35:47.789+08:00,2022-05-07T19:52:47.789+08:00
- After=2020-02-11T20:35:47.789+08:00
- Before=2020-05-20T23:35:47.789+08:00
__ - id: path_route
uri: http://localhost:8081
predicates:
- Path=/provider/{segment} # 如果路劲以/provider开始,则访问springcloudalibaba-provider-user:8081/provider
__ - id: path_route_1
uri: http://localhost:8082
predicates:
- Path=/consumer/{segment} # 如果路劲以/consumer开始,则访问springcloudalibaba-consumer:8082/consumer/{segment}
__ - id: test_query_route
uri: lb://register-server # 集群可以实现负载均衡
____ predicates:
- Query=shadow #
__ filters: # 前置条件是断言predicates条件成立
__ - Av=true
添加Cookie设置方式如下所示:

更多配置详情参考官网文档:
参考文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/
其他参考博客:
该文阐述了基于改进K-Means算法的应用场景与图像分割方案,并对该算法进行了有效性测试。
