spring cloud gateway
1、服务路由
基本格式
id
uri: lb:service + http + ws
predicate
filter
StripPrefix
/name/bar/foo的请求会被转发为http://nameserviceip:nameserviceport/bar/foo
predicate
如果有很多个Predicate,并且一个请求满足多个Predicate,则按照配置的顺序第一个生效。
指定时间路由 AfterRouterPredicate,BeforeRouterPredicate
HeaderRouterPredicate KV模式,之后匹配才可以
MethodRouterPredicate 按GET/POST路由
PathRouterPredicate 按指定路径路由
2、鉴权
appId+appKey
filter
类型
pre过滤器
鉴权、参数校验、IP限制
post过滤器
数据处理
数据加密
统一异常处理
范围
GatewayFilter
AddRequestHeader
AddRequestParameter
prefixPathGatewayFilter 添加前缀路由
GlobalGatewayFilter
自定义Filter
实现GatewayFilter Ordered
Order值越大则优先级越低
3、数据处理?
统一异常处理
实现ErrorWebExceptionHandler
重写handle方法
加密返回结果
自定义过滤器
id:1 uri:lb:order-service predicate: path:/api stringPrefix:1 filter:n900filter
对称加密
使用相同的密码进行数据加解密
非对称加密
数据传输
1)生成公钥私密密码对
2)公钥加密,传递信息
3)私钥解密获取数据
数字签名
证明这消息是你发的
证明这消息内容确实是完整的,没有经过任何形式的篡改
私钥签名,公钥验签
4、负载均衡
ribbon
5、熔断、降级
会有大量的请求进入网关,向其他服务发起调用,其他服务不可避免的会出现调用失败(超时、异常),失败时不能让请求堆积在网关上,需要快速失败并返回给客户端
hystrix
默认超时时间 1s
# hystrix 信号量隔离,3秒后自动超时
hystrix.command.default.execution.isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 3000
自定义熔断
Filters:
-name: hystrix
-args:
-name:myHystrix
-callbackuri: forward:/myCallback
新建controller @RequestMapper("/myCallback")
6、限流
filter名称必须是RequestRateLimiter
redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求
redis-rate-limiter.burstCapacity:令牌桶的容量,允许在一秒钟内完成的最大请求数
key-resolver:使用SpEL按名称引用bean
filters:
- name: RequestRateLimiter
args:
key-resolver: '#{@hostAddrKeyResolver}'
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 3
@Configuration
class HostAddrKeyResolver
@Bean
public KeyResolver userKeyResolver() {}
通过IP限制 exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
通过appkey限制
exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("appKey"));
通过uri限制
exchange -> Mono.just(exchange.getRequest().getPath().value());
限流算法
令牌桶
系统会按恒定 1/QPS 时间间隔往桶里加入 Token,如果桶已经满了就不再加了。新请求来临时,会各自拿走一个 Token,如果没有 Token 可拿了就阻塞或者拒绝服务。
计数器
维护一个单位时间内的 计数器,每次请求计数器加1,当单位时间内计数器累加到大于设定的阈值,则之后的请求都被拒绝,直到单位时间已经过去,再将 计数器 重置为零
漏桶算法
请求先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求
7、和zuul对比
Zuul 基于 Servlet 2.5(使用 3.x),使用阻塞 API,本质上就是一个同步 Servlet,采用多线程阻塞模型。 它不支持任何长连接,如 Websockets。
Gateway 采用了 Netty 实现异步非阻塞编程模型。异步非阻塞模式启动的线程很少,基本上一个 CPU 上只需一个 EventLoop 处理线程,它使用的线程资源就很少,上下文切换(Context Switch)开销也少。
8、灰度发布
WeightRoutePredicateFactory去实现根据分组设置权重进行路由
filters:
- StripPrefix=1
- Weight=order-service, 95
原图地址:http://naotu.baidu.com/file/5d850f1f5e99f2effca231ccaa753c4e?token=84d5c40fc783e372
提取码:ZFLc