11. 分布式组件-SpringCloud-Gateway网关
SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。SpringCloud Gateway 作为 Spring Cloud 生态系统中
SpringCloud Gateway 简介
SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul。为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,如:安全,监控/指标,和限流。
工作原理
下图从总体上概述了Spring Cloud Gateway的工作方式:
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
配置路由
gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分:路由,断言,过滤器
Route(路由) | 路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发 |
---|---|
Predicate(断言) | 路由转发的判断条件,目前SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等,写法必须遵循 key=vlue的形式 |
Filter(过滤器) | 过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容 |
断言(predicates)
规则 | 实例 | 描述 |
---|---|---|
Path | - Path=/red/{segment},/blue/{segment} | 如果请求路径为,则此路由匹配,例如:/red/1或/blue/1。 |
Before | - Before=2017-01-20T17:42:47.789-07:00[America/Denver] | 在2017年1月20日17:42之前的请求才会被转发 |
After | - After=2017-01-20T17:42:47.789-07:00[America/Denver] | 在2017年1月20日17:42之后的请求才会被转发 |
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 | 匹配具有名称为chocolate与ch.p正则表达式匹配的cookie的请求 |
Header | - Header=X-Request-Id, \d+ | 匹配名为X-Request-Id其值与\d+正则表达式匹配的请求头(即,其值为一个或多个数字) |
Host | - Host=www.gulimall.com | 匹配主机名为www.gulimall.com的请求 |
Method | - Method=GET | 只有GET方法才会匹配转发请求,还可以限定POST、PUT等请求方式 |
Query | - Query=color, gree. | 匹配请求参数名为color, 值符合正则表达式gree. ,如green和greet |
RemoteAddr | - RemoteAddr=192.168.1.1/24 | 如果请求的远程地址是192.168.1.10,则此路由将匹配。 |
Weight | 配置如下 | 将80%的流量转发到weighthigh.org,将20%的流量转发到weightlow.org |
application.yml
#断言Weight例子
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2
过滤器(filters)
列出部分:更多可参考官网
规则 | 实例 | 描述 |
---|---|---|
AddRequestHeader | - AddRequestHeader=X-Request-Foo, Bar | 添加请求头X-Request-Foo:Bar |
AddResponseHeader | - AddResponseHeader=X-Response-Red, Blue | 添加响应头X-Response-Red:Blue |
AddRequestParameter | - AddRequestParameter=foo, bar | 请求添加foo=bar的查询字符串 |
PrefixPath | - PrefixPath=/mypath | 为所有匹配请求的路径加上/mypath前缀 |
RedirectTo | - RedirectTo=302, https://acme.org | 重定向 |
SetPath | SetPath=/app/{path} | 通过模板设置路径,转发的规则时会在路径前增加app,{path}表示原请求路径 |
application.yml
#对于的请求路径/red/blue,这会将路径设置为/blue
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
- SetPath=/{segment}
新建工程:gulimall-gateway
引入gateway
统一配置跨域请求
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowed-origins: "*"
allowed-headers: "*"
allow-credentials: true
allowed-methods:
- GET
- POST
- DELETE
- PUT
- OPTION
整合Nacos
映入创建好的common工程
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
启动类
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) //排除数据源的包
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
Nacos注册中心application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
Nacos配置中心bootstrap.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
更多推荐
所有评论(0)