API网关是微服务重要组成部分,API网关主要承担一下几个任务:
1、API转发
这是API网关最重的一个功能,做到外网协议与内网RPC协议隔离,业务开发人员就可以不关心对外暴露的协议(http、tcp),只需写一套代码就可完成多种协议的对外暴露。
2、监控报警
可以对微服务的请求耗时、失败率、并发数等数据进行监控报警,提早发现问题。
3、分流鉴权
可以设置路由规则,AB测试等,通过注册中心对请求进行分流,并且可以对每笔请求进行鉴权,保证系统安全。
4、统一入口
可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、流量与并发控制,甚至基于API调用的计量或者计费等等
API网关主键设计可以参照下图:
在zebra设计开发过程中,我们积累了一些API网关设计的原则,分享给大家:
1、API网关不能反向依赖微服务
API网关必须是一个独立隔离的实体,不与底层服务进行反向依赖,这样就可以保证底层服务有任何变动,API网关都不需要进行修改。
但是RPC调用有个硬伤就是必须知道服务端的方法定义(包括:请求参数、返回参数、方法名)才可以进行调用,这样网关在调用后方的微服务就必须依赖微服务的接口定义,间接产生了反向依赖。
dubbo最新版本提供了泛化调用,可以解决此问题(泛化调用:不需要知道调用接口的请求与返回参数即可调用),zebra是基于GRPC的微服务架构,zebra实现了GRPC的泛化调用,可以解决此问题。
2、API网关必须是无状态
网关层为保证高可以,易于伸缩,快速启动,需要设计成无状态的。
3、优雅下线原则
当网关发现某一个节点不可用时(例如请求响应时间超过阀值),不是直接断开与此节点的连接,而是先把此节点标记为不可用(后续不在发送请求到此节点),但还会留出一段时间让之前的请求都响应完毕。
4、Slow start特性
当网关监听到有一台新的服务注册上来时,考虑到有些服务启动后,刚开始会有许多初始化的工作,此时服务对请求的响应速度是比较慢的。如果一开始就给这台服务分配太多的压力,有可能导致服务瞬间被压垮。为了避免这种情况,网关层需要考虑支持SlowStart特性。即,经过一段时间,逐渐把压力增加到预设的值。