#microservices #grpc #nestjs
#микросервисы #grpc #nestjs
Вопрос:
Я создаю микросервисы Grpc с помощью nestjs. Как я могу подключить оба сервера на моем локальном хостинге.
Я попытался использовать ngrok для создания туннеля для одного из сервисов, но я все еще получаю ошибки «используемый адрес» и «Адрес не добавлен из общего количества 2 разрешенных», хотя оба работают на разных портах
первая служба
import { authServiceOptions } from './auth/grpc/auth.options';
import { notificationClientServiceOptions } from '../../notification/src/notification/grpc/notification.options';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
app.setGlobalPrefix('api/v1/services');
// Services
app.connectMicroservice(notificationClientServiceOptions);
app.connectMicroservice(authServiceOptions);
await app.startAllMicroservicesAsync();
await app.listen(51700);
}
bootstrap();
вторая служба
import { AppModule } from './app.module';
import { notificationServiceOptions } from './notification/grpc/notification.options';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
app.setGlobalPrefix('api/v1/services');
// Services
app.connectMicroservice(notificationServiceOptions);
await app.startAllMicroservicesAsync();
await app.listen(3001);
}
bootstrap();
// параметры клиента для второй службы
export const notificationClientServiceOptions: ClientOptions = {
transport: Transport.GRPC,
options: {
url: 'https://b6a4cd09.ngrok.io/',
package: 'notification',
protoPath: join(__dirname, './notification.proto'),
},
};
Ответ №1:
Понял это! Оказывается, я указывал http-URL для службы Grpc. Это правильный вариант клиента для второй службы.
export const notificationClientServiceOptions: ClientOptions = {
transport: Transport.GRPC,
options: {
// you can specify any port that is not in use (just don't prefix it with 'http')
url: 'localhost:5500',
package: 'notification',
protoPath: join(__dirname, './notification.proto'),
},
};
Также я просмотрел исходный код для nestjs. Оказывается, URL-адрес по умолчанию для любого микросервиса — localhost: 5000, следовательно, если у вас запущено более одной службы, лучше указать URL-адрес для каждой службы.
Еще одна проблема, с которой я столкнулся, заключалась в подключении микросервисов; Если службы расположены в двух отдельных проектах nestjs, вам не нужно использовать app.connectMicroservice(secondServiceOptions)
firstService
это, потому await app.startAllMicroservicesAsync()
что вы попытаетесь запустить обе службы, но это не удастся. Это связано secondService
с тем, что он уже запущен в отдельном проекте.
Для подключения к secondService
из firstService
используйте @Client(secondServiceOptions)
декоратор.