1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      go語言nginx,Go語言設(shè)計(jì)與實(shí)現(xiàn)

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

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

      我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、裕安ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的裕安網(wǎng)站制作公司

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

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

      整理:go語言鐘文文檔:

      啟動(dòng)兩個(gè)后端 web 服務(wù)(代碼)

      這里使用命令行工具進(jìn)行測(cè)試

      具體代碼

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

      具體代碼

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

      director在這里具體做了:

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

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

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

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

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

      具體代碼

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

      具體代碼

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

      后端真實(shí)節(jié)點(diǎn)包含三個(gè)權(quán)重:

      操作步驟:

      具體代碼

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

      實(shí)現(xiàn):

      具體代碼

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

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

      具體代碼

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

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

      具體代碼

      golang適合做web開發(fā)嗎

      適合。框架足夠成熟了 A Survey of 5 Go Web Frameworks

      小型項(xiàng)目你甚至不用框架,用net/http http - The Go Programming Language

      常用庫也成熟了 Top - Go Search

      golang的web后端即使不concurrent也比php,ruby,python快很多很多

      golang里用concurrent真的非常方便,非常非常快,超大web項(xiàng)目golang scale成本低

      如果你想,golang的部署可以比php更方便,使用go get和http.ServeAndListen()可以不用nginx和apache

      對(duì)于文件改動(dòng)重新編譯其實(shí)并不是大問題,看pilu/fresh · GitHub,其實(shí)你自己寫shell腳本(也可以直接用go寫,因?yàn)樗旧砭褪窍到y(tǒng)語言)監(jiān)控文件系統(tǒng)改動(dòng)然后自動(dòng)重新build,即使是C/C++的項(xiàng)目這也不是大問題,人們不用C/C++寫web是因?yàn)樗鼈儾皇菍憌eb app的最佳選擇

      golang寫的代碼編譯通過后,要比scripting language魯棒,因?yàn)間o compiler強(qiáng)制一些最佳實(shí)踐

      如何使用Go語言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令

      一般命令

      所謂一般命令,就是在一定時(shí)間內(nèi)會(huì)執(zhí)行完的命令。比如 grep, cat 等等。 執(zhí)行命令的步驟是:連接,執(zhí)行,獲取結(jié)果

      連接

      連接包含了認(rèn)證,可以使用 password 或者 sshkey 2種方式來認(rèn)證。下面的示例為了簡(jiǎn)單,使用了密碼認(rèn)證的方式來完成連接。

      import (

      "fmt"

      "time"

      "golang.org/x/crypto/ssh"

      )

      func connect(user, password, host string, port int) (*ssh.Session, error) {

      var (

      auth []ssh.AuthMethod

      addr string

      clientConfig *ssh.ClientConfig

      client *ssh.Client

      session *ssh.Session

      err error

      )

      // get auth method

      auth = make([]ssh.AuthMethod, 0)

      auth = append(auth, ssh.Password(password))

      clientConfig = ssh.ClientConfig{

      User: user,

      Auth: auth,

      Timeout: 30 * time.Second,

      }

      // connet to ssh

      addr = fmt.Sprintf("%s:%d", host, port)

      if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {

      return nil, err

      }

      // create session

      if session, err = client.NewSession(); err != nil {

      return nil, err

      }

      return session, nil

      }

      連接的方法很簡(jiǎn)單,只要提供登錄主機(jī)的 用戶*, *密碼*, *主機(jī)名或者IP*, *SSH端口

      執(zhí)行,命令獲取結(jié)果

      連接成功后,執(zhí)行命令很簡(jiǎn)單

      import (

      "fmt"

      "log"

      "os"

      "time"

      "golang.org/x/crypto/ssh"

      )

      func main() {

      session, err := connect("root", "xxxxx", "127.0.0.1", 22)

      if err != nil {

      log.Fatal(err)

      }

      defer session.Close()

      session.Run("ls /; ls /abc")

      }

      上面代碼運(yùn)行之后,雖然命令正常執(zhí)行了,但是沒有正常輸出的結(jié)果,也沒有異常輸出的結(jié)果。 要想顯示結(jié)果,需要將 session 的 Stdout 和 Stderr 重定向 修改 func main 為如下:

      func main() {

      session, err := connect("root", "xxxxx", "127.0.0.1", 22)

      if err != nil {

      log.Fatal(err)

      }

      defer session.Close()

      session.Stdout = os.Stdout

      session.Stderr = os.Stderr

      session.Run("ls /; ls /abc")

      }

      這樣就能在屏幕上顯示正常,異常的信息了。

      交互式命令

      上面的方式無法遠(yuǎn)程執(zhí)行交互式命令,比如 top , 遠(yuǎn)程編輯一個(gè)文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當(dāng)前的terminal來接管遠(yuǎn)程的 PTY。

      func main() {

      session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)

      if err != nil {

      log.Fatal(err)

      }

      defer session.Close()

      fd := int(os.Stdin.Fd())

      oldState, err := terminal.MakeRaw(fd)

      if err != nil {

      panic(err)

      }

      defer terminal.Restore(fd, oldState)

      // excute command

      session.Stdout = os.Stdout

      session.Stderr = os.Stderr

      session.Stdin = os.Stdin

      termWidth, termHeight, err := terminal.GetSize(fd)

      if err != nil {

      panic(err)

      }

      // Set up terminal modes

      modes := ssh.TerminalModes{

      ssh.ECHO: 1, // enable echoing

      ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud

      ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud

      }

      // Request pseudo terminal

      if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {

      log.Fatal(err)

      }

      session.Run("top")

      }

      總結(jié)

      好了,這樣就可以執(zhí)行交互式命令了,比如上面的 top 也可以通過 vi /etc/nginx/nignx.conf 之類的命令來遠(yuǎn)程編輯文件。

      使用golang 還有必要使用 nginx 么

      討論哪個(gè)語言更好,就像在爭(zhēng)論姚明和劉翔誰是更優(yōu)秀的運(yùn)動(dòng)員。因?yàn)楦髯缘淖鴺?biāo)象限不同,常常會(huì)陷入一個(gè)難有結(jié)論怪圈。 所以本文絕不是在說Golang是比其他語言更好的語言。Golang只是最值得推薦的語言,尤其適合快速成長(zhǎng)中的后端研發(fā)團(tuán)隊(duì)。


      分享標(biāo)題:go語言nginx,Go語言設(shè)計(jì)與實(shí)現(xiàn)
      瀏覽地址:http://www.ef60e0e.cn/article/dsipiec.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        安庆市| 松潘县| 乐都县| 青田县| 乌鲁木齐市| 保康县| 扬中市| 汝州市| 蓝田县| 三门县| 彩票| 惠来县| 准格尔旗| 富阳市| 天全县| 丰宁| 开化县| 宁津县| 鹤峰县| 读书| 双峰县| 分宜县| 洞口县| 璧山县| 嘉义市| 龙泉市| 洪江市| 肥城市| 新巴尔虎左旗| 柘城县| 贞丰县| 南充市| 洪雅县| 习水县| 小金县| 习水县| 茶陵县| 时尚| 湟源县| 高尔夫| 弋阳县|