国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

javaWEB消息推送之 WebSocket和SseEmitter

這篇具有很好參考價值的文章主要介紹了javaWEB消息推送之 WebSocket和SseEmitter。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

用途

  • 實時獲取服務(wù)端的最新數(shù)據(jù)
  • 查看調(diào)度任務(wù)的進度和執(zhí)行狀態(tài)
  • 用戶感知:修改數(shù)據(jù)后,相關(guān)用戶收到信息
  • 提升用戶體驗:耗時業(yè)務(wù)異步處理(Excel導(dǎo)入導(dǎo)出,復(fù)雜計算)

前端輪詢

這種方式實現(xiàn)簡單,前端通過setInterval定時去請求接口來獲取最新的數(shù)據(jù),當(dāng)實時性要求不高,更新頻率低的情況下可以使用這種方式。但是當(dāng)實時性很高的時候,我們的請求會很頻繁,服務(wù)器的消耗非常大,而且每次請求的時候服務(wù)端的數(shù)據(jù)可能還沒有改變,導(dǎo)致很多請求都是沒有意義的。

 

javascript

復(fù)制代碼

????setInterval(function?()?{ ????????????//?請求接口操作 ????????????//?。。。 ????????}, ????????3000 ????);

webSocket

WebSocket是基于TCP協(xié)議的,它是全雙工通信的,服務(wù)端可以向客戶端發(fā)送信息,客戶端同樣可以向服務(wù)器發(fā)送指令,常用于聊天應(yīng)用中。

pom.xml

SpringBoot提供了websocket的starter

 

xml

復(fù)制代碼

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

config類

注入ServerEndpointExporter,這個bean會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint

 

typescript

復(fù)制代碼

@Configuration public?class?WebSocketConfig?{ ????@Bean ????public?ServerEndpointExporter?serverEndpointExporter()?{ ????????return?new?ServerEndpointExporter(); ????} }

server類

創(chuàng)建一個服務(wù)類:

  • 加上@ServerEndpoint注解,設(shè)置WebSocket連接點的服務(wù)地址。
  • 創(chuàng)建AtomicInteger用于記錄連接數(shù)
  • 創(chuàng)建ConcurrentHashMap用于存放連接信息
  • @OnOpen注解表明該方法在建立連接后調(diào)用
  • @OnClose注解表明該方法在斷開連接后調(diào)用
  • @OnError注解表明該方法在連接異常調(diào)用
  • @OnMessage注解表明該方法在收到客戶端消息后調(diào)用
  • 創(chuàng)建推送信息的方法
  • 創(chuàng)建移除連接的方法
 

typescript

復(fù)制代碼

@ServerEndpoint("/websocket/{userId}") @Component public?class?WebSocketServer?{ ????private?final?static?Logger?logger?=?LoggerFactory.getLogger(WebSocketServer.class); ????/** ?????*?當(dāng)前連接數(shù) ?????*/ ????private?static?AtomicInteger?count?=?new?AtomicInteger(0); ????/** ?????*?使用map對象,便于根據(jù)userId來獲取對應(yīng)的WebSocket,或者放redis里面 ?????*/ ????private?static?Map<String,?WebSocketServer>?websocketMap?=?new?ConcurrentHashMap<>(); ????/** ?????*?與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù) ?????*/ ????private?Session?session; ????/** ?????*?對應(yīng)的用戶ID ?????*/ ????private?String?userId?=?""; ????/** ?????*?連接建立成功調(diào)用的方法 ?????*/ ????@OnOpen ????public?void?onOpen(Session?session,?@PathParam("userId")?String?userId)?{ ????????try?{ ????????????this.session?=?session; ????????????this.userId?=?userId; ????????????websocketMap.put(userId,?this); ????????????//?數(shù)量+1 ????????????count.getAndIncrement(); ????????????logger.info("websocket?新連接:{}",?userId); ????????}?catch?(Exception?e)?{ ????????????logger.error("websocket?新建連接?IO異常"); ????????} ????} ????/** ?????*?連接關(guān)閉調(diào)用的方法 ?????*/ ????@OnClose ????public?void?onClose()?{ ????????//?刪除 ????????websocketMap.remove(this.userId); ????????//?數(shù)量-1 ????????count.getAndDecrement(); ????????logger.info("close?websocket?:?{}",?this.userId); ????} ????/** ?????*?收到客戶端消息后調(diào)用的方法 ?????* ?????*?@param?message?客戶端發(fā)送過來的消息 ?????*/ ????@OnMessage ????public?void?onMessage(String?message)?{ ????????logger.info("來自客戶端{}的消息:{}",?this.userId,?message); ????} ????@OnError ????public?void?onError(Throwable?error)?{ ????????logger.info("websocket?發(fā)生錯誤,移除當(dāng)前websocket:{},err:{}",?this.userId,?error.getMessage()); ????????websocketMap.remove(this.userId); ????????//?數(shù)量-1 ????????count.getAndDecrement(); ????} ????/** ?????*?發(fā)送消息?(異步發(fā)送) ?????* ?????*?@param?message?消息主題 ?????*/ ????private?void?sendMessage(String?message)?{ ????????this.session.getAsyncRemote().sendText(message); ????} ????/** ?????*?向指定用戶發(fā)送信息 ?????* ?????*?@param?userId?用戶id ?????*?@param?wsInfo?信息 ?????*/ ????public?static?void?sendInfo(String?userId,?String?wsInfo)?{ ????????if?(websocketMap.containsKey(userId))?{ ????????????websocketMap.get(userId).sendMessage(wsInfo); ????????} ????} ????/** ?????*?群發(fā)消息 ?????*/ ????public?static?void?batchSendInfo(String?wsInfo,?List<String>?ids)?{ ????????ids.forEach(userId?->?sendInfo(userId,?wsInfo)); ????} ????/** ?????*?群發(fā)所有人 ?????*/ ????public?static?void?batchSendInfo(String?wsInfo)?{ ????????websocketMap.forEach((k,?v)?->?v.sendMessage(wsInfo)); ????} ????/** ?????*?獲取當(dāng)前連接信息 ?????*/ ????public?static?List<String>?getIds()?{ ????????return?new?ArrayList<>(websocketMap.keySet()); ????} ????/** ?????*?獲取當(dāng)前連接數(shù)量 ?????*/ ????public?static?int?getUserCount()?{ ????????return?count.intValue(); ????} }

測試接口

 

less

復(fù)制代碼

@RestController @RequestMapping("/ws") public?class?WebSocketController?{ ????@GetMapping("/push/{message}") ????public?ResponseEntity<String>?push(@PathVariable(name?=?"message")?String?message)?{ ????????WebSocketServer.batchSendInfo(message); ????????return?ResponseEntity.ok("WebSocket?推送消息給所有人"); ????} }

html

resources/static下創(chuàng)建ws.html,將WebSocket的地址設(shè)為服務(wù)類中@ServerEndpoint注解所配置的地址

 

xml

復(fù)制代碼

<!DOCTYPE?html> <html?lang="en"> <head> ????<meta?charset="UTF-8"> ????<title>WebSocket</title> </head> <body> <div?id="message"></div> </body> <script> ????let?websocket?=?null; ????//?用時間戳模擬登錄用戶 ????const?username?=?new?Date().getTime(); ????//?alert(username) ????//判斷當(dāng)前瀏覽器是否支持WebSocket ????if?('WebSocket'?in?window)?{ ????????console.log("瀏覽器支持Websocket"); ????????websocket?=?new?WebSocket('ws://localhost:8080/websocket/'?+?username); ????}?else?{ ????????alert('當(dāng)前瀏覽器?不支持?websocket'); ????} ????//連接發(fā)生錯誤的回調(diào)方法 ????websocket.onerror?=?function?()?{ ????????setMessageInnerHTML("WebSocket連接發(fā)生錯誤"); ????}; ????//連接成功建立的回調(diào)方法 ????websocket.onopen?=?function?()?{ ????????setMessageInnerHTML("WebSocket連接成功"); ????}; ????//接收到消息的回調(diào)方法 ????websocket.onmessage?=?function?(event)?{ ????????setMessageInnerHTML(event.data); ????}; ????//連接關(guān)閉的回調(diào)方法 ????websocket.onclose?=?function?()?{ ????????setMessageInnerHTML("WebSocket連接關(guān)閉"); ????}; ????//監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時,主動去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會拋異常。 ????window.onbeforeunload?=?function?()?{ ????????closeWebSocket(); ????}; ????//關(guān)閉WebSocket連接 ????function?closeWebSocket()?{ ????????websocket.close(); ????} ????//將消息顯示在網(wǎng)頁上 ????function?setMessageInnerHTML(innerHTML)?{ ????????document.getElementById('message').innerHTML?+=?innerHTML?+?'<br/>'; ????} </script> </html>

測試

啟動項目,訪問http://localhost:8080/ws.html,開啟連接。調(diào)用消息推送接口http://localhost:8080/ws/push/hello,查看網(wǎng)頁顯示信息。

SseEmitter

SseEmitter是SpringMVC(4.2+)提供的一種技術(shù),它是基于Http協(xié)議的,相比WebSocket,它更輕量,但是它只能從服務(wù)端向客戶端單向發(fā)送信息。在SpringBoot中我們無需引用其他jar就可以使用。

創(chuàng)建服務(wù)類

  • 創(chuàng)建AtomicInteger用于記錄連接數(shù)
  • 創(chuàng)建ConcurrentHashMap用于存放連接信息
  • 建立連接:創(chuàng)建并返回一個帶有超時時間的SseEmitter給前端。超時間設(shè)為0表示永不過期
  • 設(shè)置連接結(jié)束的回調(diào)方法completionCallBack
  • 設(shè)置連接超時的回調(diào)方法timeoutCallBack
  • 設(shè)置連接異常的回調(diào)方法errorCallBack
  • 創(chuàng)建推送信息的方法SseEmitter.send()
  • 創(chuàng)建移除連接的方法
 

scss

復(fù)制代碼

public?class?SseEmitterServer?{ ????private?static?final?Logger?logger?=?LoggerFactory.getLogger(SseEmitterServer.class); ????/** ?????*?當(dāng)前連接數(shù) ?????*/ ????private?static?AtomicInteger?count?=?new?AtomicInteger(0); ????/** ?????*?使用map對象,便于根據(jù)userId來獲取對應(yīng)的SseEmitter,或者放redis里面 ?????*/ ????private?static?Map<String,?SseEmitter>?sseEmitterMap?=?new?ConcurrentHashMap<>(); ????/** ?????*?創(chuàng)建用戶連接并返回?SseEmitter ?????* ?????*?@param?userId?用戶ID ?????*?@return?SseEmitter ?????*/ ????public?static?SseEmitter?connect(String?userId)?{ ????????//?設(shè)置超時時間,0表示不過期。默認30秒,超過時間未完成會拋出異常:AsyncRequestTimeoutException ????????SseEmitter?sseEmitter?=?new?SseEmitter(0L); ????????//?注冊回調(diào) ????????sseEmitter.onCompletion(completionCallBack(userId)); ????????sseEmitter.onError(errorCallBack(userId)); ????????sseEmitter.onTimeout(timeoutCallBack(userId)); ????????sseEmitterMap.put(userId,?sseEmitter); ????????//?數(shù)量+1 ????????count.getAndIncrement(); ????????logger.info("創(chuàng)建新的sse連接,當(dāng)前用戶:{}",?userId); ????????return?sseEmitter; ????} ????/** ?????*?給指定用戶發(fā)送信息 ?????*/ ????public?static?void?sendMessage(String?userId,?String?message)?{ ????????if?(sseEmitterMap.containsKey(userId))?{ ????????????try?{ ????????????????//?sseEmitterMap.get(userId).send(message,?MediaType.APPLICATION_JSON); ????????????????sseEmitterMap.get(userId).send(message); ????????????}?catch?(IOException?e)?{ ????????????????logger.error("用戶[{}]推送異常:{}",?userId,?e.getMessage()); ????????????????removeUser(userId); ????????????} ????????} ????} ????/** ?????*?群發(fā)消息 ?????*/ ????public?static?void?batchSendMessage(String?wsInfo,?List<String>?ids)?{ ????????ids.forEach(userId?->?sendMessage(wsInfo,?userId)); ????} ????/** ?????*?群發(fā)所有人 ?????*/ ????public?static?void?batchSendMessage(String?wsInfo)?{ ????????sseEmitterMap.forEach((k,?v)?->?{ ????????????try?{ ????????????????v.send(wsInfo,?MediaType.APPLICATION_JSON); ????????????}?catch?(IOException?e)?{ ????????????????logger.error("用戶[{}]推送異常:{}",?k,?e.getMessage()); ????????????????removeUser(k); ????????????} ????????}); ????} ????/** ?????*?移除用戶連接 ?????*/ ????public?static?void?removeUser(String?userId)?{ ????????sseEmitterMap.remove(userId); ????????//?數(shù)量-1 ????????count.getAndDecrement(); ????????logger.info("移除用戶:{}",?userId); ????} ????/** ?????*?獲取當(dāng)前連接信息 ?????*/ ????public?static?List<String>?getIds()?{ ????????return?new?ArrayList<>(sseEmitterMap.keySet()); ????} ????/** ?????*?獲取當(dāng)前連接數(shù)量 ?????*/ ????public?static?int?getUserCount()?{ ????????return?count.intValue(); ????} ????private?static?Runnable?completionCallBack(String?userId)?{ ????????return?()?->?{ ????????????logger.info("結(jié)束連接:{}",?userId); ????????????removeUser(userId); ????????}; ????} ????private?static?Runnable?timeoutCallBack(String?userId)?{ ????????return?()?->?{ ????????????logger.info("連接超時:{}",?userId); ????????????removeUser(userId); ????????}; ????} ????private?static?Consumer<Throwable>?errorCallBack(String?userId)?{ ????????return?throwable?->?{ ????????????logger.info("連接異常:{}",?userId); ????????????removeUser(userId); ????????}; ????} }

測試接口

 

less

復(fù)制代碼

@RestController @RequestMapping("/sse") public?class?SseEmitterController?{ ????/** ?????*?用于創(chuàng)建連接 ?????*/ ????@GetMapping("/connect/{userId}") ????public?SseEmitter?connect(@PathVariable?String?userId)?{ ????????return?SseEmitterServer.connect(userId); ????} ????@GetMapping("/push/{message}") ????public?ResponseEntity<String>?push(@PathVariable(name?=?"message")?String?message)?{ ????????SseEmitterServer.batchSendMessage(message); ????????return?ResponseEntity.ok("WebSocket?推送消息給所有人"); ????} }

html

resources/static下創(chuàng)建ws.html,將EventSource的地址設(shè)為創(chuàng)建連接的地址

 

xml

復(fù)制代碼

<!DOCTYPE?html> <html?lang="en"> <head> ????<meta?charset="UTF-8"> ????<title>SseEmitter</title> </head> <body> <button?onclick="closeSse()">關(guān)閉連接</button> <div?id="message"></div> </body> <script> ????let?source?=?null; ????//?用時間戳模擬登錄用戶 ????const?userId?=?new?Date().getTime(); ????if?(!!window.EventSource)?{ ????????//?建立連接 ????????source?=?new?EventSource('http://localhost:8080/sse/connect/'?+?userId); ????????/** ?????????*?連接一旦建立,就會觸發(fā)open事件 ?????????*?另一種寫法:source.onopen?=?function?(event)?{} ?????????*/ ????????source.addEventListener('open',?function?(e)?{ ????????????setMessageInnerHTML("建立連接。。。"); ????????},?false); ????????/** ?????????*?客戶端收到服務(wù)器發(fā)來的數(shù)據(jù) ?????????*?另一種寫法:source.onmessage?=?function?(event)?{} ?????????*/ ????????source.addEventListener('message',?function?(e)?{ ????????????setMessageInnerHTML(e.data); ????????}); ????????/** ?????????*?如果發(fā)生通信錯誤(比如連接中斷),就會觸發(fā)error事件 ?????????*?或者: ?????????*?另一種寫法:source.onerror?=?function?(event)?{} ?????????*/ ????????source.addEventListener('error',?function?(e)?{ ????????????if?(e.readyState?===?EventSource.CLOSED)?{ ????????????????setMessageInnerHTML("連接關(guān)閉"); ????????????}?else?{ ????????????????console.log(e); ????????????} ????????},?false); ????}?else?{ ????????setMessageInnerHTML("你的瀏覽器不支持SSE"); ????} ????//?監(jiān)聽窗口關(guān)閉事件,主動去關(guān)閉sse連接,如果服務(wù)端設(shè)置永不過期,瀏覽器關(guān)閉后手動清理服務(wù)端數(shù)據(jù) ????window.onbeforeunload?=?function?()?{ ????????closeSse(); ????}; ????//?關(guān)閉Sse連接 ????function?closeSse()?{ ????????source.close(); ????????const?httpRequest?=?new?XMLHttpRequest(); ????????httpRequest.open('GET',?'http://localhost:8080/sse/close/'?+?userId,?true); ????????httpRequest.send(); ????????console.log("close"); ????} ????//?將消息顯示在網(wǎng)頁上 ????function?setMessageInnerHTML(innerHTML)?{ ????????document.getElementById('message').innerHTML?+=?innerHTML?+?'<br/>'; ????} </script> </html>

測試

啟動項目,訪問網(wǎng)頁http://localhost:8080/sse.html建立連接。調(diào)用發(fā)送信息接口http://localhost:8080/sse/push/hello,查看網(wǎng)頁顯示信息。文章來源地址http://www.zghlxwxcb.cn/news/detail-819507.html

到了這里,關(guān)于javaWEB消息推送之 WebSocket和SseEmitter的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • SpringBoot+Netty+Websocket實現(xiàn)消息推送

    SpringBoot+Netty+Websocket實現(xiàn)消息推送

    這樣一個需求:把設(shè)備異常的狀態(tài)每10秒推送到頁面并且以彈窗彈出來,這個時候用Websocket最為合適,今天主要是后端代碼展示。 添加依賴 定義netty端口號 netty服務(wù)器 Netty配置 管理全局Channel以及用戶對應(yīng)的channel(推送消息) 管道配置 自定義CustomChannelHandler 推送消息接口及

    2024年02月04日
    瀏覽(19)
  • 消息推送(websocket)集群化解決方案

    消息推送(websocket)集群化解決方案

    及時信息傳遞:消息推送功能能夠確保網(wǎng)站向用戶發(fā)送及時的重要信息,包括新聞更新、促銷活動、賬戶狀態(tài)變更等。這樣可以增強用戶體驗,同時也提高用戶對網(wǎng)站的參與度。 個性化定制:消息推送功能可以根據(jù)用戶的偏好和興趣來定制推送內(nèi)容,使用戶能夠接收到與其相

    2024年02月16日
    瀏覽(17)
  • SpringBoot + WebSocket+STOMP指定推送消息

    SpringBoot + WebSocket+STOMP指定推送消息

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站。 本文將簡單的描述SpringBoot + WebSocket+STOMP指定推送消息場景,不包含信息安全加密等,請勿用在生產(chǎn)環(huán)境。 JDK:11+ Maven: 3.5+ SpringBoot: 2.6+ stompjs@7.0.0 STOMP 是面向簡

    2024年02月14日
    瀏覽(23)
  • Vue 項目中使用WebSocket 消息推送

    Vue 項目中使用WebSocket 消息推送

    1.這是我在后臺管理項目中使用到的,主要的作用是搞一個消息提醒的功能。 2.主要有右上角的提示和有下角的消息彈框。 3.主要實現(xiàn)的功能是如果用戶有未讀的消息,那么首次登錄就彈框,如果用戶關(guān)閉了頁面,那么再次刷新頁面的時候,也不再彈框,意思就是一個賬戶沒

    2024年02月11日
    瀏覽(23)
  • Spring Boot集成WebSocket實現(xiàn)消息推送

    Spring Boot集成WebSocket實現(xiàn)消息推送

    項目中經(jīng)常會用到消息推送功能,關(guān)于推送技術(shù)的實現(xiàn),我們通常會聯(lián)想到輪詢、comet長連接技術(shù),雖然這些技術(shù)能夠?qū)崿F(xiàn),但是需要反復(fù)連接,對于服務(wù)資源消耗過大,隨著技術(shù)的發(fā)展,HtML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬,并且能夠更實時地進行通訊。

    2023年04月08日
    瀏覽(21)
  • thinkphp結(jié)合WebSocket 實時推送消息詳細實例

    實時推送消息是現(xiàn)代 Web 應(yīng)用程序中常見的一種需求,而 WebSocket 已成為實時通信的首選技術(shù)。ThinkPHP 提供了對 WebSocket 的支持,本文將演示如何使用 ThinkPHP 實現(xiàn) WebSocket 實時推送消息的詳細例子。 安裝 Swoole 在開始之前,你需要先安裝 Swoole 擴展??梢允褂靡韵旅顏戆惭b:

    2024年03月20日
    瀏覽(25)
  • SpringBoot整合Netty+Websocket實現(xiàn)消息推送

    ? ? ? ?Netty是一個高性能、異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,用于快速開發(fā)可維護的高性能協(xié)議服務(wù)器和客戶端。以下是Netty的主要優(yōu)勢: 高性能 :Netty基于NIO(非阻塞IO)模型,采用事件驅(qū)動的設(shè)計,具有高性能的特點。它通過零拷貝技術(shù)、內(nèi)存池化技術(shù)等手段,進一步提高

    2024年01月20日
    瀏覽(21)
  • gateway管理websocket長連接服務(wù),消息推送

    gateway管理websocket長連接服務(wù),消息推送

    目前業(yè)務(wù)需要長連接進行實時數(shù)據(jù)交互,同時已有的業(yè)務(wù)系統(tǒng)統(tǒng)一經(jīng)過gateway網(wǎng)關(guān)調(diào)度,websocket服務(wù)是有狀態(tài)服務(wù),所以希望集成到同一個注冊中心讓gateway進行長連接的負載均衡轉(zhuǎn)發(fā)和管理,以此寫個demo進行測試 提供http請求api和長連接進行消息發(fā)送 ?首先連接需要登錄后獲

    2023年04月13日
    瀏覽(22)
  • Springboot整合WebSocket實現(xiàn)主動向前端推送消息

    Springboot整合WebSocket實現(xiàn)主動向前端推送消息

    ? ? ? ? 在上篇文章tcp編程中,我們實現(xiàn)了C++客戶端與java服務(wù)器之間的通信,客戶端發(fā)送了一個消息給服務(wù)器,今天我們要實現(xiàn)基于WebSocket實現(xiàn)服務(wù)器主動向前端推送消息,并且以服務(wù)器接收到C++客戶端的消息主動向前端推送消息的觸發(fā)條件。 WebSocket 的誕生背景 ??????

    2024年03月16日
    瀏覽(23)
  • 分布式WebSocket消息推送系統(tǒng)設(shè)計與實現(xiàn)

    作者:禪與計算機程序設(shè)計藝術(shù) 現(xiàn)如今,隨著物聯(lián)網(wǎng)、云計算、移動互聯(lián)網(wǎng)、大數(shù)據(jù)等新技術(shù)的興起,分布式系統(tǒng)成為越來越多企業(yè)面臨的挑戰(zhàn)。在分布式系統(tǒng)中,服務(wù)間通信是一個重要且復(fù)雜的課題,基于TCP/IP協(xié)議族的傳輸層協(xié)議之上的應(yīng)用層協(xié)議比如HTTP協(xié)議、RPC(Remo

    2024年02月05日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包