如何正确理解api网关

微服务这么火,随之api网关经常被提到。那么什么才是api网关?这个问题也一直困扰着我。前几周在csdn数据库大会上与沪江的一个架构师就这个问题探讨了一下。使我对于api网关的认识清晰了不少,因此在本文梳理一下个人思路并总结,但愿可以帮助到还一直迷糊的朋友。前端

使用api网关的缘由

在网上关于说明使用api网关的缘由,无外乎以下几种:nginx

  • 负载均衡
  • 减小客户端与服务端的直接调用
  • 容错
  • 服务发现与注册
  • 统一认证
  • 等等…

api网关分类

api网关可能没有分类,只是我理解硬性的将其归类。
若是只须要负载均衡、减小客户端与服务的直调、容错这几项功能,那么nginx能够直接提供服务,而且它的使用方式与nginx的反向代理使用方式没有任何区别,因此这时也会不清nginx提供的是反向代理功能仍是api网关功能,反正是可以知足你的业务需求。git

而后再加以对nginx进行的其余不知足功能进行扩展,好比Kong就属于这一类框架解决方案。这类框架它的使用,对应的URL地址通常状况是根据业务进行分组,而后使用nginx的URL路由到后端相应的业务服务器。github

这种框架与我所理解的api网关有所区别,个人概念中即然为api网关,它的URL地址则不该当变化。即前端用户始终请求一个固定地址,相似http://host:port/gateway/gateway.若是是经过这种方式,则网关服务器接收到请求须要路由,路由的参数只能经过请求参数或协议头传递过来。对于这种状况的路由,nginx好像搞不定,因此只能自主开发。web

咱们将这两种实现进行归类,以nginx的多地址路由实现方式归为类别一,即KONG属于此类框架;以固定URL地址的网关归结为类别二。spring

维服务的框架spring cloud,它也提供一个api网关zuul,根据我对于它的了解,它也归为类别一。了解了几个开源的关于api网关的使用功能都归结为类别一。那么为何它们都是以这种方式开发,而没有使用固定的URL地址,有人可能会说api网关就是这样,没有你说的那种类别二,难道是个人理解有误?可是支付宝支付网关,京东支付网关都是以固定的URL这种形式进行提供。数据库

那么类别一与类别二有什么区别呢?

咱们发如今开源的api网关解决方案中都是采用类别一的形式,相比类别二,它的扩展性很好、路由规则很容易更改。可是它的使用让我有点蒙,由于我分不清它与反向代理到底有什么区别,由于前端依然须要知道N多的URL地址,而后进行调用,多是我太较真。
类别二,对于前端调用,他们只须要知道一个固定的URL地址,经过传参不一样的参数,网关对其服务进行路由。我认为这种方式更方便,这也仅仅只是我认为,由于这里须要传递额外的路由参数,因此整体来讲,并不比类别一简单(很差意思在这里我又较真了一次)。后端

如何选择

咱们如何进行选择呢?我的的理解,若是你想快速的搭建一个api网关平台,你仍是选择类别一吧,好比KONG,ZUUL.若是你想了解类别二的实现方式,能够参考个人github https://github.com/zhuzhong/gatewayapi