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
中加上.