在微服务大行其道的业务场景中,首先得要明白什么是 API 网关。
我来举个例子,假设有如下场景:
我运营着一个电商平台,它的平台技术架构体系是微服务,此时假设平台拥有三个模块,分别是订单模块、商品展示模块、物流模块,在前后端分离的情况下,前端调用后端接口是需要鉴权的。如果运气不好,三个独立模块的鉴权方式都不相同,难道客户端需要对每个后端模块分别进行鉴权吗?
此外,现实生活中的平台可不仅仅只有三个模块。而且每个模块都会面临不同大小的用户并发量,如果让一个运维人员每个模块都编写 Nginx 配置文件来控制限流、转发操作、IP 黑名单、IP 白名单实属吃力不讨好。在电商平台中,并发量最大的一般都是商品展示模块,如果我有一个能够方便的配置所有的 API 接口的限流、转发、鉴权操作的平台,上手鼠标点点就能完成我想要的效果,并且实时生效,那样效率就很高了。
在此我们引入 API 网关这个概念
API 网关是客户端请求的入口,具体我们可以认为它就是一个做代理转发的 Nginx ,只不过是一个带有图形化界面的平台。
因此,只需要在 API 网关平台中做好该应用所需使用模块的鉴权配置信息,那么客户端的发出的请求只需要做一步网关的鉴权,则可以通用后端所有模块。此外如果它还有流量控制、熔断、服务发现、访问控制(黑白名单)、API 结果缓存等特性那就再好不过了。
在此我们介绍 Manba API 网关平台,它是一款基于 Golang 开发的 HTTP 协议restful API 网关。可以作为统一的 API 接入层。
先上它的下载地址:https://github.com/fagongzi/gateway
安装方式:
一、下载
1 |
git clone https://github.com/fagongzi/gateway.git |
下载完毕后进入项目根目录,创建 vendor 目录
根据下面的地址下载包,并解压进vendor 目录中
https://github.com/fagongzi/gateway-vendor
请自行安装 etcd ,并启动它。该项目依赖 etcd ,安装地址如下
https://github.com/etcd-io/etcd/releases
二、编译安装
请确保你的 Golang 环境版本在 1.10 或者以上,我用的是1.13
根目录下有一个 Makefile 文件,它负责生成可执行文件和静态 Web UI 。因此我们在这个项目的根目录下执行以下命令
1 |
make |
执行完 make 后他会在根目录下生成 dist 目录,并且 dist 目录包含三个文件,他们分别是:
entrypoint.sh、manba-apiserver、manba-proxy
执行命令:
1 |
make ui |
执行完 make ui 后他会在 dist 目录生成 ui
如下所示:

我们主要关注三大文件:manba-apiserver、manba-proxy、ui
我们依次解释下这三个文件:
- manba-apiserver: apiserver 对外提供 GRPC 和 Restful 来管理元信息,ApiServer 同时集成了官方的 WebUI
- ui:就是提供给 apiserver 用的WebUI 文件
- manba-proxy: proxy 是 Gateway 对终端用户提供服务的组件,Proxy 是一个无状态的节点,可以部署多个来支撑更大的流量
此时差不多算大工告成了。
我们先启动Web后台命令:
1 |
./manba-apiserver --addr=127.0.0.1:9091 --addr-store=etcd://127.0.0.1:2379 --discovery --namespace=test -ui=ui/dist |
这条命令是启动 ApiServer 的,同时也启动了它的 ui 界面。启动结果如下所示:

如上图所示,它会在本地启动 9093 端口,因此你还需要配置 Nginx 反向代理作为转发, 此处就不细写了。
最后你可以通过下面这种形式访问到你的 web 后台界面
1 |
http://ip:Nginx监听转发的端口/ui/index.html#/home |
界面如下图所示

再者我们启动 manba-proxy ,它是代理转发的真正入口 (至关重要)
1 |
./manba-proxy --addr=0.0.0.0:80 --addr-rpc=0.0.0.0:9091 --addr-store=etcd://127.0.0.1:2379 --namespace=test |
启动结果如下所示:

最后我们模拟开启一个后端服务,它在项目的 cmd/backend/目录下有个测试的后端接口
1 |
go run backend.go -addr=localhost:9000 |
启动完成之后,我们将视角转到后台界面这里。

这里我们主要需要关注的就是这 4 个菜单。
分别是API、Cluster、Server、Routing。
在了解如何配置 API 前,我们必须先知道这里的 Cluster 和 Server 代表的是什么。
菜单栏中的名词解释:
一、Server
Server 是我们后端真正的服务,也就是当客户端发起请求,通过 API 网关后直击的服务。如下图所示:

你还可以设置该接口支持最大的QPS,它能够时时生效。
二、Cluster
Cluster 是 Server 的集合,也就是 一群具有相同功能的 server 的集群,当客户端发送请求给 API 网关时,它会自动转发给集群下的某个 server 做负载均衡。 如下图所示:

三、 Routing
Routing 即路由,但是这个路由可能和我们理想中的功能不同,它是用作导流使用的
如下图所示:

路由策略,目前支持Split
和 Copy 分发。
Split 分发是指:把满足条件的请求按照比例转发到目标Cluster,剩余比例的流量按照正常流程进入API匹配阶段,流向原有的Cluster。
Copy 分发它能将流量拷贝一份转发给一个集群下的服务。(有点类似像MQ中多人订阅的道理)
路由流量的比例,例如设置为50,那么50%的流量会根据RoutingStrategy
进行路由。
四、 API
API是用来配置URL匹配规则的,具体的来讲,当客户端请求我们的API网关时,我们会根据它请求的URL 后缀来分析它应该被转发给哪个服务集群。
如下图所示:




因此,我们最后理一下,在这个后台中,我们应该先设置集群(Cluster),然后再设置集群中的服务(Server),再设置API来绑定流量转发给哪个集群,至于Routing 你可以选择设置也可以选择不设置。
当一切都设置结束后,你只需要请求 manba-proxy 启动的80端口服务,即可被网关转发。
完。
文章评论(0)