用户在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. 开通专享实例上内网调用能力
登录API网关控制台。
在左侧导航栏选择实例与集群 > 专享实例,找到已创建的专享实例,单击是否允许被API网关自身调用开通自调用功能。
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