-
基于SpringBoot的Web Server
-
网关属于高并发模块 逻辑简单,业务逻辑剥离到业务层
-
设计目标-高性能 缓存设计 异步线程设计

从一个源(如baidu.com) 加载的文档或者脚本默认不能访问另一个源(如tencent.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共享,因此内存存储能保证极大的性能
- 无法应对高并发、高可用
将 uid hash 到固定的节点,可是如何保证高可用呢?使用主从,但这简单问题复杂化,不推荐。
-
Tomcat 有组件支持该机制
优点: 每台机器存储全量的 session,做到了高可用。 缺点: 集群同步复杂适用于小规模网关, 数据存储不合理,内存开销大
Session共享
使用缓存服务 Redis,统一存储 Session
优点:
网关层无状态
缓存服务本身高可用
缺点:
多一次服务调用 IO
优点:
简单高性能
接入层无状态
缺点:
依赖客户端 Cookie存储
但是服务端存储的好处是比如微信,限制你只能登录一台终端,就是通过心跳判断你的终端是否改变了而实现单点登录。
Session 生成算法Session是一串具有一定时效性的加密字符串,通常由服务端生成和解析。
业务强相关的字段- deviceld、 clientType、 uid、 ts
- 加解密过程都在服务端,高并发下很消耗 CPU 性能。
- 本地算法+远程校验
参考
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Allow-Origin