认识API网关

API网关是什么?

网关,即API网关。将所有的API的调用统一接入API网关层,有网关负责接入和输出。

从单体应用到微服务

当业务简单,团队规模小的时候,我们常常会把功能都集中到一个应用中,统一部署、统一测试。当业务迅速发展,组织成员增多,所有功能集中在一个tomcat中时,一旦更新一个功能模块,势必要更新所有程序。
微服务的思想就是将单体应用微服务化,将原来集于一体的功能进行拆分,每个功能模块有各自的自成体系的发布运维等功能,微服务化后就需要有统一的入口和出口,API Gateway很好的解决了微服务下客户端调用、统一接入的问题。


API.png


有了API网关之后,团队可以更关注自己的业务逻辑处理,而API网关更关注安全、流量、路由等问题。


网关与代理的区别:代理是纯粹的数据透传,协议不会发生变化;网关在数据透传的背景下还会涉及协议的转换。

API网关四大功能

即统一接入、协议适配、流量管控和容错。
2.png

1  统一接入

作为对外的门面,网关应该拥有统一且简洁的规范,以减少接入的成本。同时这也可以体现出专业化的技术能力。
统一的规范应该至少包括以下内容:

统一的编码规则。
统一的返回数据的结构。
统一的错误申明与处理方式。
统一的公共参数,例如识别用户身份的token,识别渠道来源的source等。
统一的加签、加解密方式;统一的身份认证或安全体系。

2  安全防护

作为请求的入口,是保护内部系统的第一道屏障,当遭受攻击时要尽可能的将影响降为最低。所以应该具备清洗恶意攻击的流量,能够在流量异常的时候屏蔽这些异常请求,或者对这些请求进行限制。
验证请求信息,屏蔽非法请求,确保接口的安全性,保证所有达底层业务系统的请求都是安全、可靠地。
常用的手段有:

防篡改,例如参数加签。
请求安全:请求端加密,网关层解密。
身份校验:必须是合法的用户,必须是合法的第三方。
接口安全级别。例如:接口不需要登录即可访问;需要登录方可访问;接口仅提供给app,H5不能使用等
接口权限限制。
黑白名单。
HTTPS。

 

3  流量管控

系统的承受能力都有限,例如:当营销活动做得好时,系统请求量超过系统的服务能力的极限,如果放任不管,势必压垮内部系统,此时应该对内部系统提供一定的保护。
作为服务能力的出口,一旦不可用,在外部看来所有的服务都不可用,所以应该网关必须高可用、高并发。
常见的手段有:限流、降级、熔断

4  协议转换

对外提供的都是HTTP接口,但内部系统是使用Dubbo来相互调用的,所以网关势必要能够完成协议转换,并通过负载均衡等手段将请求高效的分发到内部系统中去。

5  其他业务

1)   接口文档管理
业务发展变化势必引起服务的增加或者扩展,如果能够统一的对文档进行维护,势必会降低开发、联调、定位问题成本。我们的做法是通过api规范自动生成接口文档。
2)   调试工具和示例
当接入方很多,提供一个调试工具或者提供示例将会极大的简化接入成本。
3)   SDK自动生成能力
为客户端(Android、IOS或者第三方调用者)生成SDK,简化接入、降低对方开发成本。
4)   API增强
参数注入。例如注入userId、来源、ip等。 
合并多个请求。例如:在一个页面中可能需要访问多个接口才能拿到所有的数据,此时为了方便调用方使用,网关可以提供合并多个接口的能力,让调用方同时发起多个http请求。

API网关架构

网关整体模块

1.2.png
除了基本的四个功能,网关运行良好的环境还包括注册中心,为了提高网关的性能,将数据全部异构到缓存中,等等。

一个API的生命周期

什么是API

API即应用编程接口。是一个接口,基于应用,是可编程的。一方调用一个API,另一方实现一个API,定义好规范,约束,然后双方系统进行交互。

生命周期

API作为一种可编程的应用接口,同样具备可设计、可测试的过程设计API时常用的工具有RAML、Swagger,来辅助我们设计API和生成API文档。

生命周期的过程

  • 设计:对API命名(见文知意)、参数(不公开不必要的参数)。
  • 构建:对API内部的业务逻辑进行编程,防止非法的参数传入API内部,需要在方法的入口处进行判断凡是不合法的值要尽早报错。
  • 文档:一份清晰的文档是API使用者的福音。
  • 测试:好的API一定是便于测试的,可测试性还体现在MOCK测试时的容易程度。
  • 分享:这里的分享实为发布,即可供其他开发者使用,在提供SDK的环境下出参的解析都由SDK完成。
  • 运行:运行期间的重点就是对API进行监控。
  • 下线:API生命周期的末尾,我们将这个API标记为已废弃,但他的调用历史记录依然会被要求存留在西永存储中。


管道技术

对于API网关系统来说,它几乎是没有任何业务的,我们将参数校验、黑白名单、接口调用封装成管道,并按照顺序组织起来。

管道实现

首先定义各个功能的pipe类,然后将pipe类包装成一个实现了Runnable的Task,在将Task交给事先定义好的ThreadPool线程池来处理。
管道的信息传递:管道之间需要进行信息传递,否则管道就没有存在的意义。信息的传递是单向的,传递的顺序依靠管道池中管道排列的顺序。

管道的优点

用管道的方式将请求穿起来,代码在结构上会比较清晰,同时,我们还可以对管道功能进行热插拔。

Last modification:April 4th, 2020 at 06:05 pm
如果觉得我的文章对你有用,请随意赞赏