分布式系统API网关原理及选型
什么是网关?
两个独立的局域网之间通信的桥梁/ 或可以理解为外部所有请求都会打在网关上,网关对请求分发路由等处理,隐藏了内部服务的各种API接口
网关作用及功能
1. 动态路由 根据请求路由到对应的服务上去,如果服务不可用还会有重试机制
2. 负载均衡 多服务器提供同一种服务,网关会从注册中心拉取各服务注册信息,然后将请求负载均衡处理
3. 流量控制 限制流量 避免内部系统受到冲击
4. 统一鉴权 网关对相关权限验证 (请求者的访问权限,还可实现SSO单点登录)
5. 熔断降级 当服务不可用或者访问量过大,网关可以将请求做降级 打到其他服务器或者做其他处理,提示用户暂时不可用
6. 灰度发布 只给少量服务器升级,通过网关将少量的服务打到已升级的服务器用来测试升级的服务器,大量请求还是打在老版本服务器
7. 日志服务 服务访问情况报表,请求吞吐量,并发数,日常告警
常用网关框架
Zuul SringCloud对应的网关
Kong Nginx + Lua 在Nginx运行的Lua应用程序
网关涉及原理
协议转换 : 每个系统使用的协议不同(http,grpc,dubbo协议) 通过网关进行协调统一
链式处理 : 网关处理请求类似责任链模式 经过各个过滤器处理请求
异步请求 : 网关中线程数量有限,每个线程带着请求去访问服务 然后等待服务访问结果返回 这个过程是很浪费时间的,在高并发下无法完成
异步请求 工作线程不必要等待服务返回结果就可以去处理下一个请求,网关的Reactor线程专门负责select轮询 Socket访问结果,一旦发现有结果返回 就通知工作线程来处理返回结果
网管实现动态路由:
动态路由(不必要每次服务地址变动都要重新配置网关重新启动)
原理:
可以在网关数据库建一张表,用来存储不同服务对应的配置信息。然后配置一个前端入口,每次动态的在页面修改配置信息完成数据库修改。
后端网关路由读取这张表完成配置
限流概念
高并发架构三要素: 缓存 + 降级 + 限流
限流的类型:
1.并发量限流, 例如每秒限制100个请求,在一定时间范围内限制和请求频率
2.请求频率限流, 例如来自某个ip/某个用户的请求,限制每秒钟请求不能超过5次
3.上传下载速率, 例如限制某个用户的下载速度最多 100KB/S, 在下载场景下比较常用,比如一些资源下载站会限制普通用户的下载速度,只有购买会员才能提速,这种限流的做法实际上和请求频率限流类似,只不过一个限制的是请求量的多少,一个限制的是请求数据报文的大小。
限流后的处理:被限流的请求会如何响应
1.抛弃,直接抛异常或直接跳转一个友好页面
2.排队,利用消息队列起到消峰和限流作用
3.降级,直接做降级处理,例如商品详情页只返回容易查到的最基础商品数据(兜底数据),复杂数据不再查询直接返回。
限流方式:
1.接入层限流,如Nginx,网关处入口实现请求路由+限流,如果是及网关集群 还需要利用分布式中间件,将请求数量等信息共享
2.池化技术限流,如利用Hystrix的线程池,线程池+等待队列这种形式实现限流
限流算法:
1.固定窗口算法,
2.滑动窗口算法,
3.漏桶算法,
4.令牌桶算法