今天简单介绍下国人开发的开源API网关Goku,该网关基于Go语言进行开发,在前面介绍API网关的时候就谈到实际上当前主流的API网关基本都是采用Openresty或Go语言开发的。因此今天对Go语言开发的这个网关进行介绍。
虽然这个网关现在已经有了收费和社区版本,但是对于开源版本仍然可以满足大部分的业务需求场景和使用,对于企业来说也完全可以先使用开源版本,如果在实施完成后对性能和易用性等都满意,再来考虑是否切换到社区版本。
对API网关Goku简单介绍
GoKu API Gateway,中文名:悟空API网关,是eoLinker旗下、国内首个企业级开源的go语言API网关,帮助企业进行API服务治理与API性能安全维护,为企业数字化赋能。GoKu支持OpenAPI与微服务管理,支持私有云部署,实现API转发、请求参数转换、数据校验等功能,提供图形化界面管理,能够快速管理多个API网关,提高API业务安全性。
Gitee地址:
https://gitee.com/eolinker/goku-api-gateway
官网地址:
https://www.eolinker.com/product/api_gateway/
GitHub地址:
https://github.com/eolinker/goku-api-gateway
为什么要使用Goku网关?
Goku API Gateway (悟空 API 网关)是运行在企业系统服务边界上的微服务网关。当您构建网站、App、IOT甚至是开放API交易时,Goku API Gateway 能够帮你将内部系统中重复的组件抽取出来并放置在Goku网关上运行,如进行用户授权、访问控制、防火墙、数据转换等;并且Goku 提供服务编排的功能,让企业可以快速从各类服务上获取需要的数据,对业务实现快速响应。
Goku API Gateway 的社区版本(CE)拥有完善的使用指南和二次开发指南,代码使用纯 Go 语言编写,拥有良好的性能和扩展性,并且内置的插件系统能够让企业针对自身业务进行定制开发。并且 Goku API Gateway 支持与 EOLINKER 旗下的 API Studio 接口管理平台结合,对 API 进行全面的管理、自动化测试、监控和运维。
产品关键特性说明
控制台:通过清晰的UI界面对网关集群进行各项配置。
集群管理:Goku网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。
热更新:无需重启服务,即可持续更新配置和插件。
服务编排:一个编排API对应多个backend,backend的入参支持客户端传入,也支持backend间的参数传递;backend的返回数据支持字段的过滤、删除、移动、重命名、拆包和封包;编排API能够设定编排调用失败时的异常返回。
数据转换:支持将返回数据转换成JSON或XML。
负载均衡:支持有权重的round-robin负载平衡。
服务发现:从 Consul、Eureka 等注册中心发现后端服务器。
HTTP(S)反向代理:隐藏真实后端服务,支持 Rest API、Webservice。
多租户管理:根据不同的访问终端或用户来判断。
访问策略:支持不同策略访问不同的API、配置不同的鉴权(匿名、Apikey、Basic)等。
灵活的转发规则:支持模糊匹配请求路径,支持改写转发路径等,可为不同访问策略或集群设置不同的负载。
IP黑白名单。
自定义插件:允许插件挂载在常见阶段,例如before match,access和proxy。
CLI: 使用命令行来启动、关闭和重启Goku。
Serverless: 在转发过程的每一个阶段,都可以添加并调用自定义的插件。
请求日志(access log):仅记录转发的基本内容,自定义记录字段与排序顺序,定期自动清理日志。
运行日志(system log):提供控制台和节点的运行日志,默认仅记录ERROR等级的信息,可将等级按实际情况调成INFO、WARN或DEBUG。
可扩展:简单易用的插件机制方便扩展功能。
高性能:性能在众多网关之中表现优异。
Open API:提供 API 对网关进行操作,便于集成。
版本控制:支持操作的发布和多次回滚。
监控和指标:支持Prometheus、Graphite。
产品组成说明
一套完整的 GOKU API Gateway 由一个控制台和若干个网关节点组成。控制台与网关节点分别部署在不同的服务器上,一般一台服务器部署一个网关节点。若服务器上部署了多台虚拟机,则建议控制台、各节点分别部署在不同的虚拟机上。
网关节点通过IP地址或者域名注册在控制台中,节点会通过主动获取控制台上的最新配置信息。
GOKU AGW是一个开箱即用的集群,仅需将部署好的网关节点注册到现有的负载均衡器、F5、CDN等即可。网络请求经过上述负载均衡之后会到达网关节点,再通过网关节点转发到目标后端服务。
开源版和社区版功能对比
从开源版本和社区版本的功能对比来看,主要还是安全,流控,数据转换映射等一些高级特性在基础的开源版本不支持。开源版本对于关键的服务限流熔断,服务降级,数据缓存,格式转换,请求大小校验等能力是没有的,这些能力只在企业版本中提供。
具体支持的插件区别如下:
开源版支持插件:
IP黑白名单、Basic鉴权、Apikey鉴权、参数映射、额外参数
企业版支持插件:
流量控制、Basic鉴权、Apikey鉴权、OAuth2.0鉴权、OAuth2.0第三方认证、JWT鉴权、AK/SK认证、IP黑白名单、跨域、防重放攻击、返回头部、默认返回、参数映射、额外参数、熔断、服务降级、请求大小限制、数据缓存、请求xml/json转换、响应xml/json转换
也就是说真正要上到企业级环境和应用,开源版本仍然有比较大的欠缺,需要购买社区版本,或者自己进行相关功能的扩展。特别是涉及到的安全特性和流控特性。
性能测试对比
以下是厂家公布的一个性能测试数据,2.50GHz * 12, 48G内存,单节点,并且没有启用任何插件情况下进行的性能测试。
从这个数据来看,和Kong网关的性能差别不大,实际上真正考验网关性能的地方还是在各类插件启用后具体的性能情况。
对Goku网关初步分析
下面我们结合官方网站介绍和帮助文档来对里面的一些关键内容做下说明
集群化部署架构:整个部署架构图和常见的ESB总线或API网关产品类似,数据库可以采用Oracle或Mysql数据库,缓存采用Redis库进行缓存。前端通过F5或Ngnix进行负载均衡,本身网关节点是无状态的,支持集群化架构部署。但是这种情况下如何实现集群高可用,暂时没有看到进一步的细化材料。包括架构图也没有看到类似集群管理节点或zookeeper等部署。
后端服务心跳监测:通过定期检查后端服务器的可用情况,智能识别可用后端、屏蔽不可用后端,减少服务器开销。这个实际类似对后端的业务服务进行心跳监测,出现问题后进行屏蔽或预警,后端服务不可用时候实际通过API网关封装暴露的新代理服务本身也处于不可用状态。
负载均衡能力:对于后端的业务服务本身可以再通过类似Ngnix集群或K8s集群暴露集群IP地址接入,当然网关本身也支持直接将多个后端业务多节点接入到网关中,由网关对后端业务服务器阶段进行负载均衡,在采用了类似容器化和K8s或集群架构的后端来说,该功能往往并不会用到。
API健康检查,文档编写完成之后,API 定期检查节点运行状态,若节点出现异常则通过邮件或者API发送告警信息,并自动尝试重启修复节点。实际我们看到对于API的监控检查包括了两个方面,一个是通过网关封装后的API节点的监控检查,一个是后端业务API服务的监控检查。
API断线重连:请求转发失败后,网关会进行一定次数的断线重连,防止因网络闪断等原因导致API访问质量下降。这个类似我们说的服务重试机制,传统ESB总线的标准能力。该功能还是有用,主要是为了防止网络闪断引起的服务访问异常。
在网关里可以给不同的调用方或客户端设置访问策略,不同的访问策略可以设置不同的 API 访问权限、鉴权方式以及插件功能等。网关支持 开放策略 与 普通策略:
- 开放策略:系统自带访问策略,使用开放策略时不需要传递策略 ID 参数;
- 普通策略:自定义访问策略,需要传递策略 ID 参数。
网关的插件分为 策略插件 与 API插件。
- 策略插件包括:流量控制、鉴权、IP黑白名单等。
- API插件包括:参数映射、额外参数、熔断、服务降级等。
如果不使用任何插件,AGW的使用流程大致是四个步骤:
- 新建API,定义API分组,名称,请求方式等。
- 新建访问策略和访问策略绑定。
- 用户通过网关访问API。
鉴权的对象为 策略 (Strategy) ,策略可表示为一个公司、一个业务部门或一个用户。开源版网关支持以下鉴权方式:Public、Basic、Apikey。暂时没有看到基于消费访问IP地址的服务访问鉴权,不清楚是否企业版由对应的IP认证鉴权支持。
服务编排能力:服务编排在转发时可调用多个API,采用 添加Step 的方式,每个Step里可以配置转发地址,映射路径,转发方式,返回数据,重试次数,超时限制等信息。可以看到服务编排虽然不是可视化的方式,但是能够满足大部分的服务使用场景。
参数映射:功能具备,但是使用起来会比较麻烦,暂时没看到图形化或者表格方式的参数映射界面。对于参数映射不一定完全的图形化,但是提供类似阿里云API网关的表格化映射是一种可行的方式。
日志管理能力:网关系统的日志分为两大部分:请求日志(access.log)和系统运行时日志;运行时日志又分为:控制台的运行日志(console.log)、各节点的运行日志(node.log)。对于请求日志可以详细的配置日志存放路径,记录周期,具体记录的内容等。
整体相对来说,当前网关提供的日志管理能够偏弱,特别是日志信息的查看,基于服务日志运行进行的API接口服务的运行分析统计等方面的能力。
产品安装
对于Goku网关分为了管理控制台和节点服务器引擎,因此需要分开安装。在官网可以看到有两种安装方法,一种是直接安装docker镜像,一种是直接下载安装包进行安装。
在这里通过在github下载安装包进行安装。当前版本为3.1.3版本,下载后解压。可以看到里面有控制台和节点两个安装包文件。
console-3.1.3.linux-amd64.go1.12.4.tar.gz
node-3.1.3.linux-amd64.go1.12.4.tar.gz
01 控制台安装
1.安装,这里安装到/goku目录
$mkdir -p /goku
$mv console-3.1.3.linux-amd64.go1.12.4.tar.gz /tmp
$cd /tmp
$tar -xzf console-3.1.3.linux-amd64.go1.12.4.tar.gz
$cd console-3.1.3
$./install.sh /goku
$cd /goku
2.编辑配置文件goku.conf ,配置语法参照yaml
- admin_bind: 绑定节点获取配置的地址,形如IP:Port,填写内网地址或本机地址
- listen_port: 管理后台监听端口,可以开放给外网访问
- db_type: 数据库类型,v3.1.0只支持 sqlite
- db_path: sqlite db的文件路径
在这里配置文件文件参考如下:
listen_port: 7000
admin_bind: 192.168.149.132:7005
db_type:sqlite
db_path:/goku/console/db
3.进入{install dir}/console文件夹,运行run.sh文件以启动控制台
首次运行:
./run.sh start {config file} 管理员账号 管理员密码
示例:
./run.sh start config/goku.conf admin 123456
非首次运行:
./run.sh start|restart
5.在浏览器输入服务器IP 程序监听端口号,进入管理后台页面。在这里即是:http://192.168.149.132:7000 即可以访问管理界面。
02 节点安装
控制台安装完成后可以开始安装节点。我们将节点安装到/goku-node目录
$mkdir -p /goku-node
$mv node-3.1.3.linux-amd64.go1.12.4.tar.gz /tmp
$cd /tmp
$tar -xzf node-3.1.3.linux-amd64.go1.12.4.tar.gz
$cd node-3.1.3
$./install.sh /goku-node
$cd /goku-node
在节点安装完成后,登录到控制台,进入一级菜单选择网关节点,创建集群test:
在集群创建好后进入相应的集群,为不同集群 添加节点:
注意节点创建需要填写监听地址和管理地址。
其中网关文件路径填写node节点安装的路径,监听地址:用于监听节点程序;监听的端口号用于节点做请求转发,这里配为127.0.0.1:7702 。管理地址:实质上是第三方软件监听节点监控数据的地址,即前面配置127.0.0.1:7005。
在节点创建完成后,节点列表界面可以看到node key的值,这里是88e9e980186218e333786516fc838b4f,这个值在启动节点的时候需要使用。
以上完成后进入到node-3.1.1目录对节点启动,语法为:
{install dir}/run.sh {start|stop|reload|restart|force-reload} [admin url] {nodeKey}
在本次安装中为:
{install dir}/run.sh start 127.0.0.1:7005 88e9e980186218e333786516fc838b4f
在安装完成后可以进入到节点管理界面。如果节点当前状态是正常运行中,那么代表整个节点安装和配置成功。
注意,在使用最新的3.1.3版本安装的时候出现问题无法解决,后续修改为采用3.1.1版本后正常,具体安装步骤完全一致,相关内容不再修改。
服务接入验证
对于简单的API接口服务代理转发,具体流程如下:
下面还是用前面Konga网关的例子来进行接入测试。具体公网可以访问的地址为:
https://api.binstd.com/area/province?appkey=******
第一步:新建项目
这里建立一个test的项目,同时进入项目后,点击新建普通接口。
第二步:新建接口
第三步:新建策略并绑定到接口
第四步:最后保存和发布配置即可。
网关通过节点来转发请求,所以需要填写具体的 节点IP 或 节点域名 来访问请求,完整路径为 节点IP/URL。策略ID作为Header/Body/Url参数,参数字段均为:Strategy-Id。
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/share/16966.html