我正在用nestjs创建Grpc微服务。如何连接本地主机上的两个服务器。
我尝试使用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'),
},
};
答案 0 :(得分:0)
想通了!原来我为 Grpc 服务指定了 http 网址。这是第二项服务的正确客户端选项。
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)
。