帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:PERF  BASE  Gateway  openresty  GATE  Nginx  API  
A Performant API Gateway based on Openresty and Nginx

  • 源代码名称:apigateway
  • 源代码网址:http://www.github.com/adobe-apiplatform/apigateway
  • apigateway源代码文档
  • apigateway源代码下载
  • Git URL:
    git://www.github.com/adobe-apiplatform/apigateway.git
  • Git Clone代码到本地:
    git clone http://www.github.com/adobe-apiplatform/apigateway
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/adobe-apiplatform/apigateway
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • apigateway

    基于Openresty和 Nginx的高性能API网关。

    目录状态

    当前项目被认为是生产就绪。

    快速启动
    docker run --name="apigateway" 
     -p 80:80 
     -e"MARATHON_HOST=http://<marathon_host>:<port>" 
     -e"LOG_LEVEL=info" 
     adobeapiplatform/apigateway:latest

    这个命令启动一个API网关,它自动发现在马拉松中运行的服务。 发现服务在单独的VHosts上公开,就像你在配置文件中看到的那样。

    在本地访问马拉松应用

    例如如果你有名为 hello-world的应用程序,你可以通过 2种方式在它的VHost上访问它:

    • 编辑 /etc/hosts 并添加 <docker_host_ip> hello-world.api.localhost 然后浏览到 http://hello-world.api.localhost
    • 在curl命令中发送主机标头: curl -H"Host:hello-world.api.localhost" http://<docker_host_ip>

    发现脚本提供一个快速启动的示例,它可以用你喜欢的发现机制替换。 脚本更新一个包含所有在文件中使用的所有 Nginx upstreams的配置文件

    远程访问马拉松应用

    你所需要做的就是创建一个像 *.api.example.com 或者 *.gw.example.com 这样的DNS条目,并让它解析为运行网关的节点。

    假设在马拉松中部署了一个名为 hello-world的应用程序,可以在以下网址访问它: http://hello-world.api.example.com 网关自动将请求代理到 hello-world 中的应用程序。

    如果你打电话 http://my-custom-app.api.example.com 网关将代理一个名为 my-custom-app的马拉松应用。 如果应用程序不能在马拉松中部署,5xx 错误将返回给客户机。 这种行为当然是可以配置的。

    使用不同的配置文件夹运行

    简化网关配置的一种方法是复制S3中的api-gateway-config 文件夹,使所有节点都从该位置同步。 目前只支持 AWS S3,但计划也要增加对其他云的支持。

    为了使用 S3,网关需要知道 bucket 。 这个命令类似于上面的一个额外的环境变量 REMOTE_CONFIG

    docker run --name="apigateway" 
     -p 80:80 
     -e"MARATHON_HOST=http://<marathon_host>:<port>" 
     -e"REMOTE_CONFIG=s3://api-gateway-config-bucket" 
     -e"LOG_LEVEL=info" 
     adobeapiplatform/apigateway:latest

    s3://api-gateway-config-bucket 应该包含与 api-gateway-config文件夹中的内容类似的内容。 对于任何定制,最好从那里开始。 只有 2个文件不会同步:

    • /etc/api-gateway/conf.d/includes/resolvers.conf 了解更多信息
    • https://github.com/adobe-apiplatform/apigateway/blob/master/api-gateway-config/environment.conf.d/api-gateway-upstreams.http.conf 它是由马拉松发现脚本自动生成的。

    默认情况下,使用IAM角色可以访问 bucket,但也可以通过 环境变量 指定AWS凭据:

    docker run --name="apigateway" 
     -p 80:80 
     -e"MARATHON_HOST=http://<marathon_host>:<port>" 
     -e"REMOTE_CONFIG=s3://api-gateway-config-bucket" 
     -e"AWS_ACCESS_KEY_ID=--change-me--" 
     -e"AWS_SECRET_ACCESS_KEY=--change-me--" 
     -e"LOG_LEVEL=info" 
     adobeapiplatform/apigateway:latest

    默认情况下,远程配置会检查每个 10s的更改,并且可以通过 REMOTE_CONFIG_SYNC_INTERVAL env变量配置。 在更改此值时,需要考虑以下几个事项:

    • 配置真正改变的频率
    • 某些工具可能会对每个文件发出 1个API请求来进行比较。 换句话说,72配置文件中的检查每个 10s 成本 $7.46 但当检查每个 30s 时,它只是 $2.4,of 。
    • API请求的平均时间。 在重新加载GW时,现有的Nginx 进程处理活动连接一直保持在后台,直到请求完成。 所以重载网关太快可能会导致同时运行太多进程的副作用。 这个可能是问题,也可能不是问题,但要注意它。
    冲突解决程序

    启动这里容器时,自动创建 /etc/api-gateway/conf.d/includes/resolvers.conf 使用 /etc/resolv.conf 作为源的配置文件。 要了解有关 Nginx 中 resolver 指令的更多信息,请参见文档

    在马拉松和Mesos之外运行API网关

    除了现在依赖于马拉松的发现部分,API网关也可以以自己运行。 马拉松服务发现是用 -e"MARATHON_HOST=http://<marathon_host>:<port>/"

    MODULE 版本细节内的内容
    Openresty1.9.7.3安装在 /usr/local/sbin/api-gateway
    Openresty 编译的--with-debug1.9.7.3安装在 /usr/local/sbin/api-gateway-debug 中,支持调试日志。
    测试 Nginx0.24用于从容器执行集成测试。
    它安装在 /usr/local/test-nginx-0.24/ 中。
    在 Docker 构建过程中,它还可以在lua模块上执行 make test
    8.37支持PCRE的JIT支持
    ZeroMQ4.0.5ZeroMQ
    CZMQ2.2.0CZMQ - 针对ZeroMQ的高级C 绑定
    用于API管理和日志 MODULE 版本描述的模块
    api-gateway-config-supervisor1.0.0从 Amazon S3重新同步配置文件以使用更新重新加载网关
    api-gateway-cachemanager1.0.1用于管理多个缓存存储的Lua库
    api-gateway-hmac1.0.0HMAC支持多种算法的Lua,通过OpenSSL和 FFI
    api-gateway-aws1.7.1面向 Nginx的面向的AWS SDK
    api-gateway-request-validation1.2.4API请求验证框架
    api-gateway-async-logger1.0.1高性能异步记录器
    api-gateway-zmq-logger1.0.0带有FFI和CZMQ的ZMQ的Lua记录器
    api-gateway-request-tracking1.0.1API网关的使用和跟踪处理程序
    其他Lua模块 MODULE 版本描述
    lua-resty-httpv0.07用于 openresty/ngx_lua的Lua HTTP客户端cosocket驱动程序
    lua-resty-iputilsv0.2.0用于在Openresty中处理IP地址的实用函数
    性能

    在具有 8个CPU内核和 4GB 内存的虚拟机上获得了以下性能测试结果。

    API网关容器已经开始使用 4个CPU内核和 net=host:

    docker run --cpuset-cpus=0-3 --net=host --name="apigateway" -e "LOG_LEVEL=notice" adobeapiplatform/apigateway:latest

    WRK测试已经开始使用 4个CPU内核和 net=host:

    docker run --cpuset-cpus=4-7 --net=host williamyeh/wrk:4.0.1 -t4 -c1000 -d30s http://<docker_host_ip>/health-check
    Running 30s test @ http://192.168.75.158/health-check
     4 threads and 1000 connections
     Thread Stats Avg Stdev Max +/- Stdev
     Latency 30.38ms 73.80ms 1.16s 90.90%
     Req/Sec 35.26k 11.98k 83.70k 68.72%
     4214013 requests in 30.06s, 1.28GB readRequests/sec: 140165.09
    Transfer/sec: 43.57MB
    开发人员指南

    要在本地生成 Docker 映像,请执行以下操作:

     make docker

    要在新生成的映像中使用 SSH,请使用( 请注意,这不是运行的映像):

     make docker-ssh
    正在运行和停止 Docker 映像
     make docker-run

    主API网关进程暴露在端口 80 中。 要测试网关是否正常工作,请查看它的health-check:

     $ curl http://<docker_host_ip>/health-check
     API-Platform is running!

    如果你要进行快速性能测试,可以通过 Docker 来玩Apache基准测试:

     docker run jordi/ab ab -k -n 200000 -c 500 http://<docker_host_ip>/health-check

    要运行 Docker,请将本地 api-gateway-config 目录安装到 /etc/api-gateway/ 问题中:

    $ make docker-debug

    在调试模式下,Docker 容器启动一个特殊的api-gateway 编译 --with-debug,提供非常详细的调试信息。 当使用 -e"LOG_LEVEL=info" 启动时,输出非常冗长。 要了解有关这里选项的更多信息,请访问 Nginx 文档

    完成后停止图像:

    make docker-stop

    通过Redis启用API密钥管理

    这里命令启动两个 Docker 容器: redis和网关

    make docker-compose

    SSH进入运行映像

    make docker-attach
    with Marathon Marathon

    启用 HTTP POST http://<marathon-host>/v2/apps 使用以下有效负载。为了优化性能,请在 HOST 模式下保留 network 。 要了解更多关于网络模式的信息,请访问 Docker 文档。

    {
     "id":"api-gateway",
     "container": {
     "type":"DOCKER",
     "docker": {
     "image":"adobeapiplatform/apigateway:latest",
     "forcePullImage":true,
     "network":"HOST" }
     },
     "cpus":4,
     "mem":4096.0,
     "env": {
     "MARATHON_HOST":"http://<marathon_host>:<marathon_port>" },
     "constraints": [ [ "hostname","UNIQUE" ] ],
     "ports": [ 80 ],
     "healthChecks": [
     {
     "protocol":"HTTP",
     "portIndex":0,
     "path":"/health-check",
     "gracePeriodSeconds":3,
     "intervalSeconds":10,
     "timeoutSeconds":10 }
     ],
     "instances":1}

    要只在标记为 slave_public的特定节点上运行网关,可以将属性波纹管添加到主JSON对象中:

    "acceptedResourceRoles": ["slave_public" ]
    在网关中自动发现和 register-马拉松任务

    要在带有马拉松框架的Mesos中启用自动发现,请定义以下 环境变量:

    MARATHON_URL=http://<marathon-url-1>
    MARATHON_TASKS=ws-.* ( NOT USED NOW. TBD IF THERE'S A NEED TO FILTER OUT SOME TASKS )

    因此 Docker 命令现在是:

    docker run --name="apigateway" 
     -p 8080:80 
     -e"MARATHON_HOST=http://<marathon_host>:<port>/" 
     -e"LOG_LEVEL=info" 
     adobeapiplatform/apigateway:latest


    文章标签:API  BASE  PERF  Nginx  GATE  Gateway  openresty  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语