最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Cloud微服務(wù)使用webSocket的方法

 更新時(shí)間:2021年06月25日 18:11:57   作者:Banana_Fish  
WebSocket在現(xiàn)代瀏覽器中的應(yīng)用已經(jīng)算是比較普遍了,在某些業(yè)務(wù)場(chǎng)景下,要求必須能夠在服務(wù)器端推送消息至客戶(hù)端,本文給大家介紹Spring Cloud微服務(wù)使用webSocket的方法,感興趣的朋友一起看看吧

webSocket

webSocket長(zhǎng)連接是一種在單個(gè)tcp連接上進(jìn)行全雙工通信的協(xié)議,允許雙向數(shù)據(jù)推送。一般微服務(wù)提供的restful API只是對(duì)前端請(qǐng)求做出相應(yīng)。使用webSocket可以實(shí)現(xiàn)后端主動(dòng)向前端推送消息。

網(wǎng)關(guān)配置

spring cloud 的網(wǎng)關(guān)組件有zuul和getway

getway

base:
  config:
    nacos:
      nacoshost: localhost
      port: 8848

spring:
  application:
    name: gateway
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: ${base.config.nacos.nacoshost}:${base.config.nacos.port}
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        #  websocket
        - id: CLOUD-WEBSOCKET
          uri: lb:ws://cloud-websocket
          predicates:
            - Path=/cloud-websocket/**
server:
  port: 8888

配置網(wǎng)關(guān)的時(shí)候注意添加ws協(xié)議。

zuul

zuul只能管理http請(qǐng)求,不推薦使用zuul管理websocket連接,推薦直連。

服務(wù)端

添加maven依賴(lài)

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

添加webSocket 配置

@Configuration
@EnableWebSocket
public class WebsocketConfiguration implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // webSocket通道
        // 指定處理器和路徑
        registry.addHandler(new WebSocketHandler(), "/websocket")
                // 指定自定義攔截器
                .addInterceptors(new WebSocketInterceptor())
                // 允許跨域
                .setAllowedOrigins("*");
        // sockJs通道
        registry.addHandler(new WebSocketHandler(), "/sock-js")
                .addInterceptors(new WebSocketInterceptor())
                .setAllowedOrigins("*")
                // 開(kāi)啟sockJs支持
                .withSockJS();
    }
}

添加處理器

package com.auexpress.cloud.handler;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Description
 * @ClassName WebSocketHandler
 * @Author HYSong
 * @date 2020.04.14 10:08
 */
public class WebSocketHandler extends AbstractWebSocketHandler {
    /**
     *  存儲(chǔ)sessionId和webSocketSession
     *  需要注意的是,webSocketSession沒(méi)有提供無(wú)參構(gòu)造,不能進(jìn)行序列化,也就不能通過(guò)redis存儲(chǔ)
     *  在分布式系統(tǒng)中,要想別的辦法實(shí)現(xiàn)webSocketSession共享
     */
    private static Map<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
    private static Map<String, String> userMap = new ConcurrentHashMap<>();

    /**
     * webSocket連接創(chuàng)建后調(diào)用
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        // 獲取參數(shù)
        String user = String.valueOf(session.getAttributes().get("user"));
        userMap.put(user, session.getId());
        sessionMap.put(session.getId(), session);
    }

    /**
     * 接收到消息會(huì)調(diào)用
     */
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        JSONObject jsonObject = JSONObject.parseObject(message.getPayload().toString());
        String content = jsonObject.getString("content");
        String targetAdminId = jsonObject.getString("targetId");
        if("0".equals(targetAdminId)){
            //  推送給所有人
            userMap.forEach((key,value)->{
                try {
                    this.sendMessage(key,content);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }else{
            sendMessage("1", content);
        }
    }

    /**
     * 連接出錯(cuò)會(huì)調(diào)用
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) {
        sessionMap.remove(session.getId());
    }

    /**
     * 連接關(guān)閉會(huì)調(diào)用
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        sessionMap.remove(session.getId());
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

    /**
     * 后端發(fā)送消息
     */
    public void sendMessage(String user, String message) throws IOException {
        String sessionId = userMap.get(user);
        if (StringUtils.isEmpty(sessionId)) {
            return;
        }
        WebSocketSession session = sessionMap.get(sessionId);
        if (session == null) {
            return;
        }
        session.sendMessage(new TextMessage(message));
    }
}

添加攔截器

package com.auexpress.cloud.interceptor;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;

import java.util.Map;

/**
 * @Description
 * @ClassName WebSocketInterceptor
 * @Author HYSong
 * @date 2020.04.14 10:09
 */
public class WebSocketInterceptor implements HandshakeInterceptor {
    /**
     * handler處理前調(diào)用,attributes屬性最終在WebSocketSession里,
     * 可能通過(guò)webSocketSession.getAttributes().get(key值)獲得
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
        if (request instanceof ServletServerHttpRequest) {
            ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
            // 獲取請(qǐng)求路徑攜帶的參數(shù)
            String user = serverHttpRequest.getServletRequest().getParameter("user");
            attributes.put("user", user);
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {

    }
}

到此這篇關(guān)于Spring Cloud微服務(wù)使用webSocket的方法的文章就介紹到這了,更多相關(guān)Spring Cloud使用webSocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼

    SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼

    這篇文章主要為大家介紹了SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 深入理解Spring事務(wù)及傳播機(jī)制之原理解析與實(shí)際應(yīng)用

    深入理解Spring事務(wù)及傳播機(jī)制之原理解析與實(shí)際應(yīng)用

    Spring事務(wù)管理機(jī)制提供了多種傳播行為,可以控制事務(wù)的范圍和隔離級(jí)別,保證數(shù)據(jù)一致性和完整性。在實(shí)際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)場(chǎng)景選擇合適的傳播行為實(shí)現(xiàn)事務(wù)控制
    2023-04-04
  • 用C和JAVA分別創(chuàng)建鏈表的實(shí)例

    用C和JAVA分別創(chuàng)建鏈表的實(shí)例

    使用用C和JAVA分別創(chuàng)建鏈表的方法,創(chuàng)建鏈表、往鏈表中插入數(shù)據(jù)、刪除數(shù)據(jù)等操作。
    2013-10-10
  • spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)

    spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)

    Spring的@Scheduled注解用于定時(shí)任務(wù)調(diào)度,默認(rèn)單線程依次執(zhí)行,可以通過(guò)配置多線程調(diào)度器或使用@Async注解實(shí)現(xiàn)并行執(zhí)行,常見(jiàn)參數(shù)包括cron、fixedRate、fixedDelay、initialDelay等,本文介紹spring @Scheduled定時(shí)任務(wù)注解使用方法,感興趣的朋友一起看看吧
    2025-02-02
  • 淺談SpringBoot中properties、yml、yaml的優(yōu)先級(jí)

    淺談SpringBoot中properties、yml、yaml的優(yōu)先級(jí)

    優(yōu)先級(jí)低的配置會(huì)被先加載,所以?xún)?yōu)先級(jí)高的配置會(huì)覆蓋優(yōu)先級(jí)低的配置,本文就來(lái)介紹一下SpringBoot中properties、yml、yaml的優(yōu)先級(jí),感興趣的可以了解一下
    2023-08-08
  • 解決Springboot項(xiàng)目報(bào)錯(cuò):java:錯(cuò)誤:不支持發(fā)行版本?17

    解決Springboot項(xiàng)目報(bào)錯(cuò):java:錯(cuò)誤:不支持發(fā)行版本?17

    這篇文章主要給大家介紹了關(guān)于解決Springboot項(xiàng)目報(bào)錯(cuò):java:錯(cuò)誤:不支持發(fā)行版本17的相關(guān)資料,這個(gè)錯(cuò)誤意味著你的Spring Boot項(xiàng)目正在使用Java 17這個(gè)版本,但是你的項(xiàng)目中未配置正確的Java版本,需要的朋友可以參考下
    2023-08-08
  • 詳解阿里云maven鏡像庫(kù)配置(gradle,maven)

    詳解阿里云maven鏡像庫(kù)配置(gradle,maven)

    這篇文章主要介紹了詳解阿里云maven鏡像庫(kù)配置(gradle,maven),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • java獲取一個(gè)文本文件的編碼(格式)信息

    java獲取一個(gè)文本文件的編碼(格式)信息

    這篇文章主要介紹了java獲取一個(gè)文本文件的編碼(格式)信息,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java實(shí)現(xiàn)將html字符串插入到PPT幻燈片

    Java實(shí)現(xiàn)將html字符串插入到PPT幻燈片

    Java后端代碼操作PPT幻燈片時(shí),可直接在幻燈片中繪制形狀,并在形狀中添加文本字符串內(nèi)容。本篇文章主要介紹通過(guò)java實(shí)現(xiàn)將html字符串添加到PPT幻燈片的的方法,可添加文字、圖片、視頻、音頻等。以下是具體方法和步驟。
    2021-11-11
  • java中的arrays.sort()代碼詳解

    java中的arrays.sort()代碼詳解

    這篇文章主要介紹了Java中的Arrays.sort()代碼詳解,涉及Arrays.sort()簡(jiǎn)單示例,策略模式,”super”的使用等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

东兴市| 宜宾县| 浑源县| 郑州市| 渭源县| 徐州市| 诸暨市| 平山县| 丰顺县| 得荣县| 两当县| 云龙县| 闵行区| 瓦房店市| 应城市| 武安市| 华亭县| 黄山市| 红安县| 沙洋县| 突泉县| 南丰县| 陵川县| 宝丰县| 东宁县| 万载县| 屏东县| 昂仁县| 砚山县| 镇江市| 交口县| 九龙城区| 乐都县| 崇州市| 稷山县| 吉隆县| 乡宁县| 寻乌县| 阿图什市| 普定县| 门源|