我在 Node.js + Express 中有一个服务器,它向公众和管理员公开了一些 API。实际上我有 2 个正在运行的克隆实例,一个用于测试,一个用于生产。它们是双胞胎,公开相同的路由(/admin
, /public
),但连接到两个不同的数据库,并部署在两个不同的地址上。
我想使用 Express-Gateway 向 3d 方提供 API,所以我将首先让他们访问测试服务器。全部完成后,我还将为他们提供生产访问权限。
为此,我的想法是只创建 1eg 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