API Gateway - littleboy12580/learning_python GitHub Wiki
介绍
API Gateway如其名所说,是系统的入口,对外提供服务;它是微服务架构中一个不可或缺的部分,所有的外部系统接入系统都需要通过API网关
API Gateway封装内部的系统架构,并且提供API给各个客户端,它负责请求转发、合成和协议转换;API Gateway经常通过调用多个微服务来处理一个请求以及聚合多个服务的结果;它可以在web协议与内部使用的非Web友好型协议间进行转换
API Gateway可以提供客户端一个定制化的API,他暴露一个粗粒度API给移动客户端;例如一个商务平台网站上的一个产品最终页场景,在该场景中API Gateway提供一个服务提供点(/productdetails?productid=xxx)使得移动客户端可以在一个请求中检索到产品最终页的全部数据;API Gateway通过调用多个服务来处理这一个请求并返回结果(涉及产品信息、推荐、评论等多个微服务)
实现
性能和扩展性
创建一个支持同步、非阻塞I/O的API Gateway可以显著提高其性能与可扩展性;在JVM上可采用NIO技术的框架(如Spring Reactor),在非JVM上,一个可选的方案是NGINX Plus
采用反应性编程
由于存在一些请求,它发送给后端微服务的请求都是相互独立的,为了最小化响应时间,API Gateway应该并发的处理相互独立的请求;而有的时候请求之间存在相互依赖,此时API Gateway可能需要先通过授权服务来验证请求,然后再路由到后端服务;可以使用Netflix Video Grid组件来实现
服务调用
一个基于微服务的应用是一个分布式系统,必须采用线程间通信的机制;有两种线程通信的方法,一种是采用同步机制,基于消息的方法(这类的实现方法有JMS和AMPQ);另一种是异步机制(例如Thrift和HTTP);一般而言API Gateway需要支持多种通信方式
服务发现
API Gateway需要知道每一个微服务的IP和端口;由于应用服务通常是动态分配地址和端口,因此API Gateway需要采用系统的服务发现机制,要么是服务端发现,要么是客户端发现
处理部分失败
在分布式系统中当一个服务调用另一个服务超时或者不可用时,API Gateway不应该被阻断并处于无限等待下游服务的状态;因此因对失败情况进行处理,如何处理失败依赖于特定的场景和具体服务;以产品详情页为例,如果是产品详情页里的推荐服务模块无响应,那么API Gateway应该返回剩下的信息给用户,推荐部分可以返回空或者固定的顶部10个给用户,但是如果是产品信息服务无响应,那么API Gateway就应该给客户端返回一个错误信息;
此外,当缓存有效时,API Gateway应该可以返回缓存,缓存可以由API Gateway自身来缓存,也可以由redis活memcached这类外部缓存来实现