在微服务架构的系列文章中, 前面已经通过文章《架构设计之「服务注册 」》介绍过了服务注册的原理和应用, 今天这篇文章我们来聊一聊「 API 网关 」.
「 API 网关 」是任何微服务架构的重要组成部分. 有了它我们可以在一个独立的模块上方便的处理一些非业务逻辑, 可以让微服务本身专注在自身特定的功能上, 使得每个微服务的开发更容易和更快速.
后面还会有文章继续介绍 配置中心, 服务框架, 服务监控, 服务追踪, 服务治理等. 还是那句话, 只有将这些基础设施弄清楚了, 微服务实践的道路才能走的稳, 走的远.
一, 为什么需要「 API 网关 」?
为什么做微服务的需要「 API 网关 」呢?「 API 网关 」到底有些啥功能呢? 我们以前项目结构比较简单的时候有用到过「 API 网关 」概念的模块吗?
其实在我们的项目曾经还是单体应用的时候, 虽然没有「 API 网关 」的概念, 但是一般在项目中都会用到 filter / 过滤器之类的东西, filter 的作用就是把项目中的一些非业务逻辑的功能抽离出来独立处理, 避免与业务逻辑混在一起增加代码复杂度. 比如 鉴权认证功能, Session 处理, 安全检查, 日志处理等等.
现在我们采用微服务架构了, 在一个项目中微服务节点很多, 如果让每一个节点都去处理上面这些 "鉴权认证功能, Session 处理, 安全检查, 日志处理等" 会多出很多冗余的代码, 也会给增加业务代码的复杂度, 因此我们就需要有一个「 API 网关 」把这些公共的功能独立出来成为一个服务来统一的处理这些事情.
我们看一下下面这个微服务架构示意图:
「 API 网关 」就像是微服务的大门守卫一样, 是连通外部客户端与内部微服务之间的一个桥梁.
其主要功能有:
路由转发
之前说了「API 网关」是内部微服务的对外唯一入口, 所以外面全部的请求都会先发到这个「API 网关」上, 然后由「API 网关」来根据不同的请求去路由到不同的微服务节点上. 例如可以 根据路径 来转发, 也可以 根据参数 来转发.
并且由于内部微服务实例也会随着业务调整不停的变更, 增加或者删除节点,「API 网关」可以与「服务注册」模块进行协同工作, 保证将外部请求转发到最合适的微服务实例上面去.
负载均衡
既然「API 网关」是内部微服务的单一入口, 所以「API 网关」在收到外部请求之后, 还可以根据内部微服务每个实例的负荷情况进行动态的负载均衡调节. 一旦内部的某个微服务实例负载很高, 甚至是不能及时响应, 则「API 网关」就通过负载均衡策略减少或停止向这个实例转发请求. 当所有的内部微服务实例都处理不过来的时候,「API 网关」还可以采用限流或熔断的形式阻止外部请求, 以保障整个系统的可用性.
安全认证
「API 网关」就像是微服务的大门守卫, 每一个请求进来之后, 都必须先在「API 网关」上进行身份验证, 身份验证通过后才转发给后面的服务, 转发的时候一般也会带上身份信息.
同时「API 网关」也需要对每一个请求进行安全性检查, 例如参数的安全性, 传输的安全性等等.
日志记录
既然所有的请求都需要走「API 网关」, 那么我们就可以在「API 网关」上统一集中的记录下这些行为日志. 这些日志既可以作为我们后续事件查询使用, 也可以作为系统的性能监控使用.
数据转换
因为「API 网关」对外是面向多种不同的客户端, 不同的客户端所传输的数据类型可能是不一样的. 因此「API 网关」还需要具备数据转换的功能, 将不同客户端传输进来的数据转换成同一种类型再转发给内部微服务上, 这样, 兼容了这些请求的多样性, 保证了微服务的灵活性.
二,「 API 网关 」原理与应用?
上面聊完了「为什么需要 API 网关」, 我们再来看一下在实际项目中应该如何去应用. 虽然我们可以自己去开发一套「API 网关」, 但是如果没有特殊需求, 还是不建议重复造轮子了, 市面上有很多成熟的方案可以直接使用, 下面简单介绍一下 Zuul,Tyk,Kong 三个比较热门的开源组件.
Zuul
Zuul 是由 Netflix 所开源的组件, 基于 JAVA 技术栈开发的.
Zuul 网关的使用热度非常高, 并且也集成到了 Spring Cloud 全家桶中了, 使用起来非常方便.
上图可以看到 Zuul 的一个简化结构, 过滤器 filter 是整个 Zuul 的核心, 分为前置过滤器 (pre filter), 路由过滤器(routing filter), 后置过滤器(post filter) 以及 错误过滤器(error filter).
一个请求过来, 会先执行所有的 pre filter, 然后再通过 routing filter 将请求转发给后端服务, 后端服务进行结果响应之后, 再执行 post filter, 最后再响应给客户端. 在不同的 filter 里面可以执行不同的逻辑, 比如安全检查, 日志记录等等.
Tyk
Tyk 是一个基于 GO 编写的, 轻量级, 快速可伸缩的开源的 API 网关.
可以通过下图简单了解一下 Tyk 的流程原理.
Kong
Kong 是基于 OpenResty 技术栈的开源网关服务, 因此其也是基于 Nginx 实现的.
Kong 可以做到高性能, 插件自定义, 集群以及易于使用的 Restful API 管理.
来源: http://www.bubuko.com/infodetail-3035695.html