目录
1. gateway作用:
网关的核心功能特性:
- 请求路由
- 权限控制
- 限流、降级、熔断等
2. gateway路由转发 Route
1.yml文件形式
spring:
application:
name: gateway-service
cloud:
gateway:
discovery:
locator:
#是否自动配置路由规则
enabled: false
#是否支持配置小写路由规则
lower-case-service-id: true
routes:
#对“/user/**”的所有请求转发到微服务USER-CLIENT中请求处理
- id: userclient
uri: lb://USER-CLIENT
predicates:
- Path=/user/**
2. java形式
3. gateway断言 Predicates
对于请求参数进行限制:
# 这里只给出了局部配置,其他配置保持不变
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://a.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://b.org
predicates:
- Weight=group1, 2
# 这条路线会将大约80%的流量转发到a.org,将大约20%的流量转发到b.org。
也可以在java bean中配置,见上;
4. gateway过滤器 Filters
1.全局过滤器GlobalFilter
package cn.itcast.gateway.filters;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Order(-1) // 默认 2147483647
@Component
public class AuthorizeFilter implements GlobalFilter,Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.获取authorization参数
String auth = params.getFirst("authorization");
// 3.校验
if ("admin".equals(auth)) {
// 放行, 需要传入上下文
return chain.filter(exchange);
}
// 4.拦截
// 4.1.禁止访问,设置状态码
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
// 4.2.结束处理
return exchange.getResponse().setComplete();
}
@Override public int getOrder() { return 0; }
}
2.局部过滤器GatewayFilter同理;
5. gateway跨域问题globalcors
域名不同或者域名相同,端口号不同,都会产生跨域问题,浏览器不允许发生跨域请求,需要配置;
spring:
application:
name: gateway #服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos地址
gateway:
globalcors:
add-to-simple-url-handler-mapping: true
cors-configurations:
'[/**]': #拦截的请求
allowedOrigins: #允许跨域的请求
- "http://localhost:8080"
allowedMethods: #运行跨域的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" #允许请求中携带的头信息
allowedCredentials: true #是否允许携带cookie
maxAge: 36000 #跨域检测的有效期,单位s
6. gateway限流
底层实现redis的rateLimter限流算法,lua脚本实现
1. 配置限流方式yml
cloud:
gateway:
#redis-rate-limiter: 全局限流配置位置
#开启网关的跨域功能,具体微服务上的跨域需要进行关闭,否则无效
routes:
- id: goods
uri: lb://dabing-goods
predicates:
- Path=/goods/**
filters:
- StripPrefix= 1
# 具体微服务限流位置
- name: RequestRateLimiter #请求数限流 名字不能随便写
args:
key-resolver: "#{@ipKeyResolver}" #指定限流的key
redis-rate-limiter.replenishRate: 1 # 允许每秒处理了多少个请求
redis-rate-limiter.burstCapacity: 1 # 令牌桶的容量(最高处理并发容量大小1)
2.配置限流方式
可以根据ip限流,根据接口限流,也可以根据接口限流,返回keyresolver
@Bean
public KeyResolver ipKeyResolver(){
return new KeyResolver() {
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
};
}
7.常见限流方式:
解决方案:限流算法_keyresolver_穿城大饼的博客-CSDN博客
参考:
1. OpenFeign、GateWay网关_gateway openfeign_Forever Nore的博客-CSDN博客