我们有一个带有websockets的JHipster微服务应用程序。目前,主要的微服务(带前端)是通过依赖RabbitMQ作为主题的中继的websockets发送/接收消息的人。我们已经配置了Spring WebSockets + RabbitMQ,如本博文中所述:http://djeison.me/2017/11/04/spring-websocket-rabbitmq/
如果我还将其他微服务配置为转发到同一个RabbitMQ实例,我可以从我的架构中的其他微服务向主题发送消息吗?
修改
这是Spring Websockets在RabbitMQ上中继的配置类。这是主要的微服务,其中有STOMP WebSockets和前端Angular应用程序:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config
.setApplicationDestinationPrefixes("/app")
.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket-app").withSockJS();
}
}
我的问题是,如果我在另一个微服务中复制此配置,它是否能够到达前端应用程序?它会与RabbitMQ共享相同的WebSocket连接吗?提前谢谢。
答案 0 :(得分:0)
我的问题是我是否可以在另一个配置中复制此配置 微服务能否访问前端应用程序?
答案是肯定的,但是请在下面查看一些说明。
它将共享与RabbitMQ相同的WebSocket连接吗?
不,不会。任何其他微服务都必须连接并向RabbitMQ发送消息。
以下是一些从“网关”应用程序外部向网络套接字发送消息的选项:
请注意,您不需要脚踏端点,仅需要代理中继。因此配置可以是:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic")
}
}
要发送消息:
simpMessagingTemplate.convertAndSend(“ / topic / route”,有效负载);
如果您的有效载荷是一个对象,并且应将其序列化为json,则可以将Jackson添加为依赖项,在这种情况下,AbstractWebSocketMessageBrokerConfigurer
将为您创建一个json转换器(它还支持String
和byte[]
开箱即用。
使用spring-boot-starter-amqp作为依赖项的示例配置:
@Configuration
public class RabbitConfiguration {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
Jackson2JsonMessageConverter messageConverter = new
Jackson2JsonMessageConverter();
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter);
return rabbitTemplate;
}
}
发送消息:
rabbitTemplate.convertAndSend("amq.topic", "route", payload);
具有spring-integration-stomp作为依赖项的配置:
@Configuration
@EnableIntegration
public class StompConfiguration {
@Bean
public ReactorNettyTcpStompClient stompClient() {
ReactorNettyTcpStompClient stompClient = new ReactorNettyTcpStompClient("127.0.0.1", 61613);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.afterPropertiesSet();
stompClient.setTaskScheduler(taskScheduler);
stompClient.setReceiptTimeLimit(5000);
return stompClient;
}
@Bean
public StompSessionManager stompSessionManager() {
ReactorNettyTcpStompSessionManager stompSessionManager = new ReactorNettyTcpStompSessionManager(stompClient());
stompSessionManager.setAutoReceipt(true);
return stompSessionManager;
}
}
发送消息:
stompSessionManager.connect(new StompSessionHandlerAdapter() {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
session.send("/topic/route", messageDto);
}
});
这是一个Github repo,带有“网关”应用程序的工作示例,在该示例中建立了Web套接字连接,并使用上述3种方法将单独的应用程序发送消息到RabbitMQ“ websocket队列”。它还解决了有关用户/会话目标的一些问题。