API 网关详细介绍(下)

电子说

1.3w人已加入

描述

三、Kong Admin API

部署好 Kong 之后,则需要将我们自己的接口加入到 Kong 的中管理,Kong 提供了比较全面的RESTful API,每个版本会有所不同,详细可以参考官网:docs.konghq.com/2.0.x/admin… 。Kong 管理 API 的端口是 8001(8444),服务、路由、配置都是通过这个端口进行管理,所以部署好之后页面可以直接访问 http://102.168.1.200:8001

这里我们先来了解一下如何使用 RESTful 管理接口来管理 Service (服务)、Route(路由)。

  1. 添加一个Service

curl -i -X POST http://localhost:8001/services --data 'name=hello-service' --data 'url=http://localhost:9000/hello'

网关

curl -i -X POST --url http://localhost:8001/services/ --data 'name=example-service' --data 'url=http://www.baidu.com/'

2.查询Service

curl http://192.168.1.200:8001/services/hello-service
  curl -i -X POST --url http://localhost:8001/services/example-service/routes --data 'hosts[]=example.com'

网关

网关

3.为 Service 添加一个 Route

curl -i -X POST --url http://192.168.1.200:8001/services/hello-service/routes  --data 'paths[]=/hello' --data name=hello-route

网关

4.测试

我们可以通过访问 http://192.168.1.200:8000/hello 来验证一下配置是否正确。

Kong代理:
 url http://192.168.1.200:8000/hello
 Hello world !

真实服务: http://192.168.1.200:9000/hello/

前面的操作就等效于配置 nginx.conf:

server {
   listen 8000;
   location /hello {
     proxy_pass http://192.168.1.200:9000/hello;
   }
 }

不过,前面的配置操作都是动态的,无需像 Nginx一样需要重启。

Service是抽象层面的服务,它可以直接映射到一个物理服务,也可以指向一个Upstream(同Nginx中的Upstream,是对上游服务器的抽象)。Route是路由的抽象,它负责将实际的请求映射到 Service。除了Serivce、Route之外,还有 Tag、Consumer、Plugin、Certificate、SNI、Upstream、Target等,读者可以从 官网的介绍文档 中了解全貌。

下面在演示一个例子,修改 Service,将其映射到一个 Upstream:

添加 name为 hello-upstream 的 Upstream

curl -i -X POST http://192.168.1.200:8001/upstreams --data name=hello-upstream

网关

为 mock-upstream 添加 Target,Target 代表了一个物理服务(IP地址/hostname + port的抽象),一个Upstream可以包含多个Targets

curl -i -X POST http://192.168.1.200:8001/upstreams/hello-upstream/targets  --data target="192.168.1.200:9000"

网关

修改 hello-service,为其配置

curl -i -X PATCH  http://192.168.1.200:8001/services/hello-service --data url='http://hello-upstream/hello'

网关

上面的配置等同于 Nginx 中的nginx.conf配置 :


upstream hello-upstream{
   server 192.168.1.200:8001;
 }

 server {
   listen 8000;
   location /hello {
     proxy_pass http://hello-upstream/hello;
   }
 }

这里的配置我们也可以通过管理界面来操作。上面操作完之后,在Konga中也有相关信息展示出来:

网关

网关

网关

四、Kong Plugins

Kong通过插件Plugins实现日志记录、安全检测、性能监控和负载均衡等功能。下面我将演示一个例子,通过启动 apikey 实现简单网关安全检验。

  1. 配置 key-auth 插件

curl -i -X POST http://192.168.1.200:8001/routes/hello-route/plugins --data name=key-aut

网关

这个插件接收 config.key_names 定义参数,默认参数名称 ['apikey']。在 HTTP 请求中 header 和 params 参数中包含 apikey 参数,参数值必须 apikey 密钥,Kong 网关将坚持密钥验证通过才可以访问后续服务。

此时我们使用 curl -i http://192.168.1.200:8000/hello/ 来验证一下是否生效,如果如下所示,访问失败(HTTP/1.1 401 Unauthorized,"No API key found in request" ),说明 Kong 安全机制生效了。

网关

在 Konga 中我们也可以看到相关记录:

网关

2.为Service添加服务消费者(Consumer)

定义消费者访问 API Key, 让他拥有访问 hello-service 的权限。

创建消费者 Hidden:

curl -i -X POST http://192.168.1.200:8001/consumers/  --data username=Hidden

网关

创建成功之后,返回:


{"custom_id":null,"created_at":1678268549,"id":"e097fc26-ccd0-4fa7-b370-f6eec4797d5f","tags":null,"username":"Hidden"}

之后为消费者 Hidden 创建一个 api key,输入如下命令:

curl -i -X POST http://192.168.1.200:8001/consumers/Hidden/key-auth/  --data key=123456

网关


{"created_at":1678268632,"consumer":{"id":"e097fc26-ccd0-4fa7-b370-f6eec4797d5f"},"id":"d560969d-ff8b-4204-a09f-3474217a4a29","tags":null,"ttl":null,"key":"123456"}

现在我们再来验证一下 http://192.168.1.200:8000/hello:

curl -i http://192.168.1.200:8000/hello/ --header "apikey:123456"

返回:

HTTP/1.1 200 OK
 Content-Type: text/html; charset=utf-8
 Content-Length: 14
 Connection: keep-alive
 Date: Tue, 18 Oct 2022 01:32:30 GMT
 Server: WSGIServer/0.1 Python/2.7.5
 X-Frame-Options: SAMEORIGIN
 X-Kong-Upstream-Latency: 13
 X-Kong-Proxy-Latency: 19
 Via: kong/1.5.1

 Hello world !

其他的插件可选

网关

或者进入插件仓库去了解

https://docs.konghq.com/hub/

网关

Kong 网关插件概括为如下:

  • 身份认证插件:Kong 提供了 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication 认证实现。
  • 安全控制插件:ACL(访问控制)、CORS(跨域资源共享)、动态 SSL、IP 限制、爬虫检测实现。
  • 流量控制插件:请求限流(基于请求计数限流)、上游响应限流(根据 upstream 响应计数限流)、请求大小限制。限流支持本地、Redis 和集群限流模式
  • 分析监控插件:Galileo(记录请求和响应数据,实现 API 分析)、Datadog(记录 API Metric 如请求次数、请求大小、响应状态和延迟,可视化 API Metric)、Runscope(记录请求和响应数据,实现 API 性能测试和监控)。
  • 协议转换插件:请求转换(在转发到 upstream 之前修改请求)、响应转换(在 upstream 响应返回给客户端之前修改响应)。
  • 日志应用插件:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等。

五、总结

Kong 作为 API 网关提供了 API 管理功能及围绕 API 管理实现了一些默认的插件,另外还具备集群水平扩展能力,从而提升整体吞吐量。Kong 本身是基于 OpenResty,可以在现有 Kong 的基础上进行一些扩展,从而实现更复杂的特性。虽然有一些特性 Kong 默认是缺失的,如 API 级别的超时、重试、fallback 策略、缓存、API 聚合、AB 测试等,这些功能插件需要企业开发人员通过 Lua 语言进行定制和扩展。综上所述,Kong API 网关默认提供的插件比较丰富, 适应针对企业级的 API 网关定位。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分