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?