Express-Gateway,提供相同的API路径/路由,但在不同的ServiceEndpoints下使用

问题描述 投票:0回答:1

我在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.comserver_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
api-key express-gateway
1个回答
0
投票

我以这种方式解决:使用-rewrite策略。

  • 我用/test/prod为客户的请求加上前缀>
  • 使用前缀匹配path正确的apiEndpoint
  • 重写请求,删除前缀
  • 选择serviceEndpoint并继续...
                                        http://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
© www.soinside.com 2019 - 2024. All rights reserved.