天天看點

Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

Sevice Computing:開發 web 服務程式Cloudgo

  • 1、概述
  • 2、基礎知識
  • 3、開發實踐
    • 3.1 架構選擇
    • 3.2 搭建簡單web伺服器
    • 3.3 測試運作
      • 1) 使用 curl 測試
      • 2)使用 ab 測試,并解釋重要參數。

1、概述

開發簡單 web 服務程式 cloudgo,了解 web 伺服器工作原理。

任務目标

  1. 熟悉 go 伺服器工作原理
  2. 基于現有 web 庫,編寫一個簡單 web 應用類似 cloudgo。
  3. 使用 curl 工具通路 web程式
  4. 對 web 執行壓力測試

基本要求

  1. 程式設計 web 服務程式 類似 cloudgo 應用。
  • 要求有詳細的注釋
  • 是否使用架構、選哪個架構自己決定 請在README.md 說明你決策的依據
  1. 使用 curl 測試,将測試結果寫入 README.md
  2. 使用 ab 測試,将測試結果寫入 README.md。并解釋重要參數。

2、基礎知識

關于本次作業的web服務程式開發,主要是學習了潘老師的部落格:

HTTP 協定 與 golang web 應用服務

HTTP協定基礎

HTTP 協定是一個複雜的協定, 支援虛拟主機、消息路由(負載均衡)、分段下載下傳、緩存服務、安全認證等等。 HTTP 也是非常簡單文本協定。 用戶端與伺服器建立 TCP 連接配接後,用戶端發出 Request 文本, 伺服器端傳回 Response 文本。

HTTP協定工具

  • 浏覽器

幾乎所有現代浏覽器都自帶開發者工具,Network 标簽就是。

  • curl

    curl 才是 web 開發者最常用的利器。它是一個控制台程式,可以精确控制 HTTP 請求的每一個細節。實戰中,配合 shell 程式,我們可以簡單,重複給伺服器發送不同的請求序列,調試程式或分析輸出。curl 是 linux 系統自帶的指令行工具。

    curl的指令如下:

    $curl -v http://localhost:9000/
               

    注 : 後面的網址根據自己要通路的網址更改即可。

    輸入curl指令後,每行出現的第一個符号分别有如下含義:

  • *

    表示 curl 任務;
  • >

    發送的資訊;
  • <

    傳回的資訊

3、開發實踐

3.1 架構選擇

所有的Web架構都是基于net/http包建構的。

本次使用的web開發架構是Martini,Martini架構是使用Go語言作為開發語言的一個強力的快速構模組化塊化web應用與服務的開發架構。使用 Go 的 net/http 接口開發,類似 Sinatra 或者 Flask 之類的架構,也可使用自己的 DB 層、會話管理和模闆。這個架構在GitHub上都有中文的解釋以及用法,比較容易上手。

Martini支援URL參數 通配符和正規表達式,路由功能全面靈活。

Martini比對的參數可通過 map[string]string 獲得,它将被注入到處理器的方法參數,Martini提供完整的依賴注入到處理器方法的參數,允許指定全局或請求級别的映射,Martini在資料綁定上非常省事。

Martini沒有明顯的控制器或上下文概念,但是依賴注入允許你易于建立你自己這樣的概念。

其特性如下:

  • 使用非常簡單
  • 無侵入設計
  • 可與其他 Go 的包配合工作
  • 超棒的路徑比對和路由
  • 子產品化設計,可輕松添加工具
  • 大量很好的處理器和中間件
  • 很棒的開箱即用特性
  • 完全相容 http.HandlerFunc 接口

安裝

在terminal下輸入指令行:

go get github.com/codegangsta/martini
           

3.2 搭建簡單web伺服器

main.go的代碼基本上就是按照老師教程上的main函數寫的

main.go

package main
import (
    "os"
    "cloudgo/service"
    flag "github.com/spf13/pflag"
)
const (
    PORT string = "8080"  //預設8080端口
)
func main() {
    //預設8080端口,如果沒有監聽到端口,則設為預設端口。
    port := os.Getenv("PORT") 
    if len(port) == 0 {
        port = PORT
    }
    //對指令行參數進行設定,用-p設定端口,并完成對端口号的解析
    pPort := flag.StringP("port", "p", PORT, "PORT for httpd listening")
    flag.Parse()
    if len(*pPort) != 0 {
        port = *pPort
    }
    //啟動server
    service.NewServer(port)
}


           

server.go

package service
//使用martini架構,具體定義main.go檔案中啟動server後的具體操作
import (
    "github.com/go-martini/martini" 
)
func NewServer(port string) {   
    m := martini.Classic()//建立一個經典的martini執行個體
    
    // 使用者自定義路由規則
    m.Get("/", func(params martini.Params) string {
        return "hello world by ZhaoZhengwei!"  //接收對\的GET方法請求,第二個參數是對一請求的處理方法
    })

    m.RunOnAddr(":"+port)  //運作伺服器 
}
           

3.3 測試運作

完成代碼後用 go run 運作它, 這個時候其實已經在9000端口監聽http連結請求了。

運作指令:

$ go run main.go -p 9000
           
Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

在網頁輸入網址:

http://localhost:9000
           

可以看到我們在server.go中寫的啟動server後的具體操作,也就是會列印出一行歡迎提示。

Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

1) 使用 curl 測試

打開另一個控制台,用 curl 指令測試檢視結果。

測試用指令:

curl -v http://localhost:9000
           
Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

2)使用 ab 測試,并解釋重要參數。

ab是什麼?

  • ab的全稱是Apache Bench,是Apache自帶的網絡壓力測試工具,相比于LR、JMeter,是我所知道的 Http 壓力測試工具中最簡單、最通用的。
  • ab指令對發出負載的計算機要求很低,不會占用很高CPU和記憶體,但也能給目标伺服器産生巨大的負載,能實作基礎的壓力測試。
  • 在進行壓力測試時,最好與伺服器使用交換機直連,以擷取最大的網絡吞吐量。

壓力測試程式安裝:

首先,需要通過yum指令安裝Apache web 壓力測試程式

yum -y install httpd-tools
           
Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

可以看到如下圖所示的界面,則說明安裝成功了:

Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

執行壓力測試:

$ ab -n 1000 -c 100 http://localhost:9000/cloudgo
           
Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

其中:

  • Document Path 表示請求的資源也就是我們運作的url的代碼包的位址,這裡是cloudgo
  • Document Length 是文檔傳回的長度,不包括相應頭。
  • Concurrency Level 是并發個數
  • Complete requests 是總請求數,Time taken for tests 顯示了總請求時間,下面的per …則是平均到每秒/每個請求等等。
  • Transfer rate 表示傳輸速率
    Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

    對壓力測試的結果重點關注吞吐率(Requests per second)、使用者平均請求等待時間(Time per request)名額:

    1、吞吐率(Requests per second):

    伺服器并發處理能力的量化描述,機關是reqs/s,指的是在某個并發使用者數下機關時間内處理的請求數。某個并發使用者數下機關時間内能處理的最大請求數,稱之為最大吞吐率。吞吐率是基于并發使用者數的,這表示:

    a、吞吐率和并發使用者數相關
     
     b、不同的并發使用者數下,吞吐率一般是不同的
               

    計算公式:總請求數/處理完成這些請求數所花費的時間,即

    Request per second=Complete requests/Time taken for tests

    必須要說明的是,這個數值表示目前機器的整體性能,值越大越好。

    2、使用者平均請求等待時間(Time per request):

    計算公式:處理完成所有請求數所花費的時間/(總請求數/并發使用者數),即:

    Time per request=Time taken for tests/(Complete requests/Concurrency Level)

    3、伺服器平均請求等待時間(Time per request:across all concurrent requests):

    計算公式:處理完成所有請求數所花費的時間/總請求數,即:

    Time taken for/testsComplete requests

    可以看到,它是吞吐率的倒數。同時,它也等于使用者平均請求等待時間/并發使用者數,即

    Time per request/Concurrency Level。

ab指令選項:

ab指令具有如下圖所示的參數選項,我們上面的指令用的是最基本的參數-n 和 -c,下面将對重要參數進行一個解釋說明:

-n 執行的請求數量
-c 并發請求個數
-t 測試所進行的最大秒數
-p 包含了需要POST的資料的檔案
-T POST資料所使用的Content-type頭資訊
-k 啟用HTTP KeepAlive功能,即在一個HTTP會話中執行多個請求,預設時,不啟用KeepAlive功能
           

全部完整參數含義如下,可以根據自己的需要自行查找和翻譯:

Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐
Sevice Computing服務計算:開發 web 服務程式Cloudgo1、概述2、基礎知識3、開發實踐

Github代碼傳送門