我们需要设计一个分布式网关,具体要击破哪些问题?
首先我们要提取几个关键字:高性能分布式、鉴权能力、路由能力、简单的反作弊
对应的方案 :无状态设计、过滤器责任链、反作弊设计、路由方案设计
整体架构:

基于Springboot的webserver
网关属于高并发模块,做到简单逻辑,业务逻辑要剥离到业务层
高性能:缓存设计、异步线程设计
击破一:跨域问题
CORS解决跨域问题
击破二:Session
Session绑定:将uid hash到固定的节点

对节点进行冗余设计,做到高可用。
但这样会把简单的问题复杂化!!!!!
session复制:

每台机器存储了全量的session,做到了高可用。
但集群之间的同步复制比较复杂,数据存储不合理,内存开销比较大。
Session共享:

使用redis,统一存储session。
网关层无状态,缓存服务本身高可用。
但是多一次的服务调用IO
Session客户端缓存:

简单、高性能且接入层无状态
但是问题是依赖客户端Cookie存储。
session算法:

session包含的信息字段,和各个公司的业务有关:deviceId,clientType、uid、ts
AES加密算法:加密过程在服务端。
击破三:反作弊
针对恶意流量,从网关层面进行拦截,防止对后端服务造成高并发压力。
为了防止误伤,对于黑名单数据定期释放能力。
网关层面的反作弊:

包括业务维度层面的爬虫、恶意攻击。
技术解决方案:黑名单 IP、deviceId、uid
特点是读多写少,命中率低。
架构设计:
| 类目 |
现状 |
| 业务初级阶段 | 数据量比较小 |
| 高可用设计 | 进程内缓存 |
| 黑名单固化 | KV存储、失效管理 |
击破四:路由
首先我们要知道路由需要有哪些需求?
RPC over TCP
入参传递:HTTP---->Object
服务发现
负载均衡
熔断降级
架构设计原则:
1.约定大于配置
2.功能简单
3.使用够方便

协议约定:网关和前端协议JSON,网关层RPC调用入参统一Map<String,String>,数据返回统一Result对象{code,data,msg}
负载均衡和服务发现:RPC框架实现(这边的RPC主要是通过java反射来实现,今天就不发散了!!!)
熔断设计: Hystrix
这是V1.0的版本,有如下毛病:启动耗时比较大,业务升级需要重启,耦合严重,降低开发效率。
V2.0升级需求:网关层感知接口更新,网关层热加载接口

架构设计更新:
1.引入存储层
2.采用主动扫描的方式
3.在服务端进行代理
4.维护一个公共的jar
当然我们也可以用开源框架,截取网上的图片:
Sprng Cloud:

Spring Cloud Alibaba


