我在Node.js + Express中有一台服务器,该服务器向公共和管理员公开了一些API。实际上,我有2个克隆实例正在运行,一个用于测试,一个用于生产。它们是双胞胎,暴露相同的路由(/admin
,/public
),但连接到两个不同的数据库,并部署在两个不同的地址上。
我想使用Express-Gateway为3d参与者提供API,因此我将首先让他们访问测试服务器。完成所有操作后,我还将向他们提供“生产”访问权限。
为此,我的想法是只创建1个eg user
,并创建多个eg application
。每个eg application
将具有eg credentials
访问服务器或生产。
http://server_test.com
|-------------| |-------------|
| App Prod | | Server Test |
+----► | scopes: |------+ +-----► | /public |
| | [api_prod] | | | | /admin |
| |-------------| ▼ | |-------------|
| http://gateway.com
|------| |------------|
| User | | Express |
|------| | Gateway |
| |-------------| |------------|
| | App Test | ▲ | http://server_prod.com
+----► | scopes: | | | |-------------|
| [api_test] |------+ +-----► | Server Prod |
|-------------| | /public |
| /admin |
|-------------|
根据提供的凭据,网关应将请求重定向到server_test.com
或server_prod.com
。我的想法是使用eg scopes
解决对正确端点的请求。因此,服务器测试策略将需要api_test
范围,而服务器产品将需要api_prod
范围。
无论如何,该解决方案都行不通,因为如果apiEndpoints
中的第一个匹配失败,则只会导致“未找到”。
示例:我使用具有http://gateway.com/public
范围的App Prod凭据向api_prod
发出请求。应该将其传递给http://server_prod.com/public
,但它将与paths: '/*'
的第一个testEndpoint
匹配,并且使范围条件失败。因此它只是失败了,而正确的apiEndpoint应该是prodEndpoint
。
我该如何解决这个问题?
这是我的gateway.config.yml
apiEndpoints:
testEndpoint
host:*
paths: '/*' # <--- match this
scopes: ["api_test"] # <--- but fails this
prodEndpoint
host:*
paths: '/*'
scopes: ["api_prod"] # <---- this is right
serviceEndpoints
testService
url: "http://server_test.com"
prodService
url: "http://server_prod.com"
policies
- proxy
pipelines
testEndpoint: # Test
apiEndpoints:
- testEndpoint
policies:
- proxy
- action
serviceEndpoint: testService
prodEndpoint: # Prod
apiEndpoints:
- prodEndpoint
policies:
- proxy
- action
serviceEndpoint: prodService
我以这种方式解决:使用-rewrite
策略。
/test
或/prod
为客户的请求加上前缀>path
正确的apiEndpointhttp://server_test.com |-------------| |-------------| | App Prod | /prod/admin /admin | Server Test | | scopes: |-------------+ +--------► | /public | | [api_prod] | | | | /admin | |-------------| ▼ | |-------------| http://gateway.com |------------| | Express | | Gateway | |-------------| |------------| | App Test | ▲ | http://server_prod.com | scopes: | | | |-------------| | [api_test] |-------------+ +---------► | Server Prod | |-------------| /test/admin /admin | /public | | /admin | |-------------|
这是我的配置文件:
apiEndpoints:
testEndpoint
host:*
paths: '/test/*'
scopes: ["api_test"]
prodEndpoint
host:*
paths: '/prod/*'
scopes: ["api_prod"]
serviceEndpoints
testService
url: "http://server_test.com"
prodService
url: "http://server_prod.com"
policies
- proxy
pipelines
testEndpoint: # Test
apiEndpoints:
- testEndpoint
policies:
- rewrite: # rewrite - delete /test
-
condition:
name: regexpmatch
match: ^/test/?(.*)$
action:
rewrite: /$1
- proxy
- action
serviceEndpoint: testService
prodEndpoint: # Prod
apiEndpoints:
- prodEndpoint
policies:
- rewrite: # rewrite - delete /prod
-
condition:
name: regexpmatch
match: ^/prod/?(.*)$
action:
rewrite: /$1
- proxy
- action
serviceEndpoint: prodService