为什么要使用Apinto API Gateway
Apinto 是专门为微服务架构设计的开源 API 网关,完全由 Go 语言开发,拥有目前市面上最强的性能及稳定性表现,并且可以自由扩展几乎所有功能模块。 提供丰富的流量管理、数据处理、协议转换等功能,例如动态路由、负载均衡、服务发现、熔断降级、身份认证、监控与告警等。
完全开源
优异的性能表现
丰富的功能
极低的使用和维护成本
良好的扩展性
快速与第三方工具连接(后续支持)
简单地介绍完Apinto后,接下来我们以运行Docker容器的方式来快速启动Apinto网关。
启动Docker容器
容器运行配置说明
容器有两个可挂载目录:
/var/lib/apinto
#目录结构如下
/data #存放配置快照文件
/log #存放日志文件
/extends #存放扩展
/etc/apinto
:
#该目录下存放配置文件
config.yml
该文件用于配置网关的路由监听端口、openAPI监听端口等信息。
备注:config.yml文件内容参考点此跳转。
默认配置文件的内容如下:
listen: # node listen port
- 8080
admin: # openAPI request info
scheme: http # listen scheme
listen: 9400 # listen port
ip: 0.0.0.0 # listen ip
默认路由监听端口为8080,openAPI监听端口为9400。
接下来的容器运行示例均使用默认端口配置。
容器运行示例(挂载目录)
docker run -td -p 8080:8080 -p 9400:9400 \
-v /data/apinto/data-dir:/var/lib/apinto \
-v /data/apinto/config-dir:/etc/apinto \
--name=apinto_node eolinker/apinto-gateway:latest
备注:若挂载了配置目录/etc/apinto
,那么端口映射请以具体的配置文件为主。
容器运行示例(不挂载目录)
docker run -td -p 8080:8080 -p 9400:9400 \
--name=apinto_node eolinker/apinto-gateway:latest
成功启动容器后,紧接着快速演示如何使用Apinto网关
快速上手
使用Apinto进行转发最快仅需要两步:配置服务+配置路由
备注:调用Apinto容器的open api既可以直接通过127.0.0.1:9400
,也可以通过获取容器的ip进行调用,比如
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${CONTAINNER ID}
#获得172.17.0.2 使用172.17.0.2:9400调用Apinto的open api
以下示例使用前者。
配置服务:
配置的匿名服务为官方示例接口demo-apinto.eolink.com:8280
,该接口会返回http请求的头部及内容。
curl -X POST http://127.0.0.1:9400/api/service \
-H "Content-type: application/json" \
-d '{
"name": "apintoapi",
"driver": "http",
"desc": "访问demo",
"timeout": 3000,
"anonymous": {"type": "round-robin","config": "demo-apinto.eolink.com:8280"},
"retry": 3,
"scheme": "http"
}'
返回内容:
{
"create": "2022-03-30 09:23:20",
"driver": "http",
"id": "apintoapi@service",
"name": "apintoapi",
"profession": "service",
"update": "2022-03-30 09:23:20"
}
配置路由:
配置的路由规则很简单,仅使用完全匹配。但Apinto的动态路由非常灵活,示例仅仅是最精简的用法。详情点击链接跳转至教程。
target
填写服务id,监听端口listen
为8080。
注意:此处监听端口填写的必须存在于配置文件config.yml中。
curl -X POST http://127.0.0.1:9400/api/router \
-H "Content-type: application/json" \
-d '{
"name": "apintoapi",
"driver": "http",
"desc": "http",
"listen": 8080,
"rules": [{
"location": "/demo"
}],
"target": "apintoapi@service"
}'
返回:
{
"create": "2022-03-30 09:30:46",
"driver": "http",
"id": "apintoapi@router",
"name": "apintoapi",
"profession": "router",
"update": "2022-03-30 09:30:46"
}
进行转发
curl 'http://127.0.0.1:8080/demo'
返回
{
"body": "",
"header": {
"Accept": ["*/*"],
"User-Agent": ["curl/7.68.0"],
"X-Forwarded-For": ["172.17.0.1,172.17.0.1"]
},
"host": "127.0.0.1:8080",
"method": "GET",
"path": "/demo",
"query": {},
"remote_addr": "182.254.227.32:38064",
"url": "/demo"
}
配置插件进行快速转发
Apinto现支持如下插件:
- 额外插件
- 参数映射
- 转发重写
- IP黑白名单
- 流量控制鉴权
- 响应重写
- API熔断
- 跨域CORS
- gzip压缩
- access_log
若配置多个插件,还可以选择插件的执行顺序以及执行阶段。具体说明点击链接跳转。
全局插件配置
这里配置了一个name
为my_extra_params的额外参数插件,在service阶段执行,并且状态为启动。
另外只要name不同,就可以配置复数个同种插件。
备注:status还可以是global,表示全局插件,但需要配置具体的config参数。更多说明点此跳转。
curl -X POST 'http://127.0.0.1:9400/api/setting/plugin' \
-H 'Content-Type:application/json' \
-d '{
"plugins": [{
"id": "eolinker.com:apinto:extra_params",
"name": "my_extra_params",
"type": "service",
"status": "enable"
}]
}'
返回
{
"create": "2022-03-30 09:53:07",
"driver": "plugin",
"id": "plugin@setting",
"name": "plugin",
"profession": "setting",
"update": "2022-03-30 10:07:59"
}
配置服务
服务配置了my_extra_params
插件,具体配置是在转发请求的query参数上加上test=2
curl -X POST 'http://127.0.0.1:9400/api/service' \
-H 'Content-Type:application/json' \
-d '{
"name": "paramService",
"driver": "http",
"timeout": 3000,
"retry": 3,
"scheme": "http",
"anonymous": {
"type": "round-robin",
"config": "demo.gokuapi.com:8280"
},
"plugins": {
"my_extra_params": {
"disable": false,
"config": {
"params": [{
"name": "test",
"position": "query",
"value": "2",
"conflict": "Convert"
}],
"error_type": "text"
}}}}'
返回
{
"create": "2022-03-30 10:10:54",
"driver": "http",
"id": "paramservice@service",
"name": "paramService",
"profession": "service",
"update": "2022-03-30 10:10:54"
}
配置路由
curl -X POST 'http://127.0.0.1:9400/api/router' \
-H 'Content-Type:application/json' \
-d '{
"name": "paramsRouter",
"driver": "http",
"desc": "http",
"listen": 8080,
"rules": [{
"location": "/demo"
}],
"target": "paramService@service"
}'
返回
{
"create": "2022-03-30 10:11:50",
"driver": "http",
"id": "paramsrouter@router",
"name": "paramsRouter",
"profession": "router",
"update": "2022-03-30 10:11:50"
}
进行转发
curl 'http://127.0.0.1:8080/demo'
返回
{
"body": "",
"header": {
"Accept": ["*/*"],
"User-Agent": ["curl/7.68.0"],
"X-Forwarded-For": ["172.17.0.1,172.17.0.1"]
},
"host": "127.0.0.1:8080",
"method": "GET",
"path": "/demo",
"query": {
"test": ["2"]
},
"remote_addr": "182.254.227.32:40458",
"url": "/demo?test=2"
}
从返回的json可以看出请求参数query携带了test=2
更多的使用可以参考下方的教程地址。
相关链接