2015-09-29 4 views
1

Я недавно начал работать с node.js, и мне нужно построить архитектуру, которая должна использовать несколько служб express.js. Некоторые из этих служб должны быть расположены на одном сервере, а другие - на других серверных машинах. Я хочу создать базовую услугу (например, Gateway API), но я не знаю, как правильно установить связь между этим шлюзом и микросервисами или между двумя микросервисами.Архитектура для микросервисов

В настоящее время я работаю с решением, основанным на этом:

# inside Gateway server I call another service: 
http.get('http://127.0.0.1:5001/users', (service_res) -> 
    data = '' 
    service_res.on 'data', (chunk) -> 
    data += chunk 

    service_res.on 'end', -> 
    # some logic on data 

).end() 

У меня есть стойкое ощущение, что этот подход не является правильным. Каков правильный способ построения логики связи между шлюзом API и микросервисами?

ответ

2

Логика, которая у вас есть, неверна, но, вероятно, лучше было бы создать слой абстракции поверх запросов другой службы, например. шлюз API для другого микросервиса. Позволяет просто вызвать этот микросервис B для этого экземпляра (шлюз API для запроса B).

B в этом случае должен предоставить своему клиенту, как другой сервис должен взаимодействовать с ним, будь то через HTTP или WebSockets, протокол до B, потому что B понимает, как с ним следует связываться. Аргумент для клиента и службы, реализуемой вместе, состоит в том, что эти два компонента должны иметь более высокий уровень сплоченности, поскольку технически они связаны контрактом, например. если запросы должны быть предъявлены к сервису, он должен соблюдать контракт, который требуется службе.

В простом псевдокоде с курьерским:

// implemented elsewhere, ideally next to the service that it communicates with 
function BServiceClient() { 
    // ... 
} 

// the API gateway's calling code 
app.get('...', function(request, response, next) { 
    // create an instance of the service client 
    var bServiceClient = new BServiceClient(); 

    // retrieving the users from an abstracted endpoint 
    bServiceClient.GetUsers(); 

    // do some processing and then render a response or call next 
}); 

Для того, чтобы быть более проверяемым, вы, возможно, придется написать свой собственный обертку вокруг app сделать надлежащие инъекции зависимостей для инъекций клиента, чтобы сделать маршруты более проверяемыми. В противном случае вы могли бы создать еще одну функцию, которая может ввести клиента и создать клиент на уровне обработчика, который вызывает вновь созданную функцию. Затем вновь созданная функция может быть протестирована. Тем не менее, я предпочитаю использовать прежний подход к использованию обертки. Надеюсь это поможет!

+0

Спасибо за ваш комментарий. –

0

Что я хотел бы сделать это,

  1. Создать отдельные модули для каждого microservice. В зависимости от того, какой микросервис вы хотите запустить, просто укажите маршрут для экспресс-доставки.
  2. Внесите необходимые модули в экземпляр express().

Пример + бесстыдной плагин - https://github.com/swarajgiri/express-bootstrap/blob/master/core/index.js

Отказ - выше решением является весьма самоуверенным способом решения проблемы.

+0

Благодарим за ответ, но мне нужны услуги полного разделения и связь между ними через какой-либо протокол (например, HTTP или WebSockets). –

+0

Разделение может быть выполнено до уровня отдельных методов в основных модулях. Верхний уровень, т. Е. Обработчик маршрута, по-прежнему не имеет представления о том, как базовые модули предоставляют данные. –

Смежные вопросы