Урок 02. Поздоровайтесь в первый раз

Go

头图

1. Скажи привет запрос

1. Конфигурация среды
  • Установите инструмент командной строки для управления зависимостями пакетов Go.govendor
go get -u github.com/kardianos/govendor
  • Создать папку проекта
mkdir -p $GOPATH/src/github.com/yourusername/project && cd "$_"
  • инициализация говендора
govendor init
  • Получить веб-фреймворк go gin
govendor fetch github.com/gin-gonic/gin
  • В корневом пути проекта создайте новый файл main.go.
2, Получить запрос и отправить код запроса
//main.go
package main

import (
"github.com/gin-gonic/gin"
"net/http"
"strconv"
)
func main() {

	// gin的Default方法创建一个路由handler。然后通过HTTP方法绑定路由规则和路由函数,gin把request和response都封装到gin.Context的上下文环境。
	// 最后启动路由的Run方法监听端口。
	router := gin.Default()

	// get请求
	router.GET("/user/welcome", func(c *gin.Context) {
		//获取url中的参数信息
		namestr := c.DefaultQuery("name", "Guest")
		agestr := c.DefaultQuery("age", "18")

		//各种处理逻辑

		ageValue, err := strconv.Atoi(agestr)
		role := "小伙子"
		if err != nil {
			role = "可疑的人"
		} else {
			if ageValue > 28 {
				role = "大哥"
			}
		}

		//返回
		c.String(http.StatusOK, "%s %s,你好呀", role, namestr)
	})

	//curl http://127.0.0.1:8000/user/welcome\?name\=jack\&age\=18

	router.POST("/user/postdata", func(c *gin.Context) {

		message := c.PostForm("message")

		namestr := c.DefaultPostForm("name", "anonymous")
		agestr := c.DefaultPostForm("age", "18")

		//各种处理逻辑
		ageValue, err := strconv.Atoi(agestr)
		role := "小伙子"
		if err != nil {
			role = "可疑的人"
		} else {
			if ageValue > 28 {
				role = "大哥"
			}
		}

		message = role + namestr + " 你好呀"

		c.JSON(http.StatusOK, gin.H{
			"status": gin.H{
				"code":   http.StatusOK,
				"status": "ok",
			},
			"data": gin.H{
				"message": message,
			},
		})
	})

	//curl -X POST http://127.0.0.1:8000/user/postdata -H "Content-Type:application/x-www-form-urlencoded" -d "name=jack&age=28" | python -m json.tool
	router.Run(":8000")
}

иллюстрировать: после запуска службы вы можете использовать командный инструмент curl для отправки запроса или вы можете использовать Postman для отправки запроса на проверку возможности доступа к интерфейсу.

2. Совместная отладка интерфейса

1. Совместная отладка запроса GET
  • Имя интерфейса: /user/welcome

  • Порт: 80000

curl http://127.0.0.1:8000/user/welcome\?name\=jack\&age\=38
大哥 jack,你好呀**%**                                                              
curl http://127.0.0.1:8000/user/welcome\?name\=jack\&age\=18
小伙子 jack,你好呀**%**                                                            
curl http://127.0.0.1:8000/user/welcome\?name\=jack\&age\=hhah
可疑的人 jack,你好呀**%** 

иллюстрировать: Вы можете использовать IP-адрес машины.

2. Совместная отладка POST-запросов
  • Имя интерфейса: /user/postdata

  • Порт: 80000

curl -X POST http://127.0.0.1:8000/user/postdata -H "Content-Type:application/x-www-form-urlencoded" -d "name=jack&age=28" | python -m json.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   123  100   107  100    16   104k  16000 --:--:-- --:--:-- --:--:--  120k
{
    "data": {
        "message": "54GP5b+O57Su54Cb5oGTYWNrIOa1o+eKsuOCvemNm+KCrA=="
    },
    "status": {
        "code": 200,
        "status": "ok"
    }
}

3. Тест производительности интерфейса

1. Показатели производительности интерфейса

Производительность интерфейса можно измерить по следующим показателям:

  • QPS (TPS): количество запросов/транзакций в секунду в интернет-домене относится кЗапросов ответа в секунду(ссылаясь на http-запрос)

  • Транзакция: набор операций, выполняемых пользователем на определенном шаге или нескольких шагах, мы хотим убедиться, что он имеет полное значение. Например, запрос пользователя на определенную страницу, вход пользователя в определенную систему, подтверждение пользователя Taobao и процесс оплаты продукта. Мы все можем думать об этом как о сделке

  • Время ответа: среднее время, необходимое системе для ответа на запрос. Например, системе требуется 200 мс для обработки HTTP-запроса, и эти 200 мс — время отклика системы (думаю, сюда должно входить только время обработки, а время передачи по сети игнорируется)

  • Параллелизм: количество запросов/транзакций, обрабатываемых системой одновременно.

  • Пропускная способность: количество запросов, обработанных в единицу времени (обычно определяется количеством запросов в секунду и параллелизмом);

Ссылаться на:В веб-разработке какой уровень считается высоким параллелизмом

2. Установка инструментов тестирования производительности

Мы будем использовать инструмент wrk, чтобы просто протестировать QPS и время отклика интерфейса. wrk — это легкий инструмент для тестирования производительности HTTP. Здесь мы используем wrk, чтобы просто протестировать QPS и время отклика интерфейса, который мы только что написали.

#安装
brew install wrk
3. Тест производительности интерфейса
#以get请求为例
wrk -t4 -c1000 -d30s -T30s --latency http://127.0.0.1:8000/user/welcome\?name\=jack\&age\=38
Running 30s test @ http://127.0.0.1:8000/user/welcome?name=jack&age=38
  4 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.48ms    1.15ms  36.87ms   80.11%
    Req/Sec    24.44k     2.48k   33.65k    72.67%
  Latency Distribution
     50%    2.33ms
     75%    2.81ms
     90%    3.71ms
     99%    6.53ms
  2919566 requests in 30.03s, 389.80MB read
  Socket errors: connect 751, read 89, write 0, timeout 0
Requests/sec:  97228.78
Transfer/sec:     12.98MB

Пояснение 1: Используйте 4 потока для имитации 1000 одновременных подключений, весь тест длится 30 секунд, время ожидания соединения составляет 30 секунд, и распечатывается запрошенная статистика задержки. wrk использует асинхронный неблокирующий ввод-вывод,Он не использует потоки для имитации одновременных подключений, поэтому нет необходимости настраивать множество потоков., как правило, устанавливается в зависимости от количества ядер процессора. (Сетевая связь не блокирует выполнение потока, имитируя большое количество сетевых подключений с небольшим количеством потоков)

Объяснение 2:

- Socket errors socket 错误的数量
- Requests/sec 每秒请求数量,也就是并发能力
- Latency 响应时间
Avg:平均、Max:最大、Stdev:标准差、+/- Stdev: 正负一个标准差占比
4. Описание производительности
  • Используя Go для написания простого интерфейса, QPS на нашей машине для разработки составляет около 9w7, ха-ха, мы также написали «высокопроизводительный интерфейс с малой задержкой», конечно, это связано с отличными возможностями одновременной обработки go язык и веб-фреймворк

  • Задержка фактического фонового интерфейса не может быть такой быстрой. Она включает в себя бизнес-процессы, межсервисные вызовы и сложные сетевые среды. Реальный QPS гораздо менее преувеличен.

#测试百度首页的QPS和Latency
wrk -t4 -c1000 -d30s -T30s https://www.baidu.com
Running 30s test @ https://www.baidu.com
  4 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   196.47ms   44.94ms   1.18s    88.71%
    Req/Sec   310.42     59.95   494.00     69.06%
  37095 requests in 30.09s, 548.20MB read
  Socket errors: connect 754, read 111, write 0, timeout 0
Requests/sec:   1232.74
Transfer/sec:     18.22MB

4. Малый класс

1. говендор
  • на основеvendorМеханизм реализует инструмент командной строки для управления зависимостями пакетов Go. Ненавязчивая интеграция с собственными поставщиками и поддержка миграции с других инструментов управления зависимостями могут легко обеспечить разработку и управление разными версиями одного и того же пакета в разных проектах, а также ненавязчивую разработку и управление.

  • Вначале Go не предоставлял надлежащих инструментов управления пакетами. Функция поставщика доступна с версии 1.5, но требует ручной настройки переменных среды.GO15VENDOREXPERIMENT=1.

  • в исполненииgo buildилиgo runПри выполнении команды поиск пакетов осуществляется в следующем порядке:

    • каталог поставщика в текущем пакете
    • Ищите верхний каталог, пока не найдете каталог поставщика в src.
    • Найти в каталоге GOROOT
    • Найдите зависимости в GOPATH
  • Когда была выпущена версия 1.6, значение этой переменной среды по умолчанию было установлено равным 1, и это значение можно использоватьgo envПредставление команд; когда была выпущена версия 1.7, эта переменная среды была удалена и включена по умолчанию.vendorхарактеристика.

  • Вот некоторые распространенные команды govendor:

//初始化
govendor init

//将已被引用且在 $GOPATH 下的所有包复制到 vendor 目录
govendor add +external

//仅从 $GOPATH 中复制指定包
govendor add gopkg.in/yaml.v2

//列出代码中所有被引用到的包及其状态
govendor list

//列出一个包被哪些包引用
govendor list -v fmt

//从远程仓库添加或更新某个包(不会在 $GOPATH 也存一份)
govendor fetch golang.org/x/net/context

//安装指定版本的包,eg:
govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55
govendor fetch golang.org/x/net/context@v1   # Get latest v1.*.* tag or branch.
govendor fetch golang.org/x/net/context@=v1  # Get the tag or branch named "v1".

Ссылаться на:Инструмент управления зависимостями пакетов Go — govendor

2. Проблема C10k
  • C10K — это проблема Client 10 000, то есть «в среде, где количество клиентов, одновременно подключенных к серверу, превышает 10 000, даже при достаточной производительности оборудования он все равно не может нормально предоставлять услуги». это проблема с 10 000 одновременных подключений на одной машине.

  • Компьютерные программы можно классифицировать в соответствии с их узкими местами.Тип узкого места дискового ввода-вывода, тип узкого места вычислений ЦП, тип узкого места пропускной способности сети, В распределенных сценариях внешние системы иногда создают собственные узкие места.

  • Веб-система больше всего взаимодействует с сетью: получение, анализ пользовательских запросов, доступ к хранилищу или возврат данных ответа пользователю — все это должно проходить через сеть. До появления интерфейса мультиплексирования ввода-вывода, предоставляемого такими системами, как epoll/kqueue, самой большой головной болью для современных компьютеров с несколькими ядрами была проблема C10k.Проблема C10k приводит к тому, что компьютер не может полностью использовать ЦП для обработки большего количества пользовательских подключений.В свою очередь, невозможно увеличить загрузку ЦП с помощью оптимизатора для обработки большего количества запросов.

  • С тех пор, как Linux реализовал epoll, а FreeBSD реализовал kqueue, эта проблема была в основном решена.Мы можем легко решить проблему года C10k с помощью API, предоставляемого ядром.То есть, если ваша программа в основном имеет дело с сетью узким местом должна быть пользовательская программа, а не ядро ​​операционной системы.

  • С развитием времени языки программирования еще больше инкапсулировали эти системные вызовы.В настоящее время при разработке прикладного уровня такие слова, как epoll, почти не встречаются в программе.Большую часть времени нам нужно сосредоточиться только на бизнес-логике. Хорошо. Сетевая библиотека Go инкапсулирует различные API-интерфейсы системных вызовов для разных платформ, а http-библиотека построена поверх сетевой библиотеки.Итак, на языке Go мы можем легко написать высокопроизводительные http-сервисы с помощью стандартной библиотеки..

Ссылаться на:Как программисты могут не знать о проблеме C10K?