成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實戰突破!Vue3 + SpringBoot 打造高效 Web 實時消息推送系統

開發 前端
在傳統的 HTTP 通信模型中,客戶端想要獲取最新數據,必須不斷地向服務器發送請求進行詢問——這種方式稱為輪詢。

為何需要 Web 實時通信?

在傳統的 HTTP 通信模型中,客戶端想要獲取最新數據,必須不斷地向服務器發送請求進行詢問——這種方式稱為輪詢。

假設你正在訪問一個股票信息平臺,瀏覽器每隔數秒就向服務器發送請求,服務器回復:“暫時沒變化”,直到股價真正變化為止。這不僅浪費帶寬,也帶來了數據更新的延遲。

而 WebSocket 則從根本上改變了這個機制。它在客戶端與服務器之間建立一條持久連接,允許服務端主動將新消息推送給客戶端。這就像雙方之間開了一個微信語音通話頻道,消息來回即時互通,無需每次“掛斷再撥號”。

典型應用場景:

  • 實時聊天(如微信、釘釘)
  • 股票/幣價推送
  • 實時協作文檔編輯
  • 在線訂單通知/預警系統

系統構建:技術選型與項目結構

為了實現一個具有實時消息推送能力的 Web 應用,我們采用如下架構:

  • 服務端(Spring Boot):負責業務邏輯處理、WebSocket 消息分發和管理連接會話。
  • 客戶端(Vue3):負責 UI 展示和 WebSocket 的消息接收/顯示。

Spring Boot 服務端實現

Maven 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocket 配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws-notification")
                .setAllowedOriginPatterns("*")
                .withSockJS();
    }


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

消息推送服務

@Service
public class NotificationService {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;


    public void broadcastNewOrder(String orderNumber) {
        messagingTemplate.convertAndSend("/topic/new-orders", orderNumber);
    }


    public void notifyUser(String userId, String message) {
        messagingTemplate.convertAndSendToUser(userId, "/topic/notification", message);
    }
}

Vue3 前端實現

安裝依賴

npm install sockjs-client stompjs
/utils/websocket.js
import SockJS from 'sockjs-client/dist/sockjs';
import Stomp from 'stompjs';


let stompClient = null;
let retryInterval = 5000;
let reconnectTimer = null;


function scheduleReconnect(type, notifyCallback, refreshCallback) {
  reconnectTimer = setTimeout(() => {
    connectWebSocket(type, notifyCallback, refreshCallback);
  }, retryInterval);
}


export function connectWebSocket(type, notifyCallback, refreshCallback) {
  const socket = new SockJS(import.meta.env.VITE_WS_ENDPOINT || "http://localhost:8083/ws-notification");
  stompClient = Stomp.over(socket);


  stompClient.connect({}, () => {
    if (reconnectTimer) clearTimeout(reconnectTimer);
    stompClient.subscribe(`/topic/${type}`, (msg) => {
      notifyCallback(msg.body);
      refreshCallback?.();
    });
  }, (error) => {
    console.error("連接失敗,嘗試重連", error);
    scheduleReconnect(type, notifyCallback, refreshCallback);
  });
}


export function disconnectWebSocket() {
  if (stompClient) {
    stompClient.disconnect();
  }
}

Vue 組件使用

<script setup>
import { onMounted, onBeforeUnmount } from "vue";
import { ElNotification } from "element-plus";
import { connectWebSocket, disconnectWebSocket } from "@/utils/websocket";


const showNotification = (message) => {
  ElNotification({
    title: "新訂單提醒",
    type: "success",
    message: message,
  });
};


onMounted(() => {
  connectWebSocket("new-orders", showNotification, refreshOrderList);
});


onBeforeUnmount(() => {
  disconnectWebSocket();
});


function refreshOrderList() {
  console.log("刷新訂單列表");
}
</script>

部署上線實戰

Nginx 配置 WebSocket 中繼

location /ws-notification {
  proxy_pass http://localhost:8083/ws-notification;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header Host $host;
}

Vue 打包和環境變量

const socket = new SockJS(import.meta.env.VITE_WS_ENDPOINT || "http://localhost:8083/ws-notification");

WebSocket 鑒權機制

服務端 STOMP 攔截器

@Component
public class AuthChannelInterceptor implements ChannelInterceptor {
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        if (StompCommand.CONNECT.equals(accessor.getCommand())) {
            List<String> authHeaders = accessor.getNativeHeader("Authorization");
            String token = (authHeaders != null && !authHeaders.isEmpty()) ? authHeaders.get(0) : null;


            if (!TokenUtil.verify(token)) {
                throw new IllegalArgumentException("無效的 Token");
            }


            accessor.setUser(new UsernamePasswordAuthenticationToken("user", null, new ArrayList<>()));
        }
        return message;
    }
}

在 WebSocket 配置中注冊

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.interceptors(new AuthChannelInterceptor());
}

客戶端使用 Token

stompClient.connect({ Authorization: getToken() }, () => {
  stompClient.subscribe("/topic/new-orders", (msg) => {
    notifyCallback(msg.body);
  });
});

總結:面向產品級的實時推送體系

通過本項目的實戰與優化,我們打造了一個功能完整的實時消息推送系統,它具備如下特性:

  • 前后端解耦,通信基于 WebSocket + STOMP
  • 消息反應秒級可達
  • 支持鑒權,可與登陸系統完編合
  • 具備斷線重連能力
  • 可實際部署,用 Nginx 做網關分發
責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-11-18 17:04:03

Vue3C#

2025-01-03 09:34:54

2023-09-19 15:33:50

Web實時消息推送

2022-07-30 10:08:06

MQTT?協議物聯網

2021-12-01 08:11:44

Vue3 插件Vue應用

2023-04-27 11:07:24

Setup語法糖Vue3

2024-01-23 09:15:33

Vue3組件拖拽組件內容編輯

2021-11-30 08:19:43

Vue3 插件Vue應用

2023-11-28 09:03:59

Vue.jsJavaScript

2023-11-24 08:02:28

2025-02-04 14:55:56

2024-10-11 11:32:22

Spring6RSocket服務

2025-02-24 09:30:00

日志系統系統開發

2020-09-19 21:15:26

Composition

2022-06-26 00:00:02

Vue3響應式系統

2023-11-07 10:01:34

2025-03-10 00:00:11

Spring框架數據

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2024-06-20 12:17:17

前端Vue3

2021-12-02 05:50:35

Vue3 插件Vue應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品综合网 | h视频在线观看免费 | 日韩视频成人 | 青青久久 | 亚洲欧美一区二区三区1000 | 99热.com | 成人午夜免费视频 | 亚洲 中文 欧美 日韩 在线观看 | 毛片电影 | 亚洲午夜精品视频 | 毛片在线视频 | 久久婷婷麻豆国产91天堂 | 日韩免费视频 | 国产精品久久久久久久久久免费看 | 欧美亚洲一级 | 在线视频一区二区三区 | 日韩精品一区在线 | 精品亚洲一区二区三区四区五区 | 亚洲美女网站 | 祝你幸福电影在线观看 | 日韩在线综合 | 爱草视频 | 在线视频亚洲 | 欧洲精品久久久久毛片完整版 | 天堂在线中文字幕 | 99精品免费| 91就要激情 | 久久久亚洲精品视频 | 成人在线免费网站 | 亚洲美女视频 | 久久综合久久综合久久综合 | 欧美日韩国产不卡 | 香蕉婷婷 | 黄色免费观看 | 国产精品永久免费 | 日本成年免费网站 | 免费不卡视频 | 国产精品久久久久久久久久久免费看 | 中国一级特黄视频 | 日本三级电影在线观看视频 | 黄色成人免费在线观看 |