“微服务体系结构”部署nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios

了解出名的Nginx服务器(微服务必不可少的东西)怎么用作API网关。

现代应用程序体系结构的中心是HTTP API。 HTTP使应用程序能够快速构建并轻松维护。不管应用程序的规划怎么,HTTP API都供给了一个通用接口,从单用处微服务到包罗万象的全体。通过运用HTTP,支撑超大规划Internet特点的Web应用程序交给的前进也可用于供给牢靠和高性能的API交给。

有关API网关对微服务应用程序重要性的精彩介绍,请参阅咱们博客上的构建微服务:运用API​​网关。

作为抢先的高性能,轻量级反向署理和负载均衡器,NGINX Plus具有处理API流量所需的高档HTTP处理功用。这使得NGINX Plus成为构建API网关的抱负渠道。在这篇博文中,咱们描绘了许多常见的API网关用例,并展现了怎么装备NGINX Plus以便以高效,可扩展且易于维护的办法处理它们。咱们描绘了一个完好的装备,它能够构成出产布置的根底。

留意:除非还有阐明,不然本文中的一切信息均适用于NGINX Plus和NGINX开源。

介绍Warehouse API

API网关的首要功用是为多个API供给单一,共同的进口点,不管它们在后端怎么完成或布置。并非一切API都是微服务应用程序。咱们的API网关需求办理现有的API,单块和正在部分过渡到微服务的应用程序。

在这篇博文中,咱们引证了一个假定的库存办理API,即“库房API”。咱们运用示例装备代码来阐明不同的用例。 Warehouse API是一个RESTful API,它运用JSON恳求并生成JSON呼应。可是,当布置为API网关时,运用JSON不是NGINX Plus的约束或要求; NGINX Plus与API自身运用的架构风格和数据格局无关。

Warehouse API完成为离散微服务的调集,并作为单个API发布。库存和定价资源作为独自的服务施行,并布置到不同的“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios 后端。所以API的途径结构是:

api └── warehouse 
├── inventory
└── pricing

例如,要查询当时库房库存,客户端应用程序会向/ api / warehouse / inventory宣布HTTP GET恳求。

安排NGINX装备

运用NGINX Plus作为API网关的一个长处是,它能够履行该人物,一同充任现有HTTP流量的反向署理,负载平衡器和Web服务器。假如NGINX Plus已经是应用程序交给库房的一部分,那么一般不需求布置独自的API网关。可是,API网关所期望的某些默许行为与根据浏览器的流量的预期不同。出于这个原因,咱们将API网关装备与根据浏览器的流量的任何现有(或未来)装备分隔。

为完成这种别离,咱们创立了一个支撑多用处NGINX Plus实例的装备布局,并为通过CI / CD管道主动装备布置供给了便当的结构。 / etc / nginx下的成果目录结构如“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios 下所示。

etc/ └── nginx/ 
├── api_conf.d/ ....................................... Subdirectory for per-API configuration
│ └── warehouse_api.conf ...... Definition and policy of the Warehouse API
├── api_backends.conf ..........“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios ........... The backend services (upstreams)
├── api_gateway.conf ........................ Top-level configuration for the API gateway server
├── api_json_errors.conf ............ HTTP error responses in JSON“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios format
├── conf.d/
│ ├── ...
│ └── existing_国际十大名表apps.conf
└── nginx.conf

一切API网关装备的目录和文件名都以api_为前缀。这些文件和目录中的每一个都启用API网关的不同特性和功用,并鄙人面具体阐明。

界说尖端API网关

一切NGINX装备都以主装备文件nginx.conf最初。要读入API网关装备,咱们在nginx.conf的http块中增加一个指令,该指令引证包括网关装备的文件api_gateway.conf(下面的第28行)。请留意,默许的nginx.conf文件运用include伪指令从conf.d子目录中引进根据浏览器的HTTP装备(第29行)。本博文广泛运用include指令来进步可读性并完成装备某些部分的主动化。

 include /etc/nginx/api_gateway.conf; # All API gateway configuration
include /etc/nginx/conf.d/*.conf; # Regular web traffic

api_gateway.conf文件界说了将NGINX Plus揭露为客户端的API网关的虚拟服务器。此装备揭露API网关在单个进口点https://api.example.co“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios m/(第13行)发布的一切API,受第16到21行装备的TLS维护。请留意,此装备纯粹是HTTPS - 没有明文HTTP侦听器。咱们期望API客户端知道正确的进口点并默许进行HTTPS衔接。

log_format api_main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" "$http_user_agent"'
'"$http_x_forwarded_for" "$api_name"';

include api_backend生计游戏s.conf;
include api_keys.conf;

server {
set $api_name -; # Start with an undefined API name, each API will update this value
access_log /var/log/nginx/api_access.log api_main; # Each API may also log to a 尚胜法separate file

listen 443 ssl;
server_name api.example.com;

# TLS config
ssl_certificate /etc/ssl/certs/api.example.com.crt;
ssl_certificate_key /etc/ssl/private/api.example.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols TLSv1.1 TLSv1.2;

# API definitions, one per f黑暗面ile
include api_conf.d/*.conf;

# Error responses
error_page 404 = @400; # Invalid paths are treated as bad requests
proxy_intercept_errors on; # Do not send backend errors to the client
include api_json_errors.conf; # API client friendly JSON error responses
default_type application/json; # If no content-type then assume JSON
}

此装备是静态的 - 各个API及其后端服务的具体信息在第24行的include伪指令引证的文件中指定。第27到30行处理日志记载默许值和过错处理,并在呼应中评论过错部分如下。

单服务与微服务API后端

一些API能够在单个后端完成,可是出于弹性或负载平衡的原因,咱们一般期望存在多个API。运用微服务API,咱们为每个服务界说独自的后端;它们一同作为完好的API。在这儿,咱们的Warehouse API被布置为两个独立的服务,每个服务都有多个后端。

upstream warehouse_inventory {
zone inventory_service 64k;
server 10.0.0.1:80;
server 10.0.0.2:80;
server 10.0.0.3:80;
}

upstream warehouse_pricin“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios g {
zone pricing_service 64k;
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}

API网关发布的一切API的一切后端API服务都在api_backends.conf中界说。这儿咱们在每个块中运用多个IP地址 - 端口对来指示API代码的布置方位,但也能够运用主机名。 NGINX Plus订户还能够运用动态DNS负载平衡,主动将新后端增加到运行时装备中。

界说Warehouse API

装备的这一部分首要界说Warehouse API的有用URI,然后界说用于处理对Warehouse API的恳求的公共战略。

# API d朔州天气预报efinition
#
location /api/warehouse/inventory {
set $upstream warehouse_inventory;
rewrite ^ /_warehouse last;
}

location /api/warehouse/pricing {
set $upstream warehouse_pricing;
re高粱米水饭write ^ /_warehouse last;
}

# Policy section
#
location = /_warehouse {
inter刘志军nal;
set $api_name "Warehouse";

# Policy configuration here (authentication, rate limiting, logging, more...)

proxy_pass http://$upstream$request_uri;
}

Warehouse API界说了许多块。 NGINX Plus具有高效灵敏的体系,可将恳求URI与装备的一部分进行匹配。一般,恳求由最具体的途径前缀匹配,而且方位指令的次序并不重要。这儿,在第3行和第8行,咱们界说了两个途径前缀。在每种状况下,$ upstream变量都设置为上游块的称号,该上游块别离代表库存和定价服务的后端API服务。

此装备的方针是将API界说与办理API交给办法的战略分隔。为此,咱们最小化了API界说部分中显现的装备。在为每个方位确认恰当的上游组之后,咱们中止处理并运用指令来查找API的战略(第10行)。

运用重写指令将处理移至API战略部分

重写指令的成果是NGINX Plus查找匹配以/ _warehouse最初的URI的方位块。第15行的方位块运用=修饰符履行彻底匹配,然后加速处理速度。

在这个阶段,咱们的方针部分十分简略。方位块自身标记为第16行,这意味着客户端无法直接向它宣布恳求。从头界说$ api_name变量以匹配API的称号,以便它在日志文件中正确显现。终究,恳求被署理到API界说部分中指定的上游组,运用$ request_uri变量 - 其间包括原始恳求URI,未经修正。

挑选广泛或许准确的API界说

API界说有两种办法 - 广泛而准确。每种API最合适的办法取决于API的安全要求以及后端服务“微服务体系结构”布置nginxplus作为ngapi网关,第1部分1-nginx-必威手机版_必威体育手机客户端_必威体育app ios 是否需求处理无效的URI。

在warehouse_api_simple.conf中,咱们通过在第3行和第8行界说URI前缀来运用Warehouse API的广泛办法。这意味着以任一前缀最初的任何URI都署理到相应的后端服务。运用根据前缀的方位匹配,对以下URI的API恳求都是有用的:

  • /api/warehouse/inventory
  • /api/warehouse/inventory/
  • /api/warehouse/inventory/foo
  • /api/warehouse/inventoryfoo
  • /api/warehouse/inventoryfoo/bar/

假如仅有的考虑是将每个恳求署理到正确的后端服务,则广泛的办法供给最快的处理和最紧凑的装备。另一方面,准确的办法使API网关能够通过显式界说每个可用API资源的URI途径来了解API的完好URI空间。选用准确的办法,Warehouse API的以下装备运用准确匹配(=)和正则表达式(〜)的组合来界说每个URI。

location = /api/warehouse/inventory { # Complete inventory
se金价走势t $upstream inventory_service;
rewrite ^ /_warehouse last;
}

location ~ ^/api/warehouse/inventory/shelf/[^/]*$ { # Shelf inventory
set $upstream inventory_service;
rewrite ^ /_warehouse last;
}

location ~ ^/tempapi/warehouse/inventory/shelf/[^/]*/box/[^/]*$ { # Box on shelf
set $upstream inventory_service;
rewrite ^ /_warehouse last;
}

location ~ ^/api/warehouse/pricing/[^/]*$ { # Price for specific item
set $upstream pricing_service;
rewrite ^ /_warehouse last;
}

此装备更具体,但更准确地描绘了后端服务完成的资源。这具有维护后端服务免于格局过错的客户端恳求的长处,价值是正常表达式匹配的一些小额定开支。有了这个装备,NGINX Plus承受一些URI并回绝其他URI无效:

运用准确的API界说,现有的API文档格局能够驱动API网关的装备。能够从OpenAPI标准(曾经称为Swagger)主动化NGINX Plus API界说。此博客文章的Gists中供给了用于此意图的示例脚本。

重写客户恳求

跟着API的开展,有时会发作需求更新客户端的严重更改。一个这样的示例是重命名或移动API资源。与Web浏览器不同,API网关无法向其客户端发送命名新方位的重定向(代码301)。走运的是,当修正API客户端不切实际时,咱们能够动态地重写客户端恳求。

鄙人面的示例中,咱们能够在第3行看到定价服务曾经是作为库存服务的一部分完成的:rewrite指令将对旧定价资源的恳求转换为新的定价服务。

# Rewrite rules
#
rewrite ^/api/warehouse/inventory/item/price/(.*) /api/warehouse/pricing/$1;

# API definition
#
location /api/warehouse/inventory {
set $upstream inventory_service;
rewrite ^(.*)$ /_warehouse$1 last;
}

location /api/warehouse/pricing {
set $upstream pricing_service;
rewrite ^(.*) /_warehouse$1 last;
}

# Policy section
#
location /_warehouse {
internal;
set $api_name "Warehouse";

# Policy configuration here (authentication, rate limiting, logging, more...)

rewrite ^/_warehouse/(.*)$ /$1 break; # Remove /_warehouse prefix
proxy_pass http://$upstream; # Proxy the rewritten URI
}

动态重写URI意味着当咱们终究在第26行署理恳求时,咱们不能再运用$ request_uri变量(正如咱们在warehouse_api_simple.conf的第21行所做的那样)。这意味着咱们需求在API界说部分的第9行和第14行运用略微不同的重写指令,以便在处理切换到战略部分时保存URI。

回应过错

HTTP API和根据浏览器的流量之间的首要差异之一是怎么将过错传达给客户端。当NGINX Plus作为API网关布置时,咱们将其装备为以最适合API客户端的办法回来过错。

# Error responses
error_page 404 = @400; # Invalid paths are treated as bad requests
proxy_intercept_errors on; # Do not send backend errors to the client
include api_json_errors.conf; # API client friendly JSON error responses
default_type application/json; # If no content-type then assume JSON

尖端API网关装备包括一个界说怎么处理过错呼应的部分。

第27行的指令指定当恳求与任何API界说都不匹配时,NGINX Plus会回来过错而不是默许过错。此(可选)行为要求API客户端仅向API文档中包括的有用URI宣布恳求,并避免未经授权的客户端发我国铁塔现通过API网关发布的API的URI结构。

第28行指的是后端服务自身漏电开关发生的过错。未处理的反常或许包括咱们不期望发送到客户端的库房盯梢或其他敏感数据。此装备通过向客户端发送标准化过错来进一步供给维护。

完好的过错呼应列表在第29行的include伪指令引证的独自装备文件中界说,其前几行如下所示。假如首选不同的过错格局,而且通过更改第30行上的default_type值以匹配,则能够修正此文件。您还能够在每个API的战略部分中运用独自的include指令来界说一组掩盖默许值的过错呼应。

error_page 400 = @400;
location @400 { return 400 '{"status":400,"message":"Bad request"}\n'; }

error_page 401 = @401;
location @401 { return 401 '{"status":401,"message":"Unauthorized"}\n'; }

error_page 403 = @403;
location @403 { return 403 '{"status":403,"message":"Forbidden"}\n'; }

error_page 404 = @404;
location @404 { return 404 '{"status":404,"message":"Resource not found"}\n'; }

有了这种装备,客户端对无效URI的恳求就会收到以下呼应。

$ curl -i https://api.example.com/foo 
HTTP/1.1 400 Bad Request
Server: nginx/1.13.10
Content-Type: application/json
Content-Length: 39
Connection: keep-alive

{"status":400,"message":"Bad request"}


施行身份验证

在没有某种方式的身份验证的状况下发布API以维护它们是不常见的。 NGIN潘承建X Plus供给了几种维护API和验证API客户端的办法。有关根据IP地址的拜访操控列表(ACL),数字证书身份验证和HTTP基自身份验证的信息,请参阅文档。在这儿,咱们专心于API特定的罗盘的运用办法图解身份验证办法。

API密钥身份验证

API密钥是客户端和API网关已知的同享密钥。它们本质上是作为长时间凭据发布给API客户端的长而杂乱的暗码。创立API密钥很简略 - 只需编码一个随机数,如本例所示。

 openssl rand -base64 18 7B5zIqmRGXmrJTFmKa99vcit

在尖端API网关装备文件api_gateway.conf的第6行,咱们乳腺炎症状包括一个名为api_keys.conf的文件,其间包括每个API客户端的API密钥,由客户端称号或其他描绘标识。

map $http_apikey $api_client_name {
default "";

"7B5zIqmRGXmrJTFmKa99vcit" "client_one";
"QzVV6y1EmQFbbxOfRCwyJs35" "client_two";
"mGcjH8Fv6U9y3BVF9H3Ypb9T" "client_six";
}

API密钥在块中界说。 map指令有两个参数。第一个界说了API密钥的方位,在本例中是在$ http_apike神祇禹枫y变量中捕获的客户端恳求的apikey HTTP头。第二个参数创立一个新变量($ api_client_name)并将其设置为第一个参数与键匹配的行上的第二个参数的值。

例如,当客户端供给API密钥7B5zIqmRGXmrJTFmKa99vcit时,$ api_client_name变量设置为client_one。此变量可用于检查通过身份验证的客户端,并包括在日志条目中以进行更具体的审阅。

地图块的格局很简略,易于集成到主动化作业流程中,从现有的凭据存储生成api_keys.conf文件。 API密钥身份验证由每个API的战略部分强制履行。

# Policy section
#
location = /_warehouse {
internal;
set $api_name "Warehouse";

if ($http_apikey = "") {
return 40pla1; # Unauthorized (please authenticate)
}
if ($api_client_name = "") {
return 403; # Forbidden (invalid API key)
}

proxy_pass http://$upstream$request_uri;
}

客户端应在apikey HTTP头中显现其API密钥。假如此标头丢掉或为空(第20行),咱们发送401呼应以奉告客户端需求进行身份验证。第23行处理API键与地图块中的任何键都不匹配的状况 - 在这种状况下,api_keys.conf第2行的默许参数将$ api_client_name设置为空字符串 - 咱们发送403呼应告知身份验证失利的客户端。

有了这个装备,Warehouse API现在能够完成API密钥身份验证。

$ curl h42岁美魔女ttps://api.example.com/api/warehouse/pricing/item001 
{"status":401,"message":"Unauthorized"}
$ curl -H "apikey: thisIsInvalid" https://api.example.com/api/warehouse/pricing/item001
{"status":403,"message":"Forbidden"}
$ curl -H "apikey: 7B5zIqmRGXmrJTFmKa99vcit" https://api.example.com/api/warehouse/pricing/item001
{"sku":"item001","price":179.99}

JWT身份验证

JSON Web令牌(JWT)越来越多地用于API身份验证。原生JWT支撑是NGINX Plus独有的,能够在咱们的博客上验证JWT,如运用JWT和NGINX 一半海水一半火焰Plus验证API客户端中所述。

摘要

本系列的第一篇博客具体介绍了将NGINX Plus布置为API网关的完好处理娄烨计划。能够从咱们的GitHub Gist库房检查和下载此博客中评论的完好文件集。本系列的下一篇博客将评论更高档的用例,以维护后端服务免受歹意或行为不端的客户端的进犯。

原文:https://dzone.com/articles/deploying-nginx-plus-as-an-api-gateway-part-1-ngin

本文:http://pub.intelligentx.net/deploying-nginx-plus-api-gateway-part-1-nginx

评论:请参加常识星球或许小红圈【首席架构师圈】

评论(0)