全部产品
Search
文档中心

API 网关:多级API网关

更新时间:Nov 15, 2023

用户在API网关创建的API除了能被客户端调用,还能被API网关本身调用。API网关自调用允许跨Region调用,如果同Region,可以走内网调用。API网关自调同时支持跨账号调用,使用授权过的AK绑定一个类型为APIGW_FRONTEND的后端签名插件,API网关在调用自身时会使用AK生成签名发送给目标API网关进行鉴权认证。一个典型的场景是,用户有个负责分发的API,这个API绑定一个后端路由插件和后端签名插件,后端路由插件根据请求的参数来进行后端路由,路由到其他业务API上。

1. 配置示例

1.1. 业务API的配置

一个API如果想被API网关走内网形式的自身调用,需要开通专享实例,把所属的分组迁移到专享实例,并且在控制台手动生成内网调用域名:

1.1.1. 开通专享实例上内网调用能力

  1. 登录API网关控制台;

  2. 在左侧栏选择实例,找到使用的专享实例,单击开通自调用功能。

1.1.2. 开通分组上的自调用内网域名

在实例中生成两个分组,单击进入分组详情,分别为两个分组开通各自的自调用域名。

假设两个业务API分组的自调用域名分别为:

17ff4c9189004a1d87b557606b767334-cn-huhehaote-intranet.alicloudapi.com
c6e984b2dd784c0fb843f7c2a8878b15-cn-huhehaote-intranet.alicloudapi.com

1.1.3. 在两个分组上创建两个业务API

在每个分组下分别生成一个业务API,两个API均设置为APP鉴权模式,假设两个API相关属性为:

  • API1: Method: GET Path: /business1 后端地址为:

    http://backend1.alicloudapi.com:8080/business1
  • API2 Method: GET Path: /business2 后端地址为:

    http://backend2.alicloudapi.com:8080/business2

1.1.4. 对两个业务API进行授权

将这两个API分别授权给同一个APP,这个APP的AK假设为 KEY:TESTKEY SECRET:TESTSECRET

1.2. 分发API的配置

1.2.1. 创建分发API

我们创建一个分发API,这个API设置为匿名访问,Method设置为Get,Path设置为/distributeAPI,这个API所属的分组的访问域名为:17ff4c9189004a1d87b557606b767334-cn-huhehaote.alicloudapi.com

1.2.2. 创建、绑定后端路由插件

创建路由插件,将路由插件绑定到分发API上。

---
parameters:
  target: "Query:target"
routes:
- name: backend1
  condition: "$target = 'resource1'"
  backend:
    type: "HTTP"
    address: "17ff4c9189004a1d87b557606b767334-cn-huhehaote-intranet.alicloudapi.com"
    path: "/business1"
- name: backend2
  condition: "$target = 'resource2'"
  backend:
    type: "HTTP"
    address: "c6e984b2dd784c0fb843f7c2a8878b15-cn-huhehaote-intranet.alicloudapi.com"
    path: "/business2"

这个路由组件的意思是,绑定了这个插件的API,收到请求的时候,判断请求中query参数target,如果target的值为resource1,就给17ff4c9189004a1d87b557606b767334-cn-huhehaote-intranet.alicloudapi.com发送一个path为/business1的HTTP请求,target值为resource2时情况类似。

1.2.3. 创建、绑定后端签名插件

创建后端签名插件,将后端签名插件绑定到分发API上

---
type: APIGW_FRONTEND
key: TESTKEY
secret: TESTSECRET 
signatureMethod: HmacSHA256

这个插件的意思是,所有绑定了本插件的API,给后端发送请求时,会将请求中的内容按照API网关前端签名的算法算出请求的签名,并携带在请求中。

2. 调用分发API

在调用之前,需要确认所有API都发布到线上,之后再做测试:

curl 'http://17ff4c9189004a1d87b557606b767334-cn-huhehaote.alicloudapi.com/distributeAPI?target=resource1' -i

发送给后端的请求:

GET /business1 HTTP/1.1
User-Agent: curl/7.64.1
Via: 0045e52ee3a8400b8501b4c449b28779
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Forwarded-Proto: http
X-Forwarded-For: 192.168.XX.XX, 127.0.0.1
Host: backend1.alicloudapi.com:8080
X-Ca-Request-Id: 23853B41-C54D-45E9-8C43-EE4C1E8A7889
Via: bc48a42a3d17408b991b0bb4d18c23c0

curl 'http://17ff4c9189004a1d87b557606b767334-cn-huhehaote.alicloudapi.com/distributeAPI?target=resource2' -i

发送给后端的请求:

GET /business2 HTTP/1.1
User-Agent: curl/7.64.1
Via: 0045e52ee3a8400b8501b4c449b28779
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Forwarded-Proto: http
X-Forwarded-For: 192.168.XX.XX, 127.0.0.1
Host: backend2.alicloudapi.com:8080
X-Ca-Request-Id: AFD529D2-9B24-437E-8CEC-897E0BCD8B2F
Via: bc48a42a3d17408b991b0bb4d18c23c0