go語言回調(diào) go語言返回json給前端

Go之回調(diào)函數(shù)

高階函數(shù):

創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的達(dá)州托管服務(wù)器服務(wù)

??根據(jù)go語言的數(shù)據(jù)類型的特點,可以將一個函數(shù)作為另一個函數(shù)的參數(shù)

??fun1(),fun2()

????將fun1函數(shù)作為fun2這個函數(shù)的參數(shù)。

??fun2函數(shù):高階函數(shù)

????接受了一個函數(shù)作為參數(shù)的函數(shù),高階函數(shù)

??fun1函數(shù):回調(diào)函數(shù)

????作為另一個函數(shù)的參數(shù)的函數(shù),叫做回調(diào)函數(shù)

Golang 游戲leaf系列(六) Go模塊

在 Golang 游戲leaf系列(一) 概述與示例 (下文簡稱系列一)中,提到過Go模塊用于創(chuàng)建能夠被 Leaf 管理的 goroutine。Go模塊是對golang中g(shù)o提供一些額外功能。Go提供回調(diào)功能,LinearContext提供順序調(diào)用功能。善用 goroutine 能夠充分利用多核資源,Leaf 提供的 Go 機制解決了原生 goroutine 存在的一些問題:

我們來看一個例子(可以在 LeafServer 的模塊的 OnInit 方法中測試):

這里的 Go 方法接收 2 個函數(shù)作為參數(shù),第一個函數(shù)會被放置在一個新創(chuàng)建的 goroutine 中執(zhí)行,在其執(zhí)行完成之后,第二個函數(shù)會在當(dāng)前 goroutine 中被執(zhí)行。由此,我們可以看到變量 res 同一時刻總是只被一個 goroutine 訪問,這就避免了同步機制的使用。Go 的設(shè)計使得 CPU 得到充分利用,避免操作阻塞當(dāng)前 goroutine,同時又無需為共享資源同步而憂心。

這里主動調(diào)用了 d.Cb(-d.ChanCb) ,把這個回調(diào)取出來了。實際上,在skeleton.Run里會自己取這個通道

看一下源碼:

New方法,會生成指定緩沖長度的ChanCb。然后調(diào)用Go方法就是先執(zhí)行第一個func,然后把第二個放到Cb里?,F(xiàn)在手動造一個例子:

這里解釋一下,d.Go根據(jù)源碼來看,實際也是調(diào)用了一個協(xié)程。然后上面兩次d.Go并不能保證先后順序。目前的輸出結(jié)果是1+2那個先執(zhí)行了,把3寫入d.ChanCb,然后把3讀出來,繼續(xù)讀時,d.ChanCb里沒有東西,阻塞了。然后1+1那個協(xié)程啟動了,最后又讀到了2。

現(xiàn)在把time.Sleep(time.Second)的注釋解開,會是啥結(jié)果呢

這里執(zhí)行到time.Sleep睡著了,上面兩個d.Go仍然是不確定順序的,但是會各自的function先執(zhí)行掉,然后陸續(xù)把cb寫入d.ChanCb??催@次輸出,1+2先寫進去的。所以最后執(zhí)行d.Cb時,就把3先讀出來了。然后d.ChanCb的長度為1,說明還有一個,就是輸出2了。

另外,就是close時會判斷g.pendingGo

這個例子的意思很明顯,NewLinearContext這種方式,即使先調(diào)用的慢了半秒,它還是會先執(zhí)行完。

這里先是用了一個list,加入的時候用mutexLinearGo鎖了,都加到最后。然后新開協(xié)程去處理,讀的時候從最前面開始讀,也要用mutexLinearGo鎖。執(zhí)行的時候,也要上鎖mutexExecution,確保f()執(zhí)行完并且寫入g.ChanCb回調(diào),這個mutexExecution鎖才會解除?,F(xiàn)在可以改造一個帶回調(diào)的例子:

結(jié)果說明,確實是2先被寫入了d.ChanCb。

go語言實現(xiàn)一個簡單的簡單網(wǎng)關(guān)

網(wǎng)關(guān)=反向代理+負(fù)載均衡+各種策略,技術(shù)實現(xiàn)也有多種多樣,有基于 nginx 使用 lua 的實現(xiàn),比如 openresty、kong;也有基于 zuul 的通用網(wǎng)關(guān);還有就是 golang 的網(wǎng)關(guān),比如 tyk。

這篇文章主要是講如何基于 golang 實現(xiàn)一個簡單的網(wǎng)關(guān)。

轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/

整理:go語言鐘文文檔:

啟動兩個后端 web 服務(wù)(代碼)

這里使用命令行工具進行測試

具體代碼

直接使用基礎(chǔ)庫 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對象實現(xiàn)了serveHttp方法,因此可以直接作為 handler。

具體代碼

director中定義回調(diào)函數(shù),入?yún)?http.Request,決定如何構(gòu)造向后端的請求,比如 host 是否向后傳遞,是否進行 url 重寫,對于 header 的處理,后端 target 的選擇等,都可以在這里完成。

director在這里具體做了:

modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應(yīng)的信息,比如響應(yīng)的 Body,響應(yīng)的 Header 等信息。

最終依舊是返回一個ReverseProxy,然后將這個對象作為 handler 傳入即可。

參考 2.2 中的NewSingleHostReverseProxy,只需要實現(xiàn)一個類似的、支持多 targets 的方法即可,具體實現(xiàn)見后面。

作為一個網(wǎng)關(guān)服務(wù),在上面 2.3 的基礎(chǔ)上,需要支持必要的負(fù)載均衡策略,比如:

隨便 random 一個整數(shù)作為索引,然后取對應(yīng)的地址即可,實現(xiàn)比較簡單。

具體代碼

使用curIndex進行累加計數(shù),一旦超過 rss 數(shù)組的長度,則重置。

具體代碼

輪詢帶權(quán)重,如果使用計數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會瞬間壓力過大;參考 nginx 內(nèi)部的加權(quán)輪詢,或者應(yīng)該稱之為平滑加權(quán)輪詢,思路是:

后端真實節(jié)點包含三個權(quán)重:

操作步驟:

具體代碼

一致性 hash 算法,主要是用于分布式 cache 熱點/命中問題;這里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本滿足流量綁定,一旦后端目標(biāo)節(jié)點故障,會自動平移到環(huán)上最近的那么個節(jié)點。

實現(xiàn):

具體代碼

每一種不同的負(fù)載均衡算法,只需要實現(xiàn)添加以及獲取的接口即可。

然后使用工廠方法,根據(jù)傳入的參數(shù),決定使用哪種負(fù)載均衡策略。

具體代碼

作為網(wǎng)關(guān),中間件必不可少,這類包括請求響應(yīng)的模式,一般稱作洋蔥模式,每一層都是中間件,一層層進去,然后一層層出來。

中間件的實現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計數(shù);一種是鏈?zhǔn)秸{(diào)用。

具體代碼

當(dāng)前題目:go語言回調(diào) go語言返回json給前端
分享網(wǎng)址:http://muchs.cn/article42/ddijsec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、手機網(wǎng)站建設(shè)、做網(wǎng)站域名注冊、移動網(wǎng)站建設(shè)、電子商務(wù)

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)