目录
一、网关的作用
二、运行工作原理
三、Gateway 与 Zuul
四、相关概念(Glossary)
五、开始项目
5.1.项目基础接口和版本依赖
5.2.建立配置文件application.yml
5.3.引入依赖
5.4.创建启动类
5.5.创建测试controller并启动项目运行基础项目
六、配置路由断言工厂和过滤器工厂
6.1.快捷方式(Shortcut Configuration)常用
6.2.展开方式(Fully Expanded Arguments)
6.3.启动网关服务和启动服务提供者和服务消费者服务
七、路由断言工厂(Route Predicate Factories)
7.1.后路由谓词工厂(The After Route Predicate Factory)
7.2.前路由谓词工厂 (The Before Route Predicate Factory)
7.3.除了上面的例子外,还有很多类似的配置,下面主要有以下这些配置
本文是参考Spring Cloud Gateway3.1.4来写的,其提供在Spring WebFlux之上构建API网关的库。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到api,并向它们提供横切关注点,例如:安全性、监视/度量和弹性
This project provides a library for building an API Gateway on top of Spring WebFlux. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.
客户端向 Spring Cloud Gateway 发起请求。如果网关处理程序映射确定一个请求与路由匹配,它就被发送到网关Web端处理程序。该处理程序通过特定于请求的筛选链运行请求。用虚线分隔过滤器的原因是,过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“pre”过滤器逻辑。然后发出代理请求。在发出代理请求之后,将运行“post”过滤器逻辑。
注:在没有端口的路由中定义的uri对于HTTP和HTTPS uri分别获得默认端口值80和443。
Gateway
与 Zuul
Gateway
是 SpringCloud
微服务平台的一个子项目,属于 Spring
开源社区,依赖名叫:spring-cloud-starter-gateway
Zuul
是 Netflix
公司的开源项目,SpringCloud
在 Netflix
项目中也已经集成了 zuul
,依赖名叫:spring-cloud-starter-netflix-zuul
SpringCloud Gateway
基于 Spring 5、projec treactor、springboot 2,
使用非阻塞式的 API
,内置限流过滤器,支持长连接(比如 websockets
),在高并发和后端服务响应慢的场景下比 zuul
的表现要好Zuul
基于 servlet2.x
构建,使用阻塞的 API
,没有内置限流过滤器,不支持长连接ID
,一个目标 URI
,一组断言和一组过滤器定义。如果断言为真,则路由匹配.网关的基本构建块。它由一个ID、一个目标URI、一组predicates和一组filters定义。如果聚合predicate 为真,则匹配路由。spring boot版本>2.6.11,spring-cloud版本2021.0.4,spring-cloud-starter-gateway版本3.1.4
org.springframework.cloud
spring-cloud-starter-gateway
/**
* Author:Created by @xietao on 2022-09-30-10-51
* Motto:I am a slow walker, but I never walk backwards
*/
@Slf4j
@SpringBootApplication
public class SpiderGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(SpiderGatewayApplication.class, args);
log.info("------------------ @SpiderGatewayApplication启动成功@ ------------------");
}
}
@Slf4j
@RestController
public class TestController {
@RequestMapping("/test")
public String test1(){
return "你好,欢迎来到 我的世界!";
}
}
至此springboot+spring cloud的相关依赖的项目构建完成,下面就开始网关的学习
有两种配置方式:快捷方式和展开配置的方式,很多例子用的是快捷方式,下面就介绍下这两种配置方式
通过过滤器名称识别快捷配置,后面是等号(=),后面是用逗号分隔的参数值
application.yml(网关服务配置)
server:
port: 5000
spring:
cloud:
gateway:
routes:
- id: after_route
#配置要路由到的跳转地址
uri: http://localhost:8001
predicates:
- Path=/spi/consumer/**
- id: after_route
#配置要路由到的跳转地址
uri: http://localhost:8002
predicates:
- Path=/spi/provider/**
示例用两个参数定义了Path断言,当请求地址匹配是惠路由到uri的实际地址
完全展开的参数看起来更像具有名称/值对的标准yaml配置。通常,会有一个name键和一个args键。args键是键值对的映射,用于配置断言或过滤器
application.yml
server:
port: 5000
spring:
cloud:
gateway:
routes:
- id: after_route
#配置要路由到的跳转地址
uri: http://localhost:8001
predicates:
# - Path=/spi/consumer/**
- name: Path
args: /spi/provider/**
- id: after_route
#配置要路由到的跳转地址
uri: http://localhost:8002
predicates:
# - Path=/spi/provider/**
- name: Path
args: /spi/provider/**
这是上面显示的Path断言的快捷配置的完整配置
访问地址:
http://localhost:5000/spi/consumer/testLog
同理访问服务提供者也是一样可以通过网关来进行访问
Spring cloud gateway 作为Spring WebFlux HandlerMapping基础设施的一部分来匹配路由。Spring cloud gateway包括许多内置的路由断言工厂。所有这些断言都与HTTP请求的不同属性相匹配。可以使用逻辑和语句组合多个路由断言工厂
Spring Cloud Gateway matches routes as part of the Spring WebFlux
HandlerMapping
infrastructure. Spring Cloud Gateway includes many built-in route predicate factories. All of these predicates match on different attributes of the HTTP request. You can combine multiple route predicate factories with logicaland
statements.
After路由断言工厂接受一个参数,即datetime(这是java的ZonedDateTime)。此断言匹配发生在指定datetime之后的请求。下面的示例配置一个after路由谓词
application.yml(网关改造)
完整代码
server:
port: 5000
spring:
cloud:
gateway:
routes:
- id: after_route_consumer
#配置要路由到的跳转地址
uri: http://localhost:8001
predicates:
- Path=/spi/consumer/**
- After=2022-10-04T17:40:00.309+08:00[Asia/Shanghai]
- id: after_route_provider
#配置要路由到的跳转地址
uri: http://localhost:8002
predicates:
- Path=/spi/provider/**
此路线匹配2022年10月04日17:40之后的任何请求,在这个时间前通过网关访问报404
在当前时间大于设置时间17:40访问
Before路由断言工厂有一个参数,一个datetime(这是一个java的ZonedDateTime)。此断言匹配发生在指定datetime之前的请求。下面的示例配置before路由谓词
application.yml(网关改造)
server:
port: 5000
spring:
cloud:
gateway:
routes:
- id: after_route_consumer
#配置要路由到的跳转地址
uri: http://localhost:8001
predicates:
- Path=/spi/consumer/**
# - After=2022-10-04T17:40:00.309+08:00[Asia/Shanghai]
- Before=2022-10-04T17:50:00.309+08:00[Asia/Shanghai]
- id: after_route_provider
#配置要路由到的跳转地址
uri: http://localhost:8002
predicates:
- Path=/spi/provider/**
上面配置完毕后,重启网关服务当前时间小于17:60前都能访问到服务消费者,但是当当前时间大于17:50时访问就会报404,和After配置相反。
报头路由断言工厂(The Header Route Predicate Factory)
主机路由断言工厂(The Host Route Predicate Factory)
方法路由断言工厂(The Method Route Predicate Factory)
*路径路由谓词工厂(The Path Route Predicate Factory)
查询路由断言工厂(The Query Route Predicate Factory)
RemoteAddr路由断言工厂(The RemoteAddr Route Predicate Factory)
修改远端地址的解析方式( Modifying the Way Remote Addresses Are Resolved)
权重路由断言工厂(The Weight Route Predicate Factory)
xforwarding远程地址路由断言工厂(The XForwarded Remote Addr Route Predicate Factory)
具体文档内容,请根据需要参考:Spring Cloud Gateway
Spring Cloud Gateway 初识网关第1篇,这只是入门篇,资料完全来自于官网,接下来Spring Cloud Gateway 初识网关第2篇将对网关的过滤器进行进一步的讲解(多看官网的文档,以其他人翻译为辅助,提升自我读原始文档的能力)本文相关代码:spider-lab: java相关资料代码(基础、微服务、硬件等)