我正在尋找一個可以與 Go、HTMX 和 Tailwwindcss 配合使用的有趣項目,最終利用 Web 套接字的功能構建了一個簡單的基於 Web 的實時系統監視器。這是結果。
它顯示系統資訊、記憶體、磁碟、CPU 和正在運行的進程,每 5 秒自動更新一次。
我將在這篇文章中對程式碼進行一些分解。
堆疊
- 去1.23.2
- Htmx
- Tailwindcss
- Gopsutil
- Websocket
- Htmx websocket 擴充
HTTP伺服器
type HttpServer struct { subscriberMessageBuffer int Mux http.ServeMux subscribersMutex sync.Mutex subscribers map[*subscriber]struct{} } type subscriber struct { msgs chan []byte }
這非常簡單。 HttpServer 包含一個 http.ServeMux 作為 http 處理程序和稍後用於 Web 套接字廣播的訂閱者。訂閱者只是有用於資料更新的訊息通道。
由於它只需要提供單一 HTML 文件,因此它需要 URL 來顯示頁面,以及用於 Web 套接字連接的 URL。
func NewHttpServer() *HttpServer { s := &HttpServer{ subscriberMessageBuffer: 10, subscribers: make(map[*subscriber]struct{}), } s.Mux.Handle("/", http.FileServer(http.Dir("./views"))) s.Mux.HandleFunc("/ws", s.subscribeHandler) return s }
Web Socket 連線和訂閱者
端點 /ws 將處理 Web 套接字連線並管理訂閱者。首先,它將啟動一個新訂閱者並將其新增至 http 伺服器結構中的對應。鎖將用於防止競爭條件,因為我們稍後將使用 go 例程。
func (s *HttpServer) subscribeHandler(w http.ResponseWriter, r *http.Request) { err := s.subscribe(r.Context(), w, r) if err != nil { fmt.Println(err) return } } func (s *HttpServer) addSubscriber(subscriber *subscriber) { s.subscribersMutex.Lock() s.subscribers[subscriber] = struct{}{} s.subscribersMutex.Unlock() fmt.Println("subscriber added", subscriber) }
Web 套接字開始接受連接,並透過循環,我們將偵測來自訂閱者的傳入通道訊息並將其寫入 Web 套接字。
func (s *HttpServer) subscribe(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var c *websocket.Conn subscriber := &subscriber{ msgs: make(chan []byte, s.subscriberMessageBuffer), } s.addSubscriber(subscriber) c, err := websocket.Accept(w, r, nil) if err != nil { return err } defer c.CloseNow() ctx = c.CloseRead(ctx) for { select { case msg := <h2> 自動更新 </h2> <p>自動更新系統資訊資料由 goroutine 處理。我們將建立一個 html 回應,該回應將透過 Web 套接字發送,htmx 將處理 html 端的更新。 <br> </p> <pre class="brush:php;toolbar:false">func main() { fmt.Println("Starting system monitor") s := server.NewHttpServer() go func(s *server.HttpServer) { for { hostStat, _ := host.Info() timestamp := time.Now().Format("2006-01-02 15:04:05") html := ` <span hx-swap-oob="innerHTML:#data-timestamp">` + timestamp + `</span> <span hx-swap-oob="innerHTML:#system-hostname">` + hostStat.Hostname + `</span> <span hx-swap-oob="innerHTML:#system-os">` + hostStat.OS + `</span> ` s.Broadcast([]byte(html)) time.Sleep(time.Second * 5) } }(s) // ... }
htmx 中的語法 hx-swap-oob="innerHTML:#data-timestamp" 告訴我們在 HTML 中交換 data-timestamp id 內的元件。所有交換機制對於其他系統資訊組件都是相同的。
所有可交換的 html 元件將透過 Broadcast(msg) 方法發送,稍後將每 5 秒通過通道發送一次。
func (s *HttpServer) Broadcast(msg []byte) { s.subscribersMutex.Lock() for subscriber := range s.subscribers { subscriber.msgs <h2> HTMX 視圖 </h2> <p>這是純 HTML 文件,對於 Tailwindcss 我簡單地使用了 CDN <br> </p> <pre class="brush:php;toolbar:false"><script src="https://cdn.tailwindcss.com"></script>
HTMX 和使用 CDN 的 Web 套接字擴充的想法相同。
<script src="https://unpkg.com/htmx.org@2.0.3" integrity="sha384-0895/pl2MU10Hqc6jd4RvrthNlDiE9U1tWmX7WRESftEDRosgxNsQG/Ze9YMRzHq" crossorigin="anonymous"></script> <script src="https://unpkg.com/htmx-ext-ws@2.0.1/ws.js"></script>
如何連接網路套接字?
系統監視器頁面預計會透過 Web 套接字接收所有數據,以便我可以從主 div 容器中設定它。指定 hx-ext=”ws” 告訴 HTMX 使用 Web 套接字擴展,指定 ws-connect=”/ws” 告訴 Web 套接字透過 /ws URL 連線。
<h2> 完整程式碼 </h2> <p>這是程式碼的完整版本 https://github.com/didikz/gosysmon-web,您可能想嘗試自己的版本。 </p> <p>編碼愉快! </p>
以上是使用 Go、HTMX 和 Web Socket 建立簡單的即時系統監視器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golang適合快速開發和並發編程,而C 更適合需要極致性能和底層控制的項目。 1)Golang的並發模型通過goroutine和channel簡化並發編程。 2)C 的模板編程提供泛型代碼和性能優化。 3)Golang的垃圾回收方便但可能影響性能,C 的內存管理複雜但控制精細。

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具