nestjs整合websocketgateway和microservice
目录
nestjs整合websocketgateway和microservice
启因
使用WebsocketGateway做网关,接收客户端长连接后,将消息通过RabbitMQ消息队列转发到microservice,再做后续处理,microservice处理完成后,将结果也发送到RabbitMQ,WebsocketGateway接收到消息后,回传给客户端
目录结构
|
|
文件
先看 WSGateway模块
WSGateway.ts
|
|
ws-gateway.controller.ts
|
|
ws-gateway.module.ts
注意:
- 在
providers中- 需要提供
WSGateway,这样,app.module中才可以拿启动这个 - 需要提供
SHARED_SERVICE,这个是注入用的共享服务,没有可以不要 - 需要提供
WS_QUEUE_SERVICE, 这个很关键, 没这个,WSGateway就只会启动Websocket监听,不会启动微服务 - 上面这个好像不需要,去掉也能正常用,在
app.module中创建就可以了
- 需要提供
|
|
app
gateway.controller.ts, gatewary.service.ts与此无关,之前在里面也注入了WSGateway,结果所有的连接都被触发了两次,相当于启动了两个WSGateway服务.
gateway.module.ts
|
|
main.ts
- 直接创建微服务就可以了,所以在
ws-gateway.module.ts中的微服务创建就不需要了 - 因为在
WSGateway.ts中的WebSocketGateway的修饰器中已经定义了端口3333,所以Websocket也会直接启动,不需要再app.listen(3333)了
|
|
总结
到这里,client->websocket->rabbitmq->app service->rabbitmq->websocket->client 流程就通了.
中间走了些弯路,nestjs的文档感觉不是很全面和细致,然后我本身对nestjs的微服务也没有那么熟,所以花了些时间.
几个问题花了许多时间调试:
- 启动了两个
WSGateway,所以一个连接会进来两次,这样我存的clients就不准,找不到对应的客户socket,就无法回复消息 - 怎么把
WSGateway和microservice整合在一起,花了些时间,主要还是nestjs的模块架构,需要的时候要import,在本模块内要使用imports的模块中的controller等就需要在providers中加上,如果要给其它模块使用,就要在exports中加上.