架构
  • 基于SpringBoot的Web Server

  • 网关属于高并发模块
    逻辑简单,业务逻辑剥离到业务层

  • 设计目标-高性能
    缓存设计
    异步线程设计阿里面试官:写个微服务网关?_微服务

网关时序图阿里面试官:写个微服务网关?_微服务_02 跨域

从一个源(如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共享,因此内存存储能保证极大的性能

  • 无法应对高并发、高可用

分布式方案

Session绑定

将 uid hash 到固定的节点,可是如何保证高可用呢?使用主从,但这简单问题复杂化,不推荐。
阿里面试官:写个微服务网关?_微服务_03

Session复制

  • Tomcat 有组件支持该机制
    阿里面试官:写个微服务网关?_微服务_04

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

Session共享

阿里面试官:写个微服务网关?_微服务_05
使用缓存服务 Redis,统一存储 Session
优点:
网关层无状态
缓存服务本身高可用
缺点:
多一次服务调用 IO

Session客户端存储(token)

阿里面试官:写个微服务网关?_微服务_06
优点:
简单高性能
接入层无状态
缺点:
依赖客户端 Cookie存储

但是服务端存储的好处是比如微信,限制你只能登录一台终端,就是通过心跳判断你的终端是否改变了而实现单点登录。

Session 生成算法

Session是一串具有一定时效性的加密字符串,通常由服务端生成和解析。

业务强相关的字段

  • deviceld、 clientType、 uid、 ts

AES加密方案(常用的非对称加密方案)

阿里面试官:写个微服务网关?_微服务_07

  • 加解密过程都在服务端,高并发下很消耗 CPU 性能。

网关高性能

  • 本地算法+远程校验

参考

  • https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Allow-Origin