什么是gateway?
官方文档:Spring Cloud Gateway
Gateway是一种常见的网络架构模式,它充当了传递请求和响应的中间层,位于客户端和服务器之间。Gateway的主要作用是提供高性能、低延迟的请求转发和路由功能,并提供一些额外的功能,如安全性、负载均衡、缓存、限流等。
具体来说,Gateway的功能包括:
-
请求转发和路由:Gateway接收来自客户端的请求,并将其转发到后端的多个服务实例中。可以根据不同的URL、端口、路径等条件进行路由选择,从而实现请求的分发和负载均衡。
-
安全性控制:Gateway可以提供一些安全性控制手段,如身份验证、鉴权、数据加密等,以确保只有经过授权的用户或服务可以访问后端服务。
-
缓存和缓存控制:Gateway可以缓存一些静态资源或重复的请求结果,以减轻后端服务的负载并提高请求的响应速度。同时,Gateway还可以提供缓存控制机制,如设置过期时间、缓存失效策略等。
-
限流和熔断:Gateway可以对请求进行限流和熔断处理,以防止请求过载导致系统崩溃。可以设置请求的最大并发数、QPS限制等来保护后端服务的稳定性和可用性。
-
监控和日志:Gateway通常会记录请求的日志、监控和统计数据,以便进行故障排查、性能优化和资源管理。
总的来说,Gateway提供了一个中心化的入口,使得各个后端服务可以更加简单、高效地提供服务,并能够进行统一的管理和控制。它可以提供更好的性能、安全性和可用性,并具备更好的扩展性和灵活性,适用于大型分布式系统的架构设计。
一、gateway使用
-
添加配置
spring: cloud: gateway: routes: - id: route1 uri: http://example.com # 目标服务的URI predicates: - Path=/path1/** filters: - AddRequestHeader=X-Forwarded-Host, example.com - StripPrefix=1 #转发前去掉第一层路径
二、集成Nacos
-
添加配置
spring: cloud: gateway: routes: - id: route1 uri: lb://order-service # nacos注册服务名 predicates: - Path=/path1/** filters: - AddRequestHeader=X-Forwarded-Host, example.com nacos: discovery: server-addr: 192.x.x.x username: xxx password: xxx
三、断言工厂
-
内置断言工厂
-
After:根据请求的时间进行匹配,比如 After=2022-01-01T00:00:00+08:00[Asia/Shanghai] 表示只有在指定时间之后的请求会匹配该断言。
-
Before:根据请求的时间进行匹配,比如 Before=2022-12-31T23:59:59+08:00[Asia/Shanghai] 表示只有在指定时间之前的请求会匹配该断言。
-
Between:根据请求的时间范围进行匹配,比如 Between=2022-01-01T00:00:00+08:00[Asia/Shanghai], 2022-12-31T23:59:59+08:00[Asia/Shanghai] 表示只有在指定时间范围内的请求会匹配该断言。
-
Cookie:根据请求的Cookie进行匹配,比如 Cookie=SESSIONID, ABC123 表示只有包含名为 SESSIONID 的Cookie且其值为 ABC123 的请求会匹配该断言。
-
Header:根据请求头进行匹配,比如 Header=Content-Type, application/json 表示只有请求头中包含 Content-Type 并且其值为 application/json 的请求会匹配该断言。
-
Host:根据请求的主机名进行匹配,比如 Host=example.com 表示只有请求的主机是 example.com 才会匹配该断言。
-
Method:根据请求方法进行匹配,比如 Method=GET 表示只有GET请求会匹配该断言。
-
Path:根据请求路径进行匹配,比如 Path=/path1/** 表示请求路径以 /path1/ 开头的请求会匹配该断言。
-
Query:根据请求的查询参数进行匹配,比如 Query=foo=bar 表示只有查询参数中有 foo=bar 的请求会匹配该断言。
-
RemoteAddr:根据请求的远程地址进行匹配,比如 RemoteAddr=192.168.1.1/24 表示只有来自IP地址为 192.168.1.1 的请求会匹配该断言。
-
-
自定义断言工厂
-
创建一个实现GatewayPredicateFactory接口的自定义断言工厂类。例如:
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; @Component public class CustomPredicateFactory extends AbstractRoutePredicateFactory<CustomPredicateFactory.Config> { public CustomPredicateFactory() { super(Config.class); } @Override public GatewayPredicate apply(Config config) { return (exchange) -> { // 在这里编写自定义的匹配逻辑 // 返回true表示断言匹配成功,返回false表示断言匹配失败 }; } public static class Config { // 这里可以定义一些配置参数 } }
-
在自定义断言工厂类上添加@Component注解,将其作为Spring Bean进行注册。
-
在网关的配置文件(如application.yml)中使用自定义的断言工厂,例如:
spring: cloud: gateway: routes: - id: route1 uri: http://example.com predicates: - Custom=foo
在上述配置中,Custom是自定义断言工厂类的名称,foo是断言工厂的配置参数。
-
四、过滤器
-
AddRequestHeader过滤器:添加请求头。
filters: - AddRequestHeader=X-Request-Id, 123
-
AddResponseHeader过滤器:添加响应头。
filters: - AddResponseHeader=X-Response-Foo, Bar
-
RewritePath过滤器:重写路径。可以根据正则表达式将请求路径进行重写。
filters: - RewritePath=/foo/(?<segment>.*), /$\\{segment}
-
SetPath过滤器:设置请求路径。
filters: - SetPath=/new-path
-
SetRequestHeader过滤器:设置请求头的值。
filters: - SetRequestHeader=X-Foo, Bar
-
SetResponseHeader过滤器:设置响应头的值。
filters: - SetResponseHeader=X-Response-Foo, Bar
-
Retry过滤器:实现请求重试机制。
filters: - name: Retry args: retries: 3 statuses: BAD_GATEWAY
五、相关配置
-
日志配置
-
跨域配置
spring: cloud: gateway: globalcors: cors-configurations: '[/**]': allowedOrigins: "https://docs.spring.io" allowedMethods: - GET
六、整合sentine
-
添加依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>
-
添加配置
spring: cloud: sentinel: transport: dashboard: localhost:8080