我正在使用Nestjs创建一些微服务。
例如,我有x、y和z服务,全部通过grpc互连,但我希望服务 x在特定实体更改时向 webapp 发送更新,因此我考虑了 server-sent-events [开放任何其他更好的解决方案]。
按照nestjs文档,他们有一个以n间隔运行sse路由的函数,似乎是资源耗尽的。有没有办法在有更新时实际发送事件。
假设我在同一服务中有另一个 api 调用,该调用是通过单击另一个 web 应用程序上的按钮触发的,如何触发事件仅在单击按钮时触发,而不是连续不断地发送事件。另外,如果您知道任何惯用的方法来实现这一点,那么变得hacky将不胜感激,希望它成为最后的手段。
我还考虑过使用MQTT来发送事件。但我有一种感觉,单个服务不可能拥有MQTT 和 gRPC。我对使用 MQTT 持怀疑态度,因为它的延迟以及它将如何影响内部消息传递。如果我可以限制外部客户端,那就太好了(即,使用 gRPC 进行内部连接的 x 服务和用于 web 应用程序的 MQTT 只需要 mqtt 公开一条路由)。(PS ,我是微服务新手,所以请全面介绍您的解决方案:p)
server-sent-events mqtt microservices nestjs nestjs-gateways
我正在将 socket.io 实现与 Nestjs 一起使用。我的整体生产架构依赖于负载均衡器将请求路由到微服务容器的路径上。
其中之一包含一个与用户数据交互的 websocket,并嵌套在mydomain.com/apis/user
在我的网关上,我已将其配置为使用此路径:
@WebSocketGateway({ path: "/apis/user/gateway", namespace: "/apis/user/gateway" })
Run Code Online (Sandbox Code Playgroud)
我尝试过没有命名空间而只有路径的变体。
我还有一个全局前缀: app.setGlobalPrefix("apis/user");删除它没有什么区别,看来我需要定义网关的路径,无论是否为前缀。
然后在客户端上,我尝试通过在 url 中添加路径或选项对象来连接到它,如下所示:
const endpoint = "https://example.com/apis/user/gateway";
socket = io(endpoint, {
secure: true,
path: "/apis/user/gateway",
});
Run Code Online (Sandbox Code Playgroud)
这适用于嵌套在那里的网关上的路径和handleConnection触发器,但是在后端配置轮询不起作用,客户端仍然抛出:
https://example.com/apis/user/gateway/?EIO=4&transport=polling&t=NXVpMfB 404 Not Found
Run Code Online (Sandbox Code Playgroud) 我正在努力在 NestJS 7 中实现 Websocket 网关,如文档中所示。我使用 WS 适配器。
const app = await NestFactory.create(ApplicationModule);
app.useWebSocketAdapter(new WsAdapter(app));
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是网关接受连接,无论 url 是什么。例如,如果我像这样定义我的网关:
@WebSocketGateway(8080, {namespace: '/v3'}
export class MyGateway {}
Run Code Online (Sandbox Code Playgroud)
handleConnection然后,无论客户端请求的路径如何,都会触发该网关:
ws://localhost:8080/some-other-path
Run Code Online (Sandbox Code Playgroud)
不幸的是,这意味着所有客户端都连接到每个网关。命名空间选项仅适用于 socket.io 适配器吗?
我的守卫包含以下代码:
let client: Socket = context.switchToWs().getClient();
const sessionCookie = client.handshake.headers.cookie
.split('; ')
.find((cookie: string) => cookie.startsWith('session'))
.split('=')[1];
const sessionId = cookieParser.signedCookie(
sessionCookie,
process.env.CryptoKey,
);
console.log('SESSION ID',sessionId);
Run Code Online (Sandbox Code Playgroud)
调用 cookieParse.signedCookie() 后,生成的 sessionId 仍然是签名的;
client.request.cookies 和signedCookies 均未定义。
会话 ID 在那里,并且 cookie 正在由浏览器发送,但我无法在网关中解析它。
我正在尝试构建一个包含多个微服务的 NestJS 后端和一个作为与微服务通信的网关的 REST API。对于网关和微服务之间的通信,我使用 gRPC。简单的通信已经可以工作,但现在我想在微服务中实现错误处理。NestJS 文档指出,这可以通过 RpcException 类实现。https://docs.nestjs.com/microservices/exception-filters但是,如果我尝试捕获网关 API 中的异常,我只会收到“ERROR [ExceptionsHandler] 2 UNKNOWN:...”,然后是异常错误消息。
网关API:user.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { UserViewModel } from '../../proto/build/service-name/user';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get(':id')
async getUserById(@Param('id') id: number): Promise<UserViewModel> {
try {
return await this.userService.getUserById(id);
} catch (error) {
return error;
}
}
}
Run Code Online (Sandbox Code Playgroud)
网关API:user.service.ts
import { Inject, Injectable, OnModuleInit …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 nestjs 创建聊天,但它的问题在于@SubscribeMessage()连接的实现正在工作,但是当我尝试侦听来自前端的发射和consolenestjs 中的数据时,它不起作用
import { Server, Socket } from 'socket.io';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from '../entities/user.entity';
import { Repository } from 'typeorm';
import { Messenger } from './entities/messenger.entity';
@Injectable()
@WebSocketGateway(5000)
export class MessengerGateway implements OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
@InjectRepository(Messenger)
private messageRepository: Repository<Messenger>,
) {}
@SubscribeMessage('loadPeople')
handleEvent(client: Socket, data){
console.log(data);
// this is not working
}
async afterInit(server: Server) …Run Code Online (Sandbox Code Playgroud)我在 Nestjs 中有一个控制器来处理 HTTP 请求。有一个 IoT 设备与服务器进行通信,并通过 post 请求将最新更改发送到服务器。同时,有一个移动应用程序应该使用 Websockets 实时接收更新。
我知道 HTTP 请求和 Websockets 在 Nestjs 中是不同的概念,但是有没有办法在我收到 HTTP 请求时发出事件?
任何想法将不胜感激。
我有一个 REST API,我想通过 websocket 向客户端发送事件。如何在控制器或其他组件中注入 websocket 实例?