go語言編寫客戶端,go語言guan方文檔

GO語言商業(yè)案例(十八):stream

切換到新語言始終是一大步,尤其是當您的團隊成員只有一個時有該語言的先前經驗。現在,Stream 的主要編程語言從 Python 切換到了 Go。這篇文章將解釋stream決定放棄 Python 并轉向 Go 的一些原因。

創(chuàng)新互聯(lián)建站是一家集網站建設,廣安企業(yè)網站建設,廣安品牌網站建設,網站定制,廣安網站建設報價,網絡營銷,網絡優(yōu)化,廣安網站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網站。

Go 非???。性能類似于 Java 或 C++。對于用例,Go 通常比 Python 快 40 倍。

對于許多應用程序來說,編程語言只是應用程序和數據庫之間的粘合劑。語言本身的性能通常并不重要。然而,Stream 是一個API 提供商,為 700 家公司和超過 5 億最終用戶提供提要和聊天平臺。多年來,我們一直在優(yōu)化 Cassandra、PostgreSQL、Redis 等,但最終,您會達到所使用語言的極限。Python 是一門很棒的語言,但對于序列化/反序列化、排名和聚合等用例,它的性能相當緩慢。我們經常遇到性能問題,Cassandra 需要 1 毫秒來檢索數據,而 Python 會花費接下來的 10 毫秒將其轉換為對象。

看看我如何開始 Go 教程中的一小段 Go 代碼。(這是一個很棒的教程,也是學習 Go 的一個很好的起點。)

如果您是 Go 新手,那么在閱讀那個小代碼片段時不會有太多讓您感到驚訝的事情。它展示了多個賦值、數據結構、指針、格式和一個內置的 HTTP 庫。當我第一次開始編程時,我一直喜歡使用 Python 更高級的功能。Python 允許您在編寫代碼時獲得相當的創(chuàng)意。例如,您可以:

這些功能玩起來很有趣,但是,正如大多數程序員會同意的那樣,在閱讀別人的作品時,它們通常會使代碼更難理解。Go 迫使你堅持基礎。這使得閱讀任何人的代碼并立即了解發(fā)生了什么變得非常容易。 注意:當然,它實際上有多“容易”取決于您的用例。如果你想創(chuàng)建一個基本的 CRUD API,我仍然推薦 Django + DRF或 Rails。

作為一門語言,Go 試圖讓事情變得簡單。它沒有引入許多新概念。重點是創(chuàng)建一種非常快速且易于使用的簡單語言。它唯一具有創(chuàng)新性的領域是 goroutine 和通道。(100% 正確CSP的概念始于 1977 年,所以這項創(chuàng)新更多是對舊思想的一種新方法。)Goroutines 是 Go 的輕量級線程方法,通道是 goroutines 之間通信的首選方式。Goroutines 的創(chuàng)建非常便宜,并且只需要幾 KB 的額外內存。因為 Goroutine 非常輕量,所以有可能同時運行數百甚至數千個。您可以使用通道在 goroutine 之間進行通信。Go 運行時處理所有復雜性。goroutines 和基于通道的并發(fā)方法使得使用所有可用的 CPU 內核和處理并發(fā) IO 變得非常容易——所有這些都不會使開發(fā)復雜化。與 Python/Java 相比,在 goroutine 上運行函數需要最少的樣板代碼。您只需在函數調用前加上關鍵字“go”:

Go 的并發(fā)方法很容易使用。與 Node 相比,這是一種有趣的方法,開發(fā)人員必須密切關注異步代碼的處理方式。Go 中并發(fā)的另一個重要方面是競爭檢測器。這樣可以很容易地確定異步代碼中是否存在任何競爭條件。

我們目前用 Go 編寫的最大的微服務編譯需要 4 秒。與以編譯速度慢而聞名的 Java 和 C++ 等語言相比,Go 的快速編譯時間是一項重大的生產力勝利。我喜歡在程序編譯的時候摸魚,但在我還記得代碼應該做什么的同時完成事情會更好。

首先,讓我們從顯而易見的開始:與 C++ 和 Java 等舊語言相比,Go 開發(fā)人員的數量并不多。根據StackOverflow的數據, 38% 的開發(fā)人員知道 Java, 19.3% 的人知道 C++,只有 4.6% 的人知道 Go。GitHub 數據顯示了類似的趨勢:Go 比 Erlang、Scala 和 Elixir 等語言使用更廣泛,但不如 Java 和 C++ 流行。幸運的是,Go 是一種非常簡單易學的語言。它提供了您需要的基本功能,僅此而已。它引入的新概念是“延遲”聲明和內置的并發(fā)管理與“goroutines”和通道。(對于純粹主義者來說:Go 并不是第一種實現這些概念的語言,只是第一種使它們流行起來的語言。)任何加入團隊的 Python、Elixir、C++、Scala 或 Java 開發(fā)人員都可以在一個月內在 Go 上發(fā)揮作用,因為它的簡單性。與許多其他語言相比,我們發(fā)現組建 Go 開發(fā)人員團隊更容易。如果您在博爾德和阿姆斯特丹等競爭激烈的生態(tài)系統(tǒng)中招聘人員,這是一項重要的優(yōu)勢。

對于我們這樣規(guī)模的團隊(約 20 人)來說,生態(tài)系統(tǒng)很重要。如果您必須重新發(fā)明每一個小功能,您根本無法為您的客戶創(chuàng)造價值。Go 對我們使用的工具有很好的支持。實體庫已經可用于 Redis、RabbitMQ、PostgreSQL、模板解析、任務調度、表達式解析和 RocksDB。與 Rust 或 Elixir 等其他較新的語言相比,Go 的生態(tài)系統(tǒng)是一個重大勝利。它當然不如 Java、Python 或 Node 之類的語言好,但它很可靠,而且對于許多基本需求,你會發(fā)現已經有高質量的包可用。

Gofmt 是一個很棒的命令行實用程序,內置在 Go 編譯器中,用于格式化代碼。就功能而言,它與 Python 的 autopep8 非常相似。我們大多數人并不真正喜歡爭論制表符與空格。格式的一致性很重要,但實際的格式標準并不那么重要。Gofmt 通過使用一種正式的方式來格式化您的代碼來避免所有這些討論。

Go 對協(xié)議緩沖區(qū)和 gRPC 具有一流的支持。這兩個工具非常適合構建需要通過 RPC 通信的微服務。您只需要編寫一個清單,在其中定義可以進行的 RPC 調用以及它們采用的參數。然后從這個清單中自動生成服務器和客戶端代碼。生成的代碼既快速又具有非常小的網絡占用空間并且易于使用。從同一個清單中,您甚至可以為許多不同的語言生成客戶端代碼,例如 C++、Java、Python 和 Ruby。因此,內部流量不再有模棱兩可的 REST 端點,您每次都必須編寫幾乎相同的客戶端和服務器代碼。.

Go 沒有像 Rails 用于 Ruby、Django 用于 Python 或 Laravel 用于 PHP 那樣的單一主導框架。這是 Go 社區(qū)內激烈爭論的話題,因為許多人主張你不應該一開始就使用框架。我完全同意這對于某些用例是正確的。但是,如果有人想構建一個簡單的 CRUD API,他們將更容易使用 Django/DJRF、Rails Laravel 或Phoenix。對于 Stream 的用例,我們更喜歡不使用框架。然而,對于許多希望提供簡單 CRUD API 的新項目來說,缺乏主導框架將是一個嚴重的劣勢。

Go 通過簡單地從函數返回錯誤并期望調用代碼來處理錯誤(或將其返回到調用堆棧)來處理錯誤。雖然這種方法有效,但很容易失去問題的范圍,以確保您可以向用戶提供有意義的錯誤。錯誤包通過允許您向錯誤添加上下文和堆棧跟蹤來解決此問題。另一個問題是很容易忘記處理錯誤。像 errcheck 和 megacheck 這樣的靜態(tài)分析工具可以方便地避免犯這些錯誤。雖然這些變通辦法效果很好,但感覺不太對勁。您希望該語言支持正確的錯誤處理。

Go 的包管理絕不是完美的。默認情況下,它無法指定特定版本的依賴項,也無法創(chuàng)建可重現的構建。Python、Node 和 Ruby 都有更好的包管理系統(tǒng)。但是,使用正確的工具,Go 的包管理工作得很好。您可以使用Dep來管理您的依賴項,以允許指定和固定版本。除此之外,我們還貢獻了一個名為的開源工具VirtualGo,它可以更輕松地處理用 Go 編寫的多個項目。

我們進行的一個有趣的實驗是在 Python 中使用我們的排名提要功能并在 Go 中重寫它??纯催@個排名方法的例子:

Python 和 Go 代碼都需要執(zhí)行以下操作來支持這種排名方法:

開發(fā) Python 版本的排名代碼大約花了 3 天時間。這包括編寫代碼、單元測試和文檔。接下來,我們花了大約 2 周的時間優(yōu)化代碼。其中一項優(yōu)化是將分數表達式 (simple_gauss(time)*popularity) 轉換為抽象語法樹. 我們還實現了緩存邏輯,可以在未來的特定時間預先計算分數。相比之下,開發(fā)此代碼的 Go 版本大約需要 4 天時間。性能不需要任何進一步的優(yōu)化。因此,雖然 Python 的最初開發(fā)速度更快,但基于 Go 的版本最終需要我們團隊的工作量大大減少。另外一個好處是,Go 代碼的執(zhí)行速度比我們高度優(yōu)化的 Python 代碼快大約 40 倍。現在,這只是我們通過切換到 Go 體驗到的性能提升的一個示例。

與 Python 相比,我們系統(tǒng)的其他一些組件在 Go 中構建所需的時間要多得多。作為一個總體趨勢,我們看到 開發(fā) Go 代碼需要更多的努力。但是,我們花更少的時間 優(yōu)化 代碼以提高性能。

我們評估的另一種語言是Elixir.。Elixir 建立在 Erlang 虛擬機之上。這是一種迷人的語言,我們之所以考慮它,是因為我們的一名團隊成員在 Erlang 方面擁有豐富的經驗。對于我們的用例,我們注意到 Go 的原始性能要好得多。Go 和 Elixir 都可以很好地服務數千個并發(fā)請求。但是,如果您查看單個請求的性能,Go 對于我們的用例來說要快得多。我們選擇 Go 而不是 Elixir 的另一個原因是生態(tài)系統(tǒng)。對于我們需要的組件,Go 有更成熟的庫,而在許多情況下,Elixir 庫還沒有準備好用于生產環(huán)境。培訓/尋找開發(fā)人員使用 Elixir 也更加困難。這些原因使天平向 Go 傾斜。Elixir 的 Phoenix 框架看起來很棒,絕對值得一看。

Go 是一種非常高性能的語言,對并發(fā)有很好的支持。它幾乎與 C++ 和 Java 等語言一樣快。雖然與 Python 或 Ruby 相比,使用 Go 構建東西確實需要更多時間,但您將節(jié)省大量用于優(yōu)化代碼的時間。我們在Stream有一個小型開發(fā)團隊,為超過 5 億最終用戶提供動力和聊天。Go 結合了 強大的生態(tài)系統(tǒng) 、新開發(fā)人員的 輕松入門、快速的性能 、對并發(fā)的 可靠支持和高效的編程環(huán)境 ,使其成為一個不錯的選擇。Stream 仍然在我們的儀表板、站點和機器學習中利用 Python 來提供個性化的訂閱源. 我們不會很快與 Python 說再見,但今后所有性能密集型代碼都將使用 Go 編寫。我們新的聊天 API也完全用 Go 編寫。

Go語言-一個簡單的MockServer實現

用于在開發(fā)階段,服務端接口沒有正式完成之前,模擬接口請求,便于客戶端測試。

建立一個文件夾(Config),放置所有的接口文件

將接口按如下json格式存儲到成文件,一個接口對應一個文件

如登錄接口:./Config/login.json

定義接口

讀取所有的接口配置文件

GO語言(十三):使用 Go 和 Gin 開發(fā) RESTful API(下)

當客戶端在 發(fā)出POST請求時/albums,您希望將請求正文中描述的專輯添加到現有專輯數據中。

為此,您將編寫以下內容:

1、編寫代碼

a.添加代碼以將專輯數據添加到專輯列表。

在此代碼中:

1)用于Context.BindJSON 將請求正文綁定到newAlbum。

2) album將從 JSON 初始化的結構附加到albums 切片。

3)向響應添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。

b.更改您的main函數,使其包含該router.POST函數,如下所示。

在此代碼中:

1)將路徑中的POST方法與 /albumspostAlbums函數相關聯(lián)。

使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關聯(lián)。這樣,您可以根據客戶端使用的方法將發(fā)送到單個路徑的請求單獨路由。

a.如果服務器從上一節(jié)開始仍在運行,請停止它。

b.從包含 main.go 的目錄中的命令行,運行代碼。

c.從不同的命令行窗口,用于curl向正在運行的 Web 服務發(fā)出請求。

該命令應顯示添加專輯的標題和 JSON。

d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來確認添加了新專輯。

該命令應顯示專輯列表。

當客戶端向 發(fā)出請求時GET /albums/[id],您希望返回 ID 與id路徑參數匹配的專輯。

為此,您將:

a.在您在上一節(jié)中添加的函數下方postAlbums,粘貼以下代碼以檢索特定專輯。

此getAlbumByID函數將提取請求路徑中的 ID,然后找到匹配的專輯。

在此代碼中:

(1)Context.Param用于從 URL 中檢索id路徑參數。當您將此處理程序映射到路徑時,您將在路徑中包含參數的占位符。

(2)循環(huán)album切片中的結構,尋找其ID 字段值與id參數值匹配的結構。如果找到,則將該album結構序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應返回。

如上所述,實際使用中的服務可能會使用數據庫查詢來執(zhí)行此查找。

(3)如果找不到專輯,則返回 HTTP 404錯誤。

b.最后,更改您的main,使其包含對router.GET的新調用,路徑現在為/albums/:id ,如以下示例所示。

在此代碼中:

(1)將/albums/:id路徑與getAlbumByID功能相關聯(lián)。在 Gin 中,路徑中項目前面的冒號表示該項目是路徑參數。

a.如果服務器從上一節(jié)開始仍在運行,請停止它。

b.在包含 main.go 的目錄中的命令行中,運行代碼以啟動服務器。

c.從不同的命令行窗口,用于curl向正在運行的 Web 服務發(fā)出請求。

該命令應顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯誤消息的 JSON。

恭喜!您剛剛使用 Go 和 Gin 編寫了一個簡單的 RESTful Web 服務。

本節(jié)包含您使用本教程構建的應用程序的代碼。

Go語言HTTPServer開發(fā)的六種實現

學完了 net/http 和 fasthttp 兩個HTTP協(xié)議接口的客戶端實現,接下來就要開始Server的開發(fā),不學不知道一學嚇一跳,居然這兩個庫還支持Server的開發(fā),太方便了。

相比于Java的HTTPServer開發(fā)基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種 handle 對象。Golang的Server開發(fā)顯得非常簡單,就是因為特別簡單,或者說沒有形成特別統(tǒng)一的規(guī)范或者框架,我發(fā)現了很多實現方式,HTTP協(xié)議基于還是 net/http 和 fasthttp ,但是 handle 語法就多種多樣了。

先復習一下: Golang語言HTTP客戶端實踐 、 Golang fasthttp實踐 。

在Golang語言方面,實現某個功能的庫可能會比較多,有機會還是要多跟同行交流,指不定就發(fā)現了更好用的庫。下面我分享我學到的六種Server開發(fā)的實現Demo。

基于 net/http 實現,這是一種比較基礎的,對于接口和 handle 映射關系處理并不優(yōu)雅,不推薦使用。

第二種也是基于 net/http ,這種編寫語法可以很好地解決第一種的問題,handle和path有了類似配置的語法,可讀性提高了很多。

第三個基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 對象用來處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。

第四種依然基于 net/http 實現,引入了 github.com/gin-gonic/gin 的路由,看起來接口和 handle 映射關系比較明晰了。

第五種基于 fasthttp 開發(fā),使用都是 fasthttp 提供的API,可讀性尚可,handle配置倒是更像Java了。

第六種依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有點奇怪兩個居然不在一個GitHub倉庫里。使用語法跟第三種方式有點類似,比較有條理,有利于閱讀。

golang SSH客戶端三件套 - 1遠程連接 shell

golang SSH客戶端系列文章目錄

SSH(Secure Shell)協(xié)議在遠程登錄時比較常用,但是除此之外還有一些其它的功能也很好用,比如端口映射,X11轉發(fā),sftp文件傳輸等。

以下三篇文章將介紹golang版SSH的遠程登錄功能,端口映射功能及sftp文件傳輸功能。X11包含GUI的一些操作,沒有找到相關的包,故不做介紹

通過golang自帶的ssh包 golang.org/x/crypto/ssh 可以實現遠程登錄功能, 默認是不支持tab鍵和上下箭頭的 ,

通過導入golang.org/x/crypto/ssh/terminal來創(chuàng)建VT100終端可以支持tab等功能,讓golang版本的ssh客戶端體驗和平時用的其它客戶端差不多。

為什么go語言適合開發(fā)網游服務器端

前段時間在golang-China讀到這個貼:

個人覺得golang十分適合進行網游服務器端開發(fā),寫下這篇文章總結一下。

從網游的角度看:

要成功的運營一款網游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現。而這就需要多次大量導入用戶,在同時在線用戶量達到某個臨界點的時候,才有可能完成。因此,多人同時在線十分有必要。

再來看網游的常見玩法,除了排行榜這類統(tǒng)計和數據匯總的功能外,基本沒有需要大量CPU時間的應用。以前的項目里,即時戰(zhàn)斗產生的各種傷害計算對CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務器端-客戶端這樣一個來回,為了獲得高響應速度,滿足玩家體驗,服務器端的處理也不能占用太多時間。所以,每次請求對應的CPU占用是比較小的。

網游的IO主要分兩個方面,一個是網絡IO,一個是磁盤IO。網絡IO方面,可以分成美術資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請求的字節(jié)數很小,但由于多人同時在線,因此并發(fā)數相當高。另外,地圖信息的廣播也會帶來比較頻繁的網絡通信。磁盤IO方面,主要是游戲數據的保存。采用不同的數據庫,會有比較大的區(qū)別。以前的項目里,就經歷了從MySQL轉向MongoDB這種內存數據庫的過程,磁盤IO不再是瓶頸。總體來說,還是用內存做一級緩沖,避免大量小數據塊讀寫的方案。

針對網游的這些特點,golang的語言特性十分適合開發(fā)游戲服務器端。

首先,go語言提供goroutine機制作為原生的并發(fā)機制。每個goroutine所需的內存很少,實際應用中可以啟動大量的goroutine對并發(fā)連接進行響應。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時候,調度器就會自動切換到另一個goroutine執(zhí)行,保證CPU不會因為IO而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進程來榨取多核機器的性能了。通過設置最大線程數,可以控制go所啟動的線程,每個線程執(zhí)行一個goroutine,讓CPU滿負載運行。

同時,go語言為goroutine提供了獨到的通信機制channel。channel發(fā)生讀寫的時候,也會掛起當前操作channel的goroutine,是一種同步阻塞通信。這樣既達到了通信的目的,又實現同步,用CSP模型的觀點看,并發(fā)模型就是通過一組進程和進程間的事件觸發(fā)解決任務的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實現相同的功能。但go語言提供的這種協(xié)程間通信機制,十分優(yōu)雅地揭示了協(xié)程通信的本質,避免了以往鎖的顯式使用帶給程序員的心理負擔,確是一大優(yōu)勢。進行網游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調度的問題,以及線程間數據依賴的問題。因為,線程間的channel通信,已經表達了線程間的數據依賴關系了,而go的調度器會給予妥善的處理。

另外,go語言提供的gc機制,以及對指針的保護式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。

展望未來,我期待go語言社區(qū)能夠提供更多的goroutine間的隔離機制。個人十分推崇erlang社區(qū)的脆崩哲學,推動應用發(fā)生預期外行為時,盡早崩潰,再fork出新進程處理新的請求。對于協(xié)程機制,需要由程序員保證執(zhí)行的函數不會發(fā)生死循環(huán),導致線程卡死。如果能夠定制goroutine所執(zhí)行函數的最大CPU執(zhí)行時間,及所能使用的最大內存空間,對于提升系統(tǒng)的魯棒性,大有裨益。

網頁標題:go語言編寫客戶端,go語言guan方文檔
網站地址:http://www.muchs.cn/article28/phjjjp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計公司外貿建站、企業(yè)建站網站營銷、企業(yè)網站制作Google

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站