外部 Broker
簡單 Broker 非常適合入門,但它只支援 STOMP 命令的子集(不支援 ack、receipts 和一些其他特性),依賴於簡單的訊息傳送迴圈,並且不適合叢集。作為替代方案,你可以升級你的應用,使用功能齊全的訊息 Broker。
請查閱你選擇的訊息 Broker 的 STOMP 文件(例如 RabbitMQ、ActiveMQ 等),安裝並執行 Broker,並啟用 STOMP 支援。然後在 Spring 配置中啟用 STOMP Broker 中繼(而不是簡單 Broker)。
以下示例配置啟用了一個功能齊全的 Broker
-
Java
-
Kotlin
-
Xml
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration 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");
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun registerStompEndpoints(registry: StompEndpointRegistry) {
registry.addEndpoint("/portfolio").withSockJS()
}
override fun configureMessageBroker(registry: MessageBrokerRegistry) {
registry.enableStompBrokerRelay("/topic", "/queue")
registry.setApplicationDestinationPrefixes("/app")
}
}
<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-netty 和 io.netty:netty-all 依賴項,以便進行 TCP 連線管理。 |
此外,應用元件(例如 HTTP 請求處理方法、業務服務等)也可以向 Broker 中繼傳送訊息,如 傳送訊息 中所述,以便向已訂閱的 WebSocket 客戶端廣播訊息。
實際上,Broker 中繼實現了健壯且可擴充套件的訊息廣播。