外部代理

简单代理非常适合入门,但只支持 STOMP 命令的子集(它不支持确认、回执和一些其他功能),依赖于简单的消息发送循环,不适合集群。作为替代方案,您可以升级应用程序以使用功能齐全的消息代理。

请参阅您选择的 Message Broker 的 STOMP 文档(例如 RabbitMQActiveMQ 等),安装 Broker 并启用 STOMP 支持运行它。然后,您可以在 Spring 配置中启用 STOMP Broker 中继(而不是简单 Broker)。

以下示例配置启用了一个功能齐全的 Broker

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		registry.addEndpoint("/portfolio").withSockJS();
	}

	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		registry.enableStompBrokerRelay("/topic", "/queue");
		registry.setApplicationDestinationPrefixes("/app");
	}

}

以下示例显示了前面示例的 XML 配置等效项

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/websocket
		https://www.springframework.org/schema/websocket/spring-websocket.xsd">

	<websocket:message-broker application-destination-prefix="/app">
		<websocket:stomp-endpoint path="/portfolio" />
			<websocket:sockjs/>
		</websocket:stomp-endpoint>
		<websocket:stomp-broker-relay prefix="/topic,/queue" />
	</websocket:message-broker>

</beans>

前面配置中的 STOMP Broker 中继是一个 Spring MessageHandler,它通过将消息转发到外部消息 Broker 来处理消息。为此,它建立到 Broker 的 TCP 连接,将所有消息转发到 Broker,然后将从 Broker 收到的所有消息转发到客户端,通过其 WebSocket 会话。本质上,它充当一个“中继”,在两个方向上转发消息。

io.projectreactor.netty:reactor-nettyio.netty:netty-all 依赖项添加到您的项目中,以进行 TCP 连接管理。

此外,应用程序组件(如 HTTP 请求处理方法、业务服务等)也可以将消息发送到 Broker 中继,如 发送消息 中所述,以将消息广播到已订阅的 WebSocket 客户端。

实际上,Broker 中继使健壮且可扩展的消息广播成为可能。