golang視頻採集,golang 視頻伺服器

本文目錄一覽:

protobuf3基礎語法

ProtoBuf (Google Protocol Buffer)是由google公司用於數據交換的序列結構化數據格式,具有跨平台、跨語言、可擴展特性,同類型有常用的XML及JSON,但具有更小的傳輸體積、更高的編碼、解碼能力,特別適合於數據存儲、網路數據傳輸等對存儲體積、實時性要求高的領域,目前已經發展到protoc3 版本。

優點:空間效率高,時間效率要高,對於數據大小敏感,傳輸效率高的

缺點:消息結構可讀性不高,序列化後的位元組序列為二進位序列不能簡單的分析有效性

備註:最後的時間類型golang需要引入包 github.com/golang/protobuf/ptypes/timestamp ,定義如下

然後 .protp 文件需要導入 google/protobuf/timestamp.proto

如果一個欄位被 repeated 修飾,則表示它是一個列表類型的欄位,相當於 golang 里的切片

如果你希望可以預留一些數字標籤或者欄位可以使用reserved修飾符

第一個枚舉值的數值必須是0且至少有一個枚舉值,一個數值可以對應多個枚舉值,必須標明 option allow_alias = true; 不推薦使用負數值

在你的 .proto 文件中指定 service ,然後在 service 里定義 rpc方法 即可,要注意指定參數和返回值

gRPC 允許你定義4種類型的 service 方法

客戶端使用存根發送請求到伺服器並等待響應返回,就像平常的函數調用一樣

通過在 響應返回參數 類型前插入 stream 關鍵字,可以指定一個伺服器端的流方法。客戶端發送請求到伺服器,拿到一個流去讀取返回的消息序列。 客戶端讀取返回的流,直到裡面沒有任何消息。

通過在 請求參數 類型前指定 stream 關鍵字來指定一個客戶端的流方法。客戶端寫入一個消息序列並將其發送到伺服器,同樣也是使用流。一旦客戶端完成寫入消息,它等待伺服器完成讀取返回它的響應。

通過在請求和響應前加 stream 關鍵字去制定方法的類型。兩個流獨立操作,因此客戶端和伺服器可以以任意喜歡的順序讀寫:比如, 伺服器可以在寫入響應前等待接收所有的客戶端消息,或者可以交替的讀取和寫入消息,或者其他讀寫的組合。

如何編譯arm linux的go

Golang也就是Go語言,現在已經發行到1.4.1版本了,語言特性優越性和背後Google強大靠山什麼的就不多說了。Golang的官方提供了多個平台上的二進位安裝包,遺憾的是並非沒有發布ARM平台的二進位安裝包。ARM平台沒辦法直接從官網下載二進位安裝包來安裝,好在Golang是支持多平台並且開源的語言,因此可以通過直接在ARM平台上編譯源代碼來安裝。整個過程主要包括編譯工具配置、獲取Golang源代碼、設置Golang編譯環境變數、編譯、配置Golang行環境變數等步驟。

註:本文選用樹莓派做測試,因為樹莓派是基於ARM平台的。

1、編譯工具配置

據說下個版本的golang編譯工具要使用golang自己來寫,但目前還是使用C編譯工具的。因此,首先要配置好C編譯工具:

1.1 在Ubuntu或Debian平台上可以使用sudo apt-get install gcc libc6-dev命令安裝,樹莓派的RaspBian系統是基於Debian修改的,所以可以使用這種方法安裝。

1.2 在RedHat或CentOS 6平台上可以使用sudo yum install gcc libc-devel命令安裝。

安裝完成後可以輸入 gcc –version命令驗證是否成功安裝。

2、獲取golang源代碼

2.1 直接從官網下載源代碼壓縮包。

golang官網提供golang的源代碼壓縮包,可以直接下載,最新的1.4.1版本源代碼鏈接:

2.2 使用git工具獲取。

golang使用git版本管理工具,也可以使用git獲取golang源代碼。推薦使用這個方法,因為以後可以隨時獲取最新的golang源代碼。

2.2.1 首先確認ARM平台上已經安裝了git工具,可以使用git –version命令確認。一般linux平台都安裝了git,沒有的話可以自行安裝,不同平台的安裝方法可以參考:

2.2.2 克隆遠程golang的git倉庫到本地

在終端cd到你想要安裝golang的目錄,確保該目錄下沒有名為go的目錄。然後以下命令獲取代碼倉庫:

git clone

大陸地區可能會獲取失敗,在不翻牆的情況下我試了幾次都沒成功,原因大家都懂的。好在google已經將golang也託管到github上面,所以也可以通過下面命令獲取:

git clone

視網路情況,下載可能需要不少時間。我2M的帶寬花了將近兩個小時才下載完,雖然整個項目不過幾十兆= =

下載完成後,可以看到目錄下多了一個go目錄,裡面即為golang的源代碼,在終端上執行cd go命令進入該目錄。

執行下面命令檢出go1.4.1版本的源代碼,因為現在已經有新的代碼提交上去了,最新的代碼可能不是最穩定的:

git checkout go1.4.1

至此,最新1.4.1發行版的源代碼獲取完畢

3、設置golang的編譯環境變數

主要有GOROOT、GOOS、GOARCH、GOARM四個環境變數需要設置,先解釋四個環境變數的意義。

3.1 GOROOT

主要代表golang樹結構目錄的路徑,也就是上面git檢出的go目錄。一般可以不用設置這個環境變數,因為編譯的時候默認會以go目錄下src子目錄中的all.bash腳本運行時的父目錄作為GOROOT的值。為了保險起見,可以直接設置為go目錄的路徑。

3.2 GOOS和GOARCH

分別代表編譯的目標系統和平台,可選值如下:

GOOS GOARCH

darwin 386

darwin amd64

dragonfly 386

dragonfly amd64

freebsd 386

freebsd amd64

freebsd arm

linux 386

linux amd64

linux arm

netbsd 386

netbsd amd64

netbsd arm

openbsd 386

openbsd amd64

plan9 386

plan9 amd64

solaris amd64

windows 386

windows amd64

需要注意的是這兩個值代表的是目標系統和平台,而不是編譯源代碼的系統和平台。樹莓派的RaspBian是linux系統,所以這些GOOS設置為linux,GOARCH設置為arm。

3.3 GOARM

表示使用的浮點運算協處理器版本號,只對arm平台有用,可選值有5,6,7。如果是在目標平台上編譯源代碼,這個值可以不設置,它會自動判斷需要使用哪一個版本。

總結下來,在樹莓派上設置golang的編譯環境變數,可編輯$HOME/.bashrc文件,在末尾添加下面內容:

export GOROOT=你的go目錄路徑

export GOOS=linux

export GOARCH=arm

編輯完後保存,執行source ~/.bashrc命令讓修改生效。

4、編譯源代碼

環境變數配置完成自後就可以開始編譯源代碼。在go目錄下的src子目錄中,主要有all.bash和make.bash兩個腳本(另外還有兩個all.bat和make.bat腳本適用於window平台)。編譯實際上就是執行其中一個腳本,兩者的區別在於all.bash在編譯完成後還會執行一些測試套件。如果希望只編譯不測試,可以運行make.bash腳本。使用cd命令進入go下src目錄,執行./all.bash或者./make.bash命令即可開始編譯。由於硬體情況不同,編譯耗費的時間不同。在我的B型樹莓派編譯過程花費了將近半個小時,編譯完成後執行的測試套件又花費了差不多一個小時,總共花費了一個半小時左右。

5、配置golang運行環境變數

編譯完成後,go目錄下會生成bin目錄,裡面就是go的運行腳本。為了以後使用方法,可以將這個bin路徑添加到PATH環境變數中。同樣編輯~/.bashrc文件,因為前面設置過GOROOT環境變數指向go目錄了,所以只需要在末尾加上

export PATH=$PATH:$GOROOT/bin

保存後同樣執行source ~/.bashrc命令讓環境變數生效。

至此,golang源代碼編譯安裝成功。執行go version應該就能看到當前golang的版本信息,表示編譯安裝成功。

《深入淺出Webpack》pdf下載在線閱讀,求百度網盤雲資源

《深入淺出Webpack》(吳浩麟)電子書網盤下載免費在線閱讀

資源鏈接:

鏈接:

提取碼:6hex  

書名:深入淺出Webpack

作者:吳浩麟

豆瓣評分:6.3

出版社:電子工業出版社

出版年份:2018-1

頁數:288

內容簡介:

隨著Web開發技術的發展,Webpack憑藉其便於使用和涵蓋面廣的優勢,成為目前非常流行的前端構建工具,是每位前端工程師的必備技能之一。

《深入淺出Webpack》對Webpack進行了全面講解,涵蓋了Webpack入門、配置、實戰、優化、原理等方面的內容。其中,第1章講解Webpack入門所涉及的知識;第2章詳細講解Webpack提供的常用配置項;第3章結合實際項目中的常見場景進行實踐;第4章給出優化Webpack的優秀方案;第5章剖析了Webpack的原理,並講解如何開發Plugin和Loader;附錄匯總了常見的Loader、Plugin和Webpack的其他學習資源。除了深入講解Webpack,本書還介紹了ES6、TypeScript、PostCSS、Prepack、離線緩存、單頁應用、CDN等Web開發相關的技能。

無論是對 Webpack一無所知的初學者,還是經驗豐富的前端工程師,相信都能夠通過《深入淺出Webpack》進一步提升對Webpack的理解,並在Web開發中更熟練地運用Webpack。

作者簡介:

吳浩麟

一線前端工程師,曾就職於騰訊,現就職於美團。專註於Web開發,參與過眾多大型Web項目的構建、設計和開發,喜歡探索Web前沿技術。也是Golang和音視頻技術的愛好者,活躍於GitHub,ID為gwuhaolin。

集中式日誌分析平台 – ELK Stack – Filebeat 壓測

任何一款採集 agent 進行公司內全面推廣前都需要進行性能測試以及資源限制功能測試,以保證:

對於 Filebeat 這款號稱 golang 編寫,性能強於 logstahs-forwarder 的採集 agent,我們也需要這樣進行嚴謹對待。

硬體選擇虛擬機,6cores + 16GB Mem + 175GB SSD + 1000Mbps 帶寬;

Filebeat 配置,輸出到 console:

Filebeat 配置,輸出到 Kafka:

我們開啟 Filebeat 的 6060 埠,並使用 python 腳本進行指標採集。

expvar_rates.py ,每秒統計出 Filebeat 指標,主要看:

Step1. 啟動 Filebeat (172.16.134.8)

Step2. 啟動統計腳本

Step3. 啟動 tsar

Step4. 寫入壓測數據(6個進程寫入,6千萬條日誌)

在 6 進程數據寫入日誌文件時,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 0.8 cores。

在 6 進程數據寫入日誌文件後,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 1.6 cores。

小結:

測試步驟和上述一致,區別在於配置文件需要輸出到 Kafka。

在 6 進程數據寫入日誌文件時,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 0.7~0.8 cores。

在 6 進程數據寫入日誌文件後,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 2.0 cores。

小結:

測試步驟和上述一致,區別在於配置文件需要輸出到 Kafka。

和上述步驟不同的是,啟動 Filebeat 時需要 systemd 限制 CPU、句柄數,根據之前的理論,句柄數限制在 100 已經非常夠用,CPU 限制在 1 core。

修改 /usr/lib/systemd/system/filebeat.service :

執行 reload:

對 CPU 進行限制:

確認是否限制成功:

有如下輸出表示OK:

在 6 進程數據寫入日誌文件時,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 0.7 ~ 0.8 cores。

在 6 進程數據寫入日誌文件後,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 1.0 cores,限制生效。

小結:

在 6 進程數據寫入日誌文件時,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 0.75 ~ 0.9 cores。

在 6 進程數據寫入日誌文件後,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 1.0 cores,限制生效。

小結:

在 6 進程數據寫入日誌文件時,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 0.7 ~ 0.75 cores。

在 6 進程數據寫入日誌文件後,我們在開啟 python 統計腳本的窗口得到如下穩定的統計數據:

我們在 tsar 看到的統計數據為:

我們在 top 中可以看到 Filebeat 大致佔據了 0.9 cores,未達到限制。

小結:

A. FB 全力採集 247B 數據(真實環境類似日誌長度),速率為 ~ 40K/s,CPU 開銷為 2 cores;

B. FB 在 CPU 限制 1 cores 情況下,採集 247B 數據速率為 ~ 20K/s,可以認為單核採集速率為 ~ 20K/s/core;

C. 日誌單行數據越大,吞吐越小,5KB 每行已經非常誇張,即使如此,沒有壓縮的情況下帶寬消耗 35MBps,gzip 壓縮率一般為 0.3~0.4,佔用帶寬為 10.5~14MBps,對於千兆網卡來說壓力較小;

go語言可以做什麼

1、伺服器編程:以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日誌、數據打包、虛擬機處理、文件系統等。

2、分散式系統、資料庫代理器、中間件:例如Etcd。

3、網路編程:這一塊目前應用最廣,包括Web應用、API應用、下載應用,而且Go內置的net/http包基本上把我們平常用到的網路功能都實現了。

4、開發雲平台:目前國外很多雲平台在採用Go開發,我們所熟知的七牛雲、華為雲等等都有使用Go進行開發並且開源的成型的產品。

5、區塊鏈:目前有一種說法,技術從業人員把Go語言稱作為區塊鏈行業的開發語言。如果大家學習區塊鏈技術的話,就會發現現在有很多很多的區塊鏈的系統和應用都是採用Go進行開發的,比如ehtereum是目前知名度最大的公鏈,再比如fabric是目前最知名的聯盟鏈,兩者都有go語言的版本,且go-ehtereum還是以太坊官方推薦的版本。

自1.0版發布以來,go語言引起了眾多開發者的關注,並得到了廣泛的應用。go語言簡單、高效、並發的特點吸引了許多傳統的語言開發人員,其數量也在不斷增加。

使用 Go 語言開發的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統項目進行C語言庫綁定實現,例如 Qt、Sqlite 等。

後期的很多項目都使用 Go 語言進行重新原生實現,這個過程相對於其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發項目的出現。

深入理解golang

最近三年,在工作中使用go開發了不少服務。深感go的便捷,以及它的runtime的複雜。我覺得需要定期的進行總結,因此決定寫這篇文章,也許更準確的,應該叫筆記。

最近終於解決了一個和cgo有關的問題。這個問題從發現到解決前後經歷了接近4個月,當然,和人手不足也有關係。而對於我個人而言,這個問題其實歷時2年!這得從頭說起。

在上一家公司的一個項目里,有一個服務做音視頻數據的提取,這個服務運行在嵌入式設備TX2上。音視頻提取這一關鍵功能主要利用nvidia基於gstreamer開發的插件,這個插件可以發揮nvidia gpu的硬體解碼功能。當時這個服務使用go和c混編的方式,問題的癥狀是服務運行一段時間後,不輸出音視頻數據。遺憾的是,由於疫情,項目停止,因此沒有機會繼續研究這個問題。

時間來到去年底。當前這個項目進行壓力測試,發現關鍵的語音處理服務運行一段時間後,會出現不拉流的情況,因此也沒有後續的結果輸出。癥狀和上一個項目非常像。雖然使用的第三方SDK不一樣,但同樣用了go和c混編的方式。一開始,焦點就放在go的運行時上,覺得可能是go和c相互調用的方式不對。經過合理猜測,並用測試進行驗證後,發現問題還是在第三方拉流的SDK上,它們的回調函數必須要快,否則有可能會阻塞它們的回調線程。當然,在go調用c的時候,如果耗時比較長,會對go的運行時造成一些副作用;在c回調go的時候,go的運行時也有可能阻塞c的回調線程。但go的運行時已經比較成熟,因此我覺得它對這個問題的貢獻不大。以上採用了假設-驗證的方法,主要的原因還是第三方的拉流SDK不開源。在定位問題的過程中,使用了gdb的gcore來生成堆棧;也搭建了灰度環境來進行壓力測試,以及完善監控,這些都是解決方法的一部分。

正是這一問題,促使我更多的了解go的運行時。而我看得越多,越覺得go的運行時是一個龐大的怪物。因此,抱著能了解一點是一點的心態,不斷的完善這篇筆記。

原創文章,作者:JFPQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/150274.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JFPQ的頭像JFPQ
上一篇 2024-11-07 09:50
下一篇 2024-11-07 09:50

相關推薦

  • 使用Golang調用Python

    在現代軟體開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Golang中使用strings.Split函數進行字元串分割的方法

    一、Split函數的基本用法 字元串是編程中常見的數據類型,它們可以在程序中被處理、存儲和傳輸。在Go語言中,字元串也是一個基本的數據類型,而strings包提供了一些操作字元串的…

    編程 2025-04-23
  • Golang環境變數全面解析

    Golang是一門非常流行的開發語言,擁有高效的CGO、簡單易懂的語法、高並發能力等優點,然而它也需要使用環境變數來配置一些參數。在本篇文章中,我們將從多個方面對Golang環境變…

    編程 2025-04-23
  • 深入下探golang http server

    Go語言已經成為了軟體開發領域的熱門語言,它的高性能、應用廣泛、安全性好,使得它成為了眾多開發者心目中的首選編程語言。在眾多應用場景中,golang http server的應用非…

    編程 2025-04-23
  • Compacted:一個高性能的Golang緩存庫

    一、簡介 Compacted是一個使用Golang編寫的緩存庫,旨在提供高性能的內存緩存功能。相對於其他常見的緩存庫,Compacted在內存使用和性能方面都做了一定的優化。 緩存…

    編程 2025-04-23
  • Golang nil解析

    一、什麼是nil Nil是Golang語言中的一個預定義標識符,表示一個零值對象,通常表示一個空指針。Nil被定義為指針類型、函數類型、介面類型、map類型、Slice類型、Cha…

    編程 2025-04-23
  • Golang中文社區介紹

    Go語言或者叫Golang是一個開源項目,目前是由Google開發維護的一種靜態類型、並發安全、編譯型的編程語言。Go語言的特點是結構清晰、並發能力強、具有垃圾回收機制並且支持跨平…

    編程 2025-04-23
  • 詳解golang walk控制項庫

    Golang提供的可視化庫有很多個,其中walk是一個比較好用且強大的庫。本文將從多個方面對walk進行詳細闡述,包括基本控制項、布局、菜單、圖標等方面的內容。 一、控制項基礎 Gol…

    編程 2025-04-22
  • Golang泛型詳解

    Golang泛型成為眾多開發人員關注的話題,因為它使得代碼更加通用、可重用、簡單、易於維護。那麼,什麼是泛型、為什麼它如此重要,如何使用它?本文將從多個方面為您詳細闡述Golang…

    編程 2025-04-20

發表回復

登錄後才能評論