Express -Gateway, обслуживать один и тот же путь / маршрут API, но под разными ServiceEndpoints - PullRequest
0 голосов
/ 30 января 2020

У меня есть сервер в Node.js + Express, который предоставляет некоторые API как publi c, так и администраторам. На самом деле у меня работает 2 клонированных экземпляра, один для теста, другой для производства. Они - близнецы, выставляющие одинаковые маршруты (/admin, /public), но подключенные к двум разным базам данных и развернутые по двум разным адресам.

Я хочу использовать Express -Gateway для обеспечения 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, в то время как для Server Prod потребуется область действия api_prod.

В любом случае это решение не будет работать, поскольку, если первое совпадение в apiEndpoints завершится неудачей, оно просто приводит к «Not Found».

Пример: я делаю запрос к 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

1 Ответ

0 голосов
/ 30 января 2020

Я решил следующим образом: используя политику -rewrite.

  • Я ставлю запросы моих клиентов перед /test или /prod
  • Используйте префикс для соответствия path правильный apiEndpoint
  • переписать запрос, удалив префикс
  • , выбрать serviceEndpoint и go on ...
                                        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
...