avatarJen-Hsuan Hsieh (Sean)

总结

本文介绍了如何在Golang和ReactJS之间建立实时通信,包括使用AJAX和短轮询以及Websocket技术。

摘要

文章首先回顾了使用Golang建立Web服务的基础,包括设置路由、中间件、连接数据库以及创建Windows服务。接着,作者提出了如何让用户即时知道任务执行状态的问题。文章指出,可以从创建简单的页面开始,并通过本文了解如何实现前端页面与提供API的Web服务之间的通信。

文章详细说明了前端页面主动调用API的方法,包括使用Axios、JQuery、AJAX或Fetch API进行AJAX调用,并在React组件加载完成后通过Fetch API进行数据请求。同时,文章提到了短轮询的方法,即通过setTimeout让浏览器定期检查服务器是否有新数据,但指出这不是最佳实践,因为它会产生大量的请求并消耗网络资源。

文章进一步介绍了Websocket技术,它不仅允许后端主动推送消息,还支持浏览器和服务器之间的双向通信,减少了不必要的流量。在Golang中,文章使用了gorilla/websocket库来实现Websocket功能,并提供了具体的代码示例。在React中,则使用react-websocket库来处理Websocket通信。

最后,文章总结了client-server之间的通信方式,强调了Websocket相对于短轮询的优势,并提供了Golang和ReactJS中Websocket的使用示例和实现方法。作者也邀请读者对文章中的内容进行讨论和交流。

观点

  1. 前端与后端通信的重要性:作者强调了在Web开发中,前端页面与后端API之间的即时通信对于提供良好用户体验至关重要。
  2. AJAX和短轮询的局限性:虽然AJAX和短轮询可以实现前端与后端的通信,但它们存在资源消耗和效率不高的问题,尤其是在大量客户端连接的情况下。
  3. Websocket的优势:Websocket技术提供了一种更高效的通信方式,它允许服务器主动向客户端发送消息,实现了真正的双向通信,大大减少了不必要的HTTP请求和网络流量。
  4. Golang和ReactJS在Websocket实现上的具体方法:文章通过具体的代码示例展示了如何在Golang中使用gorilla/websocket库,以及如何在ReactJS中使用react-websocket库来实现Websocket通信。
  5. 开发者间的交流和学习:作者鼓励读者在阅读文章时积极提出见解和建议,以便共同进步和学习。

[Golang] Build A Simple Web Service part.5 — Communicate with the ReactJS page

Polling and use web socket in Golang and React.

Copy right@A layman

Introduction

建立Route, 加入Middleware, 連接Database的學習,已經足夠讓我們以用Golang建立起簡單的API以提供服務。在學習連接到server的Windows service的能力後,web service可以接受外部的請求後在server執行一些工作並在任務完畢後更新到Database。

下一個問題則是:如何讓使用者即時地知道工作執行的狀態呢?

可以先從建立簡單的頁面開始(這部分可以參考此文); 接著參考本篇以了解如何讓前端頁面與提供API的web service溝通。

本篇文章將說明前端頁面主動呼叫API,以及透過Web socket讓後端主動推送訊息到前端的做法,以下將以ReactJS為前端的範例。

前端頁面主動呼叫API: AJAX and Short polling

在React上可以透過AxiosJQueryAJAX ,或是瀏覽器所提供的Fetch API完成AJAX call,不同瀏覽器的AJAX支援度如下:

Picture originated from https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

在React上正確的做法,是將Fetch寫在componentDidMount裡,componentDidMount的將會在component載入完畢後執行,Fetch是一個單向的做法,由前端發動request向service取得資料,後端被動地等待request。

如果要做短輪詢(Short polling), 讓瀏覽器定期檢查server是否有新的資料,可以將setTimeout寫到componentDidMount裡,這麼做簡單,但並非好作法, request數量很大而且消耗network throughput資源。

後端主動推送訊息: Web socket

準確地說,web socket不只是讓後端推送訊息,而是讓瀏覽器與伺服器互動的技術,屬於雙向溝通,讓瀏覽器不必定期傳送訊息至伺服器並接受事件驅動回應,進而節省server side的資源。

在web socket官網中說明了polling與web socket在不同數量的client時的network throughput,case A,case B,case C的client數分別是1000,10000,10000,可以看出在client數量很大時,polling會產生很多不必要的traffic。

在開發上做法上也很簡單,只要創建連結後client-server就能互相通訊,以下將說明在Golang及React上web socket的用法。

Web socket for Golang

這裏所使用的web socket套件是gorilla/websocket,安裝方式為在terminal中輸入以下指令:

go get github.com/gorilla/websocket

繼續修改專案,新增libs/webSocket.go:

Copy right@A layman

libs/webSocket.go的內容如下,透過websocket.Upgrader做web socket的設定,其中的checkOrigin是提供跨域校驗,可以讓他always return true以不做檢驗,這段程式碼是讓server在特定情形下推送訊息給client,因此這個function中應該是 個無限迴圈,以接收或傳送訊息。

如果需要讀取從client傳送來的訊息,可以用:

_, body, _ := c.ReadMessage()

接著修改routes/webService.go如下,先在InitRouter()的routes中增加一個新的controller, 接著新增對應的function,如此一來便替client提供了web socket的接口:

Web socket for React

在React可以使用react-websocket套件,安裝方式為在terminal中輸入:

npm install --save react-websocket

以下為範例,透過

Summary

client-server間的溝通方式很多,這篇說明了polling與web socket的區別,以及在多數時刻我們應該盡量使用web socket以節省資源,此外也說明了React及Golang的web socket用法, 以及兩者間通訊的實作

謝謝你耐心地讀到Summary,我是Sean HS, 是位軟體工程師。 這片文章是我在研究過程時的筆記,若有錯誤之處,期待您的見解,與您交流討論。

Related topics

Web Development
Software Development
React
中文
Websocket
Recommended from ReadMedium