У меня есть сервер в 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