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

從零開(kāi)始,手把手教你實(shí)現(xiàn)基于 Websocket 的微服務(wù)

這篇具有很好參考價(jià)值的文章主要介紹了從零開(kāi)始,手把手教你實(shí)現(xiàn)基于 Websocket 的微服務(wù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

從零開(kāi)始,手把手教你實(shí)現(xiàn)基于 Websocket 的微服務(wù)

1. Websocket 簡(jiǎn)介

Websocket 協(xié)議是為了解決 HTTP 協(xié)議缺陷而產(chǎn)生的一種通信協(xié)議,它能夠在客戶端和服務(wù)器之間建立持久性的連接,并且允許雙向通信。

HTTP 協(xié)議的請(qǐng)求與響應(yīng)模式,其實(shí)并不適合實(shí)時(shí)通信的場(chǎng)景。比如聊天室、在線游戲等應(yīng)用,都需要實(shí)時(shí)地推送消息到客戶端,而 HTTP 協(xié)議則需要進(jìn)行頻繁的請(qǐng)求和響應(yīng)操作,這就會(huì)導(dǎo)致網(wǎng)絡(luò)延遲和更多的帶寬消耗。

而 Websocket 則是允許服務(wù)器主動(dòng)向客戶端發(fā)送消息,而不需要客戶端發(fā)起請(qǐng)求,從而提高了通信效率和實(shí)時(shí)性。因此,在微服務(wù)架構(gòu)中,Websocket 技術(shù)非常適合作為微服務(wù)之間的通信方式。

2. 構(gòu)建基于 Websocket 的微服務(wù)應(yīng)用

2.1 準(zhǔn)備工作

首先需要在項(xiàng)目中引入 Spring Boot 的 Websocket 模塊依賴:

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

然后創(chuàng)建一個(gè) Spring Boot 的 Web 應(yīng)用,并在啟動(dòng)類中添加 @EnableWebSocket 注解。

2.2 編寫(xiě)服務(wù)端代碼

在服務(wù)端,需要定義一個(gè) WebsocketConfig 類,并實(shí)現(xiàn) WebSocketConfigurer 接口。在這個(gè)類中,可以自定義 Websocket 消息處理器,并注冊(cè)到 Websocket 服務(wù)中。

@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");
    }

    private static class MyWebSocketHandler extends TextWebSocketHandler {

        private final List<WebSocketSession> sessions = new ArrayList<>();

        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
            for (WebSocketSession s : sessions) {
                s.sendMessage(message);
            }
        }

        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            sessions.add(session);
        }

        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            sessions.remove(session);
        }
    }
}

上述代碼中,MyWebSocketHandler 是自定義的消息處理器,可以處理客戶端發(fā)送來(lái)的消息,并將消息發(fā)送給所有連接的客戶端。其中,afterConnectionEstablished() 方法會(huì)在客戶端和服務(wù)器之間建立連接時(shí)被調(diào)用,afterConnectionClosed() 方法則會(huì)在連接關(guān)閉時(shí)調(diào)用。

2.3 編寫(xiě)客戶端代碼

在客戶端,需要構(gòu)建一個(gè)基于 Websocket 的連接,并向服務(wù)端發(fā)送消息。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Websocket Demo</title>
</head>
<body>
    <div id="output"></div>
    <input type="text" id="input">
    <button onclick="sendMessage()">Send</button>

    <script>
        const socket = new WebSocket("ws://localhost:8080/ws");

        socket.onmessage = function(event) {
            const output = document.getElementById("output");
            const message = event.data;
            output.innerHTML += "<p>" + message + "</p>";
        }

        function sendMessage() {
            const input = document.getElementById("input");
            const message = input.value;
            socket.send(message);
        }
    </script>
</body>
</html>

上述代碼中,WebSocket() 構(gòu)造函數(shù)中的 ws://localhost:8080/ws 是服務(wù)端的 Websocket 地址。在發(fā)送消息時(shí),則是調(diào)用 socket.send() 方法向服務(wù)端發(fā)送消息。而在收到服務(wù)端的消息時(shí),則會(huì)觸發(fā) socket.onmessage() 回調(diào)函數(shù),并將消息展示在網(wǎng)頁(yè)中。

3. 技術(shù)實(shí)踐案例:基于 Websocket 的在線聊天室

3.1 界面設(shè)計(jì)

本案例采用前后端分離的方式,使用 React 框架構(gòu)建客戶端界面

3.2 服務(wù)端實(shí)現(xiàn)

3.2.1 WebSocket 配置

創(chuàng)建一個(gè) WebSocketConfig 類,并實(shí)現(xiàn) WebSocketConfigurer 接口。在這個(gè)類中,注冊(cè)自定義的 Websocket 消息處理器,并設(shè)置允許跨域請(qǐng)求。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/chat")
                .setAllowedOrigins("*")
                .addInterceptors(new HttpSessionHandshakeInterceptor());
    }

    private static class ChatWebSocketHandler extends TextWebSocketHandler {

        private final List<WebSocketSession> sessions = new ArrayList<>();

        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
            for (WebSocketSession s : sessions) {
                if (s != session) {
                    s.sendMessage(message);
                }
            }
        }

        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            sessions.add(session);
        }

        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            sessions.remove(session);
        }
    }
}

上述代碼中,ChatWebSocketHandler 是自定義的消息處理器,其中 handleTextMessage() 方法實(shí)現(xiàn)了用戶發(fā)送消息到服務(wù)端,并將消息發(fā)送給所有連接的客戶端。而 afterConnectionEstablished() 和 afterConnectionClosed() 方法則分別在建立連接和關(guān)閉連接時(shí)被調(diào)用。

3.2.2 Spring Security 配置

為了保證聊天室的安全性,需要對(duì)聊天室進(jìn)行認(rèn)證和授權(quán)。使用 Spring Security 可以方便地實(shí)現(xiàn)這個(gè)功能。

首先,需要添加 Spring Security 的依賴:

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

然后創(chuàng)建一個(gè) SecurityConfig 類,用于配置 Spring Security。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/chat")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER");
    }
}

上述代碼中,configure() 方法用于配置 Spring Security 的認(rèn)證和授權(quán)規(guī)則。其中,“/login” 路徑不需要認(rèn)證就可以訪問(wèn),“/chat” 路徑則需要進(jìn)行認(rèn)證才能訪問(wèn)。同時(shí),使用 inMemoryAuthentication() 方法可以在內(nèi)存中定義用戶和角色。

3.2.3 Controller 實(shí)現(xiàn)

在 Controller 中,需要分別對(duì)登錄和聊天功能進(jìn)行處理。

@Controller
public class ChatController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/chat")
    public String chat() {
        return "chat";
    }
}

3.3 客戶端實(shí)現(xiàn)

客戶端使用 React 框架構(gòu)建,并使用 axios 庫(kù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求。具體代碼如下:

import React, { Component } from "react";
import axios from "axios";

class Login extends Component {
  constructor(props) {
    super(props);
    this.state = {
      username: "",
      password: "",
    };
  }

  handleUsernameChange = (event) => {
    this.setState({ username: event.target.value });
  };

  handlePasswordChange = (event) => {
    this.setState({ password: event.target.value });
  };

  handleSubmit = (event) => {
    event.preventDefault();

    const { username, password } = this.state;

    axios
      .post("/login", { username, password })
      .then((res) => {
        this.props.history.push("/chat");
      })
      .catch((error) => {
        console.log(error);
      });
  };

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Username:
          <input
            type="text"
            value={this.state.username}
            onChange={this.handleUsernameChange}
          />
        </label>
        <br />
        <label>
          Password:
          <input
            type="password"
            value={this.state.password}
            onChange={this.handlePasswordChange}
          />
        </label>
        <br />
        <button type="submit">Submit</button>
      </form>
    );
  }
}

export default Login;
import React, { Component } from "react";
import axios from "axios";

class Chat extends Component {
  constructor(props) {
    super(props);
    this.state = {
      message: "",
      messages: [],
    };
  }

  componentDidMount() {
    const socket = new WebSocket("ws://localhost:8080/chat");

    socket.onmessage = (event) => {
      const message = event.data;
      this.setState((prevState) => ({
        messages: [...prevState.messages, message],
      }));
    };

    this.socket = socket;
  }

  componentWillUnmount() {
    this.socket.close();
  }

  handleMessageChange = (event) => {
    this.setState({ message: event.target.value });
  };

  handleSubmit = (event) => {
    event.preventDefault();

    const message = this.state.message;
    this.socket.send(message);

    this.setState({ message: "" });
  };

  render() {
    return (
      <div>
        <ul>
          {this.state.messages.map((message, index) => (
            <li key={index}>{message}</li>
          ))}
        </ul>
        <form onSubmit={this.handleSubmit}>
          <input
            type="text"
            value={this.state.message}
            onChange={this.handleMessageChange}
          />
          <button type="submit">Send</button>
        </form>
      </div>
    );
  }
}

export default Chat;

4. 總結(jié)

本文介紹了 Websocket 協(xié)議在微服務(wù)架構(gòu)中的應(yīng)用,并以基于 Websocket 的在線聊天室為例,詳細(xì)介紹了服務(wù)端和客戶端的實(shí)現(xiàn)方式。通過(guò)使用 Spring Boot 和 React 等流行的框架,可以方便地構(gòu)建高效穩(wěn)定的基于 Websocket 的微服務(wù)應(yīng)用。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-677809.html

到了這里,關(guān)于從零開(kāi)始,手把手教你實(shí)現(xiàn)基于 Websocket 的微服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 應(yīng)用實(shí)踐|基于Python手把手教你實(shí)現(xiàn)雪花算法

    應(yīng)用實(shí)踐|基于Python手把手教你實(shí)現(xiàn)雪花算法

    ?? 作者簡(jiǎn)介:「六月暴雪飛梨花」,專注于研究Java,就職于科技型公司后端工程師 ?? 近期榮譽(yù):華為云云享專家、阿里云專家博主、 ?? 三連支持:歡迎 ??關(guān)注、??點(diǎn)贊、??收藏三連,支持一下博主~ 分布式策略ID的主要應(yīng)用在互聯(lián)網(wǎng)網(wǎng)站、搜索引擎、社交媒體、在線

    2024年02月21日
    瀏覽(27)
  • pytorch實(shí)戰(zhàn)7:手把手教你基于pytorch實(shí)現(xiàn)VGG16

    pytorch實(shí)戰(zhàn)7:手把手教你基于pytorch實(shí)現(xiàn)VGG16

    前言 ? 最近在看經(jīng)典的卷積網(wǎng)絡(luò)架構(gòu),打算自己嘗試復(fù)現(xiàn)一下,在此系列文章中,會(huì)參考很多文章,有些已經(jīng)忘記了出處,所以就不貼鏈接了,希望大家理解。 ? 完整的代碼在最后。 本系列必須的基礎(chǔ) ? python基礎(chǔ)知識(shí)、CNN原理知識(shí)、pytorch基礎(chǔ)知識(shí) 本系列的目的 ? 一是

    2023年04月19日
    瀏覽(47)
  • 手把手教你基于【SpringBoot+MyBatis】實(shí)現(xiàn)員工管理系統(tǒng)?【附完整源碼】

    手把手教你基于【SpringBoot+MyBatis】實(shí)現(xiàn)員工管理系統(tǒng)?【附完整源碼】

    Hello,你好呀,我是 灰小猿 ,一個(gè)超會(huì)寫(xiě) BUG 的程序猿??! 近期在學(xué)習(xí)springboot框架相關(guān)的內(nèi)容,相比于SSM, SpringBoot最大的特點(diǎn)就是集成了Spring和SpringMVC,讓之前繁瑣的配置工作變得更加簡(jiǎn)潔, 同時(shí)對(duì)于業(yè)務(wù)邏輯層的處理也更加的友好, 所以今天就使用 SpringBoot整合MyBati

    2023年04月08日
    瀏覽(79)
  • 手把手教你實(shí)現(xiàn)—基于OpenCV的車流量統(tǒng)計(jì)和車速檢測(cè)代碼

    手把手教你實(shí)現(xiàn)—基于OpenCV的車流量統(tǒng)計(jì)和車速檢測(cè)代碼

    ?????????本章將實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的車輛速度估計(jì)和車流量統(tǒng)計(jì)的GUI應(yīng)用,它使用了Haar級(jí)聯(lián)檢測(cè)器和相關(guān)跟蹤器來(lái)檢測(cè)和跟蹤視頻中的車輛,并通過(guò)圖像處理和數(shù)學(xué)計(jì)算來(lái)估計(jì)車輛的速度。 ? ? ? ? 1.首先,該代碼需要cv2:用于圖像處理和計(jì)算機(jī)視覺(jué)任務(wù);dlib:用于對(duì)象

    2024年02月04日
    瀏覽(17)
  • 手把手教你從0開(kāi)始在服務(wù)器上部署stable diffusion

    驗(yàn)證是否有nvidia驅(qū)動(dòng) 如果沒(méi)有顯示出顯卡信息(如下) 則需要參考 ubuntu安裝nvidia驅(qū)動(dòng) https://blog.csdn.net/Perfect886/article/details/119109380 遠(yuǎn)程連接服務(wù)器工具:VS Code https://code.visualstudio.com/Download VS Code 插件:Remote 文件傳輸工具 FileZilla https://www.filezilla.cn/download 下載地址: https:

    2024年02月06日
    瀏覽(91)
  • Swagger:手把手教你從0開(kāi)始配置idea中swagger,全步驟配圖文版。

    Swagger:手把手教你從0開(kāi)始配置idea中swagger,全步驟配圖文版。

    Swagger 是一組用于設(shè)計(jì)、構(gòu)建、文檔化和使用 RESTful Web 服務(wù)的開(kāi)源工具和框架。它允許開(kāi)發(fā)團(tuán)隊(duì)設(shè)計(jì)、構(gòu)建和測(cè)試 API,并提供易于理解的文檔,以便開(kāi)發(fā)人員和消費(fèi)者能夠快速了解和使用 API。Swagger 通常與各種編程語(yǔ)言和框架一起使用,以簡(jiǎn)化 API 的開(kāi)發(fā)和維護(hù)過(guò)程。 1.文件

    2024年02月04日
    瀏覽(90)
  • 基于python+opencv的人臉識(shí)別打卡(手把手教你)

    基于python+opencv的人臉識(shí)別打卡(手把手教你)

    2.1新建members.csv文件 文件內(nèi)容依次是id,First_name,Last_name,如圖: 2.2新建face文件夾 里面存放采集的人臉信息,用于訓(xùn)練 2.3注意事項(xiàng) 臉部識(shí)別特征模塊 Path路徑為你創(chuàng)建環(huán)境下的cv2包中haarcascade_frontalface_default.xml對(duì)應(yīng)的地址 只加了opencv中臉部特征,沒(méi)加眼部識(shí)別。(cv2包中還有眼

    2024年02月02日
    瀏覽(20)
  • 手把手教你安裝RabbitMQ(基于CentOS7系統(tǒng))

    手把手教你安裝RabbitMQ(基于CentOS7系統(tǒng))

    RabbitMQ是一個(gè)開(kāi)源的AMQP實(shí)現(xiàn),服務(wù)器端用Erlang語(yǔ)言編寫(xiě),支持多種客戶端。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。 可靠性 靈活的路由 消息集群 高可用 插件機(jī)制 多種協(xié)議 多語(yǔ)言客戶端 管理界面 跟蹤機(jī)制 先安裝一些必要的依賴

    2023年04月08日
    瀏覽(24)
  • 手把手教你本地CPU環(huán)境部署清華大模型ChatGLM-6B,利用量化模型,本地即可開(kāi)始智能聊天,達(dá)到ChatGPT的80%

    手把手教你本地CPU環(huán)境部署清華大模型ChatGLM-6B,利用量化模型,本地即可開(kāi)始智能聊天,達(dá)到ChatGPT的80%

    大家好,我是微學(xué)AI,今天教你們本地CPU環(huán)境部署清華大ChatGLM-6B模型,利用量化模型,每個(gè)人都能跑動(dòng)大模型。ChatGLM-6B是一款出色的中英雙語(yǔ)對(duì)話模型,擁有超過(guò)62億個(gè)參數(shù),可高效地處理日常對(duì)話場(chǎng)景。與GLM-130B模型相比,ChatGLM-6B在對(duì)話場(chǎng)景處理能力方面表現(xiàn)更加卓越。此

    2024年02月01日
    瀏覽(25)
  • 手把手教你實(shí)現(xiàn)SpringBoot的監(jiān)控!

    手把手教你實(shí)現(xiàn)SpringBoot的監(jiān)控!

    任何一個(gè)服務(wù)如果沒(méi)有監(jiān)控,那就是兩眼一抹黑,無(wú)法知道當(dāng)前服務(wù)的運(yùn)行情況,也就無(wú)法對(duì)可能出現(xiàn)的異常狀況進(jìn)行很好的處理,所以對(duì)任意一個(gè)服務(wù)來(lái)說(shuō),監(jiān)控都是必不可少的。 就目前而言,大部分微服務(wù)應(yīng)用都是基于 SpringBoot 來(lái)構(gòu)建,所以了解 SpringBoot 的監(jiān)控特性是非

    2024年02月11日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包