-
基于SpringBoot的Web Server
-
网关属于高并发模块
逻辑简单,业务逻辑剥离到业务层 -
设计目标-高性能
缓存设计
异步线程设计
跨域
从一个源(如baidu.com) 加载的文档或者脚本默认不能访问另一个源(如)的资源。
CORS (Cross-Origin Resources Sharing)解决跨域问题
对HTTP请求头进行豁免
- 建立豁免清单
- Access-Control- Allow-Origin
如需允许所有资源都可以访问您的资源,您可以如此设置:
Access-Control-Allow-Origin: *
如需允许https://developer.mozilla.org访问您的资源,您可以设置:
Access-Control-Allow-Origin: https://developer.mozilla.org
CORS和缓存
如果服务器未使用“*”,而是指定了一个域,那么为了向客户端表明服务器的返回会根据Origin请求头而有所不同,必须在Vary响应头中包含Origin。
Access-Control-Allow-Origin: https://developer.mozilla.org
Vary: Origin
Access-Control- Allow- Credentials
- 是否允许cookie跨域
Access-Control- Allow- Methods
- 允许提交请求的方法
读写请求使用的上下文对象,称之会话(Session).
高可用设计
- 无状态化
单机下不存在Session共享,因此内存存储能保证极大的性能
- 无法应对高并发、高可用
分布式方案
Session绑定
将 uid hash 到固定的节点,可是如何保证高可用呢?使用主从,但这简单问题复杂化,不推荐。
Session复制
- Tomcat 有组件支持该机制

优点:
每台机器存储全量的 session,做到了高可用。
缺点:
集群同步复杂适用于小规模网关,
数据存储不合理,内存开销大
Session共享

使用缓存服务 Redis,统一存储 Session
优点:
网关层无状态
缓存服务本身高可用
缺点:
多一次服务调用 IO
Session客户端存储(token)

优点:
简单高性能
接入层无状态
缺点:
依赖客户端 Cookie存储
但是服务端存储的好处是比如微信,限制你只能登录一台终端,就是通过心跳判断你的终端是否改变了而实现单点登录。
Session 生成算法
Session是一串具有一定时效性的加密字符串,通常由服务端生成和解析。
业务强相关的字段
- deviceld、 clientType、 uid、 ts
AES加密方案(常用的非对称加密方案)

- 加解密过程都在服务端,高并发下很消耗 CPU 性能。
网关高性能
- 本地算法+远程校验
参考
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
















