前一阵做了一个证券量化交易项目。需求貌似很简单,也就是按照特定步骤做证券的买卖,但是最后需要部署到互联网上,这就对应用的安全性提出了很高的要求。项目工期一周,为了高质量的尽快完成项目,我设计了一个云原生的方案。
通过分析这个云原生方案,可以让读者了解到,如何通过一些云服务来快速实现安全、可扩展的应用。
先来看架构图吧:
基本业务介绍
这个项目的业务是通过调用证券公司的 API 服务,按照指令特定顺序完成指定证券的交易。在这个项目中有几套这样的指令,用户可以通过 UI 来直接操作。这些指令使用人工操作证券公司的 APP 也能完成,但是由于人工操作慢,会影响到交易利润,所以甲方希望通过此项目自动化交易指令。
为什么要用 Azure App Service?
主要原因是为了快速免费地实现 https,我把用 ReactJS 写的静态网页托管到Azure App Service 这样就不用自己管理虚机。Azure App Service 也提供了扩展域名和 https 服务,我不需要去申请和绑定新域名,更不需要去申请和维护 https 证书。
为什么要使用 Auth0.com 的 SaaS 服务?
Auth0.com 提供了用户权限管理的功能,可以直接利用社交账户登录系统,提供良好的用户体验的同时,简化了 OAuth 和 Open ID 集成到应用的复杂性。
在这个项目中,用户注册以后,管理员在 auth0 网站上给予权限,用户通过标准的 OAuth 流程使用 UI 拿到 auth0 产生的 access token 来访问量化交易服务。项目代码本身不用再处理 OAuth 流程相关的业务。项目权限由 Auth0 管理,Azure API Management 负责实现。
Azure API Management 起到什么作用?
Azure API Management 起到了以下几点作用:
- https termination
由于要求所有的 API 请求都需要经过 Azure API Management,所以我们可以使用 Azure API Management 的域名和 https 服务来访问 API, 而 Azure API Management 在访问后台服务的时候使用的是 http。这样我们的后台服务就不用实现 https 简化了后台服务的实现和配置。 - 保护后台服务
后台服务是 python flask 写的 RESTful API 服务,服务端口是5000,我设置了只有 Azure API Management 的 IP 才能访问后台服务,这样就消除了攻击后台服务的可能。 - 实现 auth0 访问权限
用户通过认证以后使用 auth0 创建的 access token 来访问后台服务,由于使用了 Azure API Management,后台服务不需要验证 token 的合法和有效性,这个工作交给了 Azure API Management 来完成。
另一方面,通过设置 Azure API Management 绑定 token 中的权限 claim 实现了后台服务 API 和 auth0 中设置的权限的绑定。后台服务无需实现权限相关的逻辑。 - CORS 控制
通过 Azure API Management 来设置 CORS,取消了后台服务的 CORS 设置,简化了代码
除了上面的 4 点以外,Azure API Management 实际上还可以实现限流、断路保护的等功能,这些配置可以随着业务量的增加再来加上。
结论
云原生架构,使我们在一周时间实现一个安全可靠的量化交易平台成为可能。在平台中应用到了 auth0 认证及授权云服务,Azure App Service 提供静态网页及https 访问, Azure API Management 保护后台RESTful API, https 访问,和auth0一起实现权限管理。