為了解決網路程式的收發效能,根據三個面向進行研究 分別是系統、程式、硬體三個面向 程式面向 程式處理邏輯優化,縮短處理下一包的時間 使用多核效能,更改成多進程或多執行序,同時以參考 Reactor、Proactor 等模型架構,不一定要採用 透過 SO_REUSEPORT 搭配 RSS 進行有效的 CPU 使用 系統面向 系統層的優化,分別針對收容能力及核心分配做處理
收容能力 不用無條件的往上增加,而是增對需求條件進行調校,因為不單單只有收容能力需要調整
1 2 3 4 5 6 # 增加對 NIC Ring Buffer 的抓取的 CPU 資源,預設 300 net.core.netdev_budget=900 # 寫入的 Socket Buffer net.core.wmem_max=20971520 # 接收的 Socket Buffer net.core.rmem_max=20971520 核心分配 若為多行程/多進程設計,並有搭配 REUSEPORT,則可以降低 CPU 分配
透過 taskset、isolation、cgroup 進行分配、隔離、綁定
硬體面向 透過支援的網卡設定 Receive Side Scaling (RSS),並透過 SO_REUSEPORT 的搭配,使 CPU 有效分配 RSS 這邊簡端說明,NIC 隊列通道會是一個以上,預設可能只用一個
可以啟用多個通道進行接收並搭配多個 CPU,達到更高的接收、發送效能
有興趣的可以閱讀 Linux Network Scaling: Receiving Packets
學習微服務框架是為了更了解各種架構對不同專案上的適應性 雖然並不是每個專案都適合為服務,但是也需要先熟練各種兵器好應對更種情況 介紹 go-micro 是一個使用 go 實現的微服務框架,可以方便幫助 go 進行微服務的開發
主要功能 服務發現 平衡負載 Client/Server Pub/Sub gRPC Require Install 安裝工具
1 2 3 4 go mod init . go get github.com/micro/micro/v2@v2.4.0 go get -u github.com/golang/protobuf/protoc-gen-go@v1.3.0 go get -u github.com/micro/protoc-gen-micro/v2@v2.3.0 mod version 這邊遇到了一些麻煩的狀況,各個版本的相依性很高,不同版本搭配可能造成錯誤
所以在這邊提供的以下的版本是確定可運行的
1 2 3 4 5 6 7 8 go 1.14 require ( github.com/golang/protobuf v1.4.2 github.com/micro/go-micro/v2 v2.9.1 github.com/micro/protoc-gen-micro/v2 v2.3.0 // indirect google.golang.org/grpc v1.26.0 ) Simple 我試著使用各種寫法來實現簡單的範例
使用 go-micro 進行服務發現,再透過 grpc 進行傳輸
是在了解微服務的同時,得知 Go 並且同時聽聞了 gRPC 所以現在來學習使用 gRPC,看看 gPRC 到底是哪裡特別 Require 首先需要安裝 gPRC 工具,撰寫好 gPRC 的 pb 文件之後,就能透過 protoc 轉換成 go 文件進行使用
1 2 go get -u google.golang.org/grpc go get -u github.com/golang/protobuf/protoc-gen-go 目錄 此次練習的目錄結構
. ├── go.mod ├── go.sum ├── proto │ └── hello.proto ├── rpc │ └── hello.pb.go ├── client │ └── main.go └── server └── main.go 撰寫 Proto 撰寫 proto 定義文件,此為官方文件 go - quickstart
proto3 及 proto2 的程式文法不同,所以版本注意
syntax = "proto3"; option go_package= ".
繼上次嘗試 Zserge 的 Lorca 後,作者還有另一個專案 WebView 而且作者在 Lorca 有說,想要更好的控制視窗,推薦使用 WebView 或其他 API 就來使用 WebView 的操作和呈現是否會更好 安裝 WebView 未開啟 GO111MODULE = off
1 $ go get -u https://github.com/zserge/webview 有開啟 GO111MODULE = on
在專案目錄中初始化 Go模組管理環境
1 2 3 $ go mod init $ go get -u https://github.com/zserge/webview 入門 作者透過直接嵌入 Wiki 的頁面,而且非常迅速且簡單
就顯示網頁的呈現來說,感覺沒什麼問題,而且沒有 Google Chromium/Chrome Swipe 的問題
1 2 3 4 5 6 7 8 9 package main import "github.com/zserge/webview" func main() { // Open wikipedia in a 800x600 resizable window webview.
Golang 本身是沒有自帶官方 GUI 給使用者開發,有 Qt、TK、Electron 各種不同實現的GUI實現方式桌面應用程式 當然較為可靠的是 Flutter for Desktop 來進行建構,畢竟背後是富爸爸 Google 進行維護 但是這次先不提 Flutter,想透過 WebView 來進行桌面應用程式開發 最初想要 HTML 嵌入顯示畫面,通常想到的都是使用 Electron 來實現
後來在 Github 上面找到 Lorca 使用 HTML5 + Golang 就能實現,不必須要 Electron
Lorca 依賴於 Chrome/Chromium 實現 UI 層,並且不需要CGO
跟 Electron 相比肯定比原本來的更輕巧,所以一直想嘗試嘗試
限制 Chrome/Chromium >= 70 安裝 Lorca 未開啟 GO111MODULE = off
1 $ go get -u https://github.com/zserge/lorca 有開啟 GO111MODULE = on
在專案目錄中初始化 Go模組管理環境
1 2 3 $ go mod init $ go get -u https://github.