产品背景
开放平台( Open Platform)是基于淘宝各类电子商务业务的开放平台,提供外部合作伙伴参与服务淘宝用户的各类原材料,例如API、账号体系、数据安全等。她是大淘宝电子商务基础服务的重要开放途径,将推动各行各业定制、创新、进化,并最终促成新商业文明生态圈的建立。我们的使命是把淘宝网的商品、用户、交易、物流等一系列电子商务基础服务,像水、电、煤一样输送给有需要的商家、开发者、社区媒体和各行各业。
概述
开放平台系统比较宠大,我们只实现其中的核心技术部分,假定用户已经注册申请了应用,取得TOKEN授权,我们主要实现网关与运营管理以及监控部分。
下图是网关部分的逻辑架构图:

开放云平台网关主要分为:API网关集群(API Gateway-Core Cluster)、运营管理平台(API Gateway-Admin Cluster)、监控系统(API Gateway-Monitor Cluster)三部分。
API网关集群(API Gateway-Core Cluster)的功能是接收第三方开发者发过来的请求,对请求进行认证,鉴权、流量控制、数据缓存、熔断、故障隔断最后经过服务路由把请求发送给业务集群,把结果响应给第三方。同时把处理日志发送给ES存储。
运营管理平台(API Gateway-Admin Cluster)是运营来使用的,包括了权限管理,API管理,流控策略的控制、缓存设置、应用管理等功能。
监控系统(API Gateway-Monitor Cluster),通过进行对ES中的日志进行分析,设置API响应超时的报警。
如下图所示:

开放平台是一个独立的平台,与公司各个业务部分之间没有直接的关系,各个业务部门如果需要对外开放API,就可以接入到开放平台,我们在这个项目中接入电商平台中最常见的定单服务中的“订单查询”与“订单退定”API来接入到开放平台中。
开放平台逻辑架构

组件架构

核心模块
- 微服务服务中心 eureka
- 微服务缓存模块 cache
- 微服务搜索模块 search
- 微服务监控模块 monitor
- 微服务网关管理中心 gateway
- 微服务SDK
网关模块
接收用户的HTTP请求,通过”参数校验>>>签名校验>>>TOKEN校验>>>APP限流>>>路由>>>调用开放服务>>>记录日志”流程的处理。
网关还要实现熔断降级、API之间的业务隔离。
用户与网关之间的接口协议见文档:“开放平台接口协议.doc”
整体流程图如下所示:

参数校验
对用户传过来的系统参数与业务参数做校验。
签名校验
根据用户的APPKEY从缓存中取得SECRET,按照“开放平台接口协议.doc”中的要求生成签名(sign)与用户传过来的sign做校验。
TOKEN校验
Ø Token在用户授权成功后就存入缓存中,用户访问开放平台接口的时候带着TOKEN参数,根据用户的TOKEN查询缓存中是否存在此TOKEN,如果存在判断TOKEN是否过期。
Ø 从TOKEN缓存中取出TOKEN对应的userID(在电商开放平台中就是商家ID----verderId),传递给后面的服务,后面要开放的服务查询数据的时候得加上这个条件。
APP限流
Ø 限制每个应用(appkey)每天调用的次数,超过后不允许再调用,但有防止有应用(appkey)恶意攻击,在很短的时间内把一天的访问量用完,除了控制应用(appkey)一天的总量以外,我们再加上一分钟内访问量不超过一个阈值。
Ø 按天和APINAME归类,统计APINAME当天的访问量,写入到REDIS,以ZSET格式来组织数据结构,提供给管理平台统计当天APINAME访问量的排行榜。
路由
根据用户系统参数method(API名称)去缓存中查到对应的路由信息:serviceid与URL.。
记录日志
服务响应信息后把相关的日志发送给MQ,搜索模块监听日志信息,把数据入到elasticsearch。
网关向MQ发送日志参数:
appkey:应用KEY
servIP:服务IP,网关的IP
venderId:商家ID
remoteIp:来源IP
apiName:API名称
platformRepTime: 响应时间
requestContent: 请求包信息
errorCode: 错误码
receiveTime:接收信息时间
搜索模块
监听RABBITMQ中的客户请求日志TOPIC,把客户请求信息入到ES集群。
提供ES搜索和统计接口,给运营管理平台和监控平台查询搜索使用。
监控模块
定时按API统计一定时间内的平均响应时间,具本功能如下:
Ø 统计前五分钟范围内请求响应平均时长超过某个阀值的API接口,发送报警邮件;
可用REDIS或ZK来做分布式锁,一次保证系统中只有一个任务在运行。
颗粒度可以细化到api级,这里我们为了节省时间,针对所有的API设一个平均响应时长的统一监控,比如一秒。
创建应用和授权流程
(一) 创建应用流程
1) 开发者在开发者平台注册成为开发者
2) 开发者平台生成用户的APPID和SECRET
3) 应用信息入库和缓存
(二) 授权流程
1) 用户使用开发者应用时开发者平台引导用户登录授权系统
2) 用户在授权系统登录授权后,重定向到开发者平台
3) 开发者平台通过授权码请求授权系统获取TOKEN
4) TOKEN信息入库
如下图所示:

用户调用开放平台流程
1. ISV或自研商家在授权取得TOKEN后向网关提交请求;
2. 参数校验:校验提交参数是否合法
3. 签名校验:网关会首先根据用户提交信息查缓存进行签名校验,验证用户请求是否合法;
4. TOKEN校验,判断用户TOKEN是否存在和是否过期
5. 限流校验:通过缓存计算每个APP每天的请求量,超过设定量后就返回错误提示;
6. 路由:根据缓存中的映射关系,把用户请求路由到相关的服务,把结果响应给用户。
7. 发送用户请求日志给Rabbit MQ;
8. 搜索模块监听日志信息,入到ES集群中
如下图所示:

路由信息与应用信息维护流程
1. 运营管理员对路由信息与APP信息进行增加、删除、修改的操作;
2. 系统首先写数据库
3. 把更改的信息同步到缓存
如下图所示:

管理员搜索查询统计日志交互流程
1. 运营管理员在运营管理平台搜索统计的操作;
2. 运营管理平台调用搜索模块的搜索统计接口
3. 搜索模块调用ES集群查询返回结果给运营管理平台
如下图所示:

监控模块交互流程
定时监控:监控模块定时调用搜索模块统计某一时间段内请求响应平均时长超阀值的API接口,并通过邮件报警通知相关的人
在微服务中,每一个服务不可能只有一个实例(至少两个),要不然就不能做到高可用。但定时任务又是一种特殊的情况,定时任务只能同时运行一个任务,解决并发问题方案:
定时任务 + 分布式锁
假设定时任务部署了2台机器,在任务启动时2台机器竞争分布式锁,谁竞争到谁就执行,剩下1台不执行。分布式锁可以使用Redis或者Zookeeper
流程如下:
1. 两个定时任务到时间点周时去抢锁
2. 抢到锁的就调用搜索模块,执行统计任务,没抢到的就放弃执行。
3. 统计的API平均响应时间与阀值相比较,超过阀值的就发邮件报警。
如下图所示:

核心技术
- SpringCloud
- 在微服务框架选型方面,考虑了相关组件的完备性、社区热度以及资料丰富程度。我们选择了更成熟的Spring Cloud微服务框架。它其中包含了丰富的组件,包括服务注册发现的Eureka/Consul/Zookeeper,服务网关Zuul,熔断器Hystrix,负载均衡Ribbon/Feign等。另外还包括全局配置、安全、流处理和任务组件。在本产品中,我们主要使用服务注册发现、熔断器和负载均衡组件,即可满足目前的需求。

所示为Eureka服务注册发现工作原理图。一个服务使用Sping Boot框架为基础,加上@EnableEurekaServer注解即可变成一个Eureka 注册中心实例。如图中绿色组件所示,在生产环境中Eureka Server一般以集群方式部署,达到高可用。服务提供方则使用@EnableDiscoveryClient注解,即可实现向注册中心注册自己的服务,具体的注册信息包括服务名称、IP地址和端口号等。在生产环境中,服务提供方同样部署多实例并分别向注册中心注册。服务消费方则依赖Eureka Client组件,并使用Ribbon或Feign以负载均衡方式向服务提供方发起请求。具体实现过程是,服务消费方向注册中心获取待访问服务的全部实例列表,并在消费组件内以特定算法挑选出可用实例,然后发起请求。如果服务提供方有些实例意外不可用,注册中心会使用健康检查机制更新可用服务实例列表。服务消费方也会定期从注册中心同步最新的服务可用实例列表,防止继续访问不可用实例。
本项目中使用Eureka服务注册发现框架,内部基础微服务实例都注册到注册中心,服务消费方则使用上述方法实现对基础服务发起访问。例如,网关服务需要记录日志,但它不需要关心日志服务启动了几个实例,分别的IP地址是什么,而只需要提供日志服务名称(如log-service)并使用Feign/Ribbon提供的接口发起对日志服务的请求。
微服务框架中另一个重要的功能是服务熔断降级。如图所示,服务A依赖服务B。如果因为某些原因导致服务B不可用(如服务器宕机、网络超时、异常退出等),服务A也会受到影响。基于微服务框架的系统通常由大量的微服务组成,且服务之间依赖层级较深。假设遇到上述情况,失败会向上传递,最终导致整个应用不可用,即雪崩效应。

使用Hystrix熔断器组件可以解决服务依赖雪崩问题,它的核心思路是线程隔离和熔断降级实现的。如图所示是熔断器的状态转换图。默认状态是关闭,服务消费方请求提供方是正常的。当由于超时等原因无法正常访问提供方达到一定阈值后,状态会跳转到打开状态,此时请求会降级到Fallback降级实现。请求方可以快速返回,虽然业务功能没达成,但系统不会被拖死。请求方可以根据降低的返回实现,处理具体的业务逻辑。经历一定的熔断时间窗后,状态跳转到半开状态。此时如果访问服务提供方正常,则关闭熔断器,或仍然失败,则再次打开熔断器。它的工作原理就像强电场景里的保险丝,电流超过负荷以后就会慢慢融断,当真正断开以后,电路也中断了,所以叫做熔断器。

在本项目中,把Hystrix集成到服务消费方实例中,服务消费方可以实现对服务提供方的负载均衡访问,并具备了熔断机制,保证整个系统的高可用。
网关的技术选型(Zuul)
Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
审查与监控:
动态路由:动态将请求路由到不同后端集群
压力测试:逐渐增加指向集群的流量,以了解性能
负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
静态响应处理:边缘位置进行响应,避免转发到内部集群
过滤器说明:
§ preFilters:前置过滤器,用来处理一些公共的业务,比如统一鉴权,统一限流,熔断降级,缓存处理等,并且提供业务方扩展。
§ routingFilters:用来处理一些泛化调用,主要是做协议的转换,请求的路由工作。
§ postFilters:后置过滤器,主要用来做结果的处理,日志打点,记录时间等等。
§ errorFilters:错误过滤器,用来处理调用异常的情况。
- Elasticsearch
- ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
Elsticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
处理多租户不需要特殊配置,而Solr则需要更多的高级设置。
Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。
- RabbitMQ
- RabbitMQ发展到今天,被越来越多的人认可,这和它在易用性、扩展性、可靠性和高可用性等方面的卓著表现是分不开的。RabbitMQ的具体特点可以概括为以下几点:
可靠性: RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认及发布确认等。
灵活的路由: 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能,RabbitMQ己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。
扩展性: 多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。
高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队仍然可用。
多种协议: RabbitMQ除了原生支持AMQP协议,还支持STOMP,MQTT等多种消息中间件协议。
多语言客户端: RabbitMQ几乎支持所有常用语言,比如Jav a、Python、Ruby、PHP、C#、JavaScript等。
管理界面: RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
插件机制: RabbitMQ提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。
- Redis
- Redis的特点:
• 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
• Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
• Redis支持数据的备份,即master-slave模式的数据备份。
• 支持事务
Redis的优势:
• 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
• 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
• 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。(事务)
• 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
- 分布式锁
- 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
- 在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。
- Shiro
- Apache Shiro(读作“sheeroh”,即日语“城”)是一个开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
- 分布式事务
- 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
- SpringBoot
- Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
- Vue
- VUE 是 iOS 和 Android 平台上的一款 Vlog 社区与编辑工具,允许用户通过简单的操作实现 Vlog 的拍摄、剪辑、细调、和发布,记录与分享生活。 [1] 还可以在社区直接浏览他人发布的 Vlog,与 Vloggers 互动。
- Docker
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
开源地址下载或私信
https://gitee.com/qfjiaoyan/openapi