37.1K subscribers
1.46K photos
33 videos
5 files
1.62K links
加入频道
👣 Backend Clean Architecture

Пример Go проекта с чистой архитектурой на базе Gin, mongo go driver, JWT viper, bcrypt, testify, mockery и других пакетов.

Вы можете использовать этот проект в качестве шаблона для создания вашего проекта на Go.

$ cd your-workspace

# Clone this project into your workspace
$ git clone https://github.com/amitshekhariitbhu/go-backend-clean-architecture.git

# Move to the project root directory
$ cd go-backend-clean-architecture


🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 cdule (pronounce as Schedule)

Библиотека планировщика заданий с поддержкой базы данных

go get github.com/deepaksinghvi/cdule

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 Gh-prx

Расширение GitHub (gh) CLI для автоматизации повседневной работы с ветками, коммитами и запросами на GO.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳🚢 Docker-Kubernetes-101

Инструкция и подход к развертыванию проектов с использованием Docker и Kubernetes.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 webpty

WebPty - проект на Go, который позволяет запускать серверный терминал из браузера. Работает с любого Linux-сервера с любой программой.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание для Mail.Ru Group

Текст задания:
Процессу на stdin приходят строки, содержащие интересующие нас URL. Каждый такой URL нужно дернуть и посчитать кол-во вхождений строки "Go". В конце работы приложение выводит на экран общее кол-во найденных строк "Go" во всех переданных URL, например:

$ echo -e 'https://golang.org\nhttps://golang.org\nhttps://golang.org' | go run 1.go
Count for https://golang.org: 9
Count for https://golang.org: 9
Count for https://golang.org: 9
Total: 27


Введенный URL должен начать обрабатываться сразу после вычитывания и параллельно с вычитыванием следующего. URL должны обрабатываться параллельно, но не более k=5 одновременно.

Обработчики url-ов не должны порождать лишних горутин, т.е. если k=1000 а обрабатываемых URL-ов нет, не должно создаваться 1000 горутин.

Нужно обойтись без глобальных переменных и использовать только стандартные библиотеки.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание для GoLang-разработчика

Описание задания
Необходимо разработать приложение, предоставляющее HTTP API для получения данных о парковках такси в г. Москва. Данные необходимо брать с этой страницы ("Актуальная версия").

Описание необходимого функционала
Приложение должно реализовывать:

Функционал загрузки данных из файла (локального и/или по ссылке) в хранилище данных (данные на источнике могут как удаляться, так и добавляться);

Обслуживание HTTP запросов к API-endpoints, которые реализуют поиск по хранимым данным;
Обслуживание HTTP запросов к роуту, возвращающему метрические данные (в формате prometheus) работы приложения.

Обновление данных в хранилище должно происходить без остановки обслуживания HTTP запросов к API с учетом того, что их объем может быть очень большим (и маппинг данных на источнике может изменяться).

Методы HTTP API должны возвращать ответ в формате json. Время обработки одного запроса к HTTP API (не загрузка данных в хранилище) - не более 2 мс. до первого байта HTTP ответа (TTFB). Проектирование самих методов API - на ваше усмотрение (минимально необходимый функционал - это поиск по global_id, id и mode).

Метрические данные должны включать в себя как минимум следующие метрики:

Общее количество обработанных запросов к API-endpoints;
Количество ошибок обработки HTTP запросов к API-endpoints (плюсом будет "разведение" по различным кодам ответов);
Данные по времени обработки HTTP запросов к API-endpoint;
Дополнительные метрики, на ваше усмотрение.

Требования к реализации

В качестве хранилища данных необходимо использовать Redis;
Все функции (экспортируемые и не экспортируемые) должны сопровождаться понятным комментарием (если возможно - на английском языке);
Не стоит излишне сокращать имена переменных и констант - код пишется для людей, и он должен быть максимально простым и понятным;
Можно использовать любые сторонние пакеты, но не использовать какой-либо фреймворк;
Весь ключевой функционал должен быть зафиксирован unit-тестами;
После завершения работы над заданием необходимо написать сопроводительную документацию по работе с приложением в файле README.md в корне репозитория;
Конфигурация параметров подключения к хранилищу данных должна иметь возможность управляться как флагами запуска, так и переменными окружения. Возможности конфигурирования должны быть описаны в файле README.md вашего репозитория.

Плюсами будут являться
Настройка CI (силами GitHub actions, TravisCI, etc) выполняющая запуск тестов и сборки на каждый коммит;
Автоматическая сборка Docker-образа с приложением;
Интуитивно-понятное разбитие коммитов - одной конкретной задаче - один коммит или PR (её правки - отдельный коммит или PR);
Написание всех текстов коммитов - на английском языке.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 GoReplay — это инструмент для мониторинга сети с открытым исходным кодом, который может записывать ваш трафик в реальном времени и использовать его для теневого копирования, нагрузочного тестирования, мониторинга и подробного анализа.

🖥 Github
📝 Документация

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Задание на разработку сервиса "Анти-брутфорс"

Общее описание
Сервис предназначен для борьбы с подбором паролей при авторизации в какой-либо системе.

Сервис вызывается перед авторизацией пользователя и может либо разрешить, либо заблокировать попытку.

Предполагается, что сервис используется только для server-server,т.е. скрыт от конечного пользователя.

Алгоритм работы

Сервис ограничивает частоту попыток авторизации для различных комбинаций параметров, например:

не более N = 10 попыток в минуту для данного логина.
не более M = 100 попыток в минуту для данного пароля (защита от обратного brute-force).
не более K = 1000 попыток в минуту для данного IP (число большое, т.к. NAT).

Для подсчета и ограничения частоты запросов, можно использовать например алгоритм leaky bucket. Или иные аналогичные: https://en.wikipedia.org/wiki/Rate_limiting

Причем сервис будет поддерживать множество bucket-ов, по одному на каждый логин/пароль/ip.

Bucket-ы можно хранить:

в памяти (в таком случае нужно продумать удаление неактивных bucket-ов, чтобы избежать утечек памяти).
во внешнем хранилище (например redis или СУБД, в таком случае нужно продумать производительность).

White/black листы содержат списки адресов сетей, которые обрабатываются более простым способом:

Если входящий IP в whitelist, то сервис безусловно разрешает авторизацию (ok=true);
Если - в blacklist, то отклоняет (ok=false).

Архитектура

Микросервис состоит из API, базы данных для хранения настроек и black/white списков. Опционально - хранилище для bucket'ов. Сервис должен предоставлять GRPC или REST API.

Описание методов API
Попытка авторизации

Запрос:

login
password
ip

Ответ:

ok (true/false) - сервис должен возвращать ok=true, если считает что запрос нормальный и ok=false, если считает что происходит bruteforce.

Сброс bucket
Должен очистить bucket-ы соответствующие переданным login и ip.

login
ip

Добавление IP в blacklist
подсеть (IP + маска)
Удаление IP из blacklist
подсеть (IP + маска)
Добавление IP в whitelist
подсеть (IP + маска)
Удаление IP из whitelist
подсеть (IP + маска)

Достаточно IPv4
Пример подсети: 192.1.1.0/25 - представляет собой адрес 192.1.1.0 с маской 255.255.255.128
Во время работы сервиса при поступлении очередного IP мы проходимся по подсетям в черных и белых списках и вычисляем, принадлежит ли IP одной из них.

Конфигурация
Основные параметры конфигурации: N, M, K - лимиты по достижению которых, сервис считает попытку брутфорсом.

Command-Line интерфейс
Необходимо так же разработать command-line интерфейс для ручного администрирования сервиса. Через CLI должна быть возможность вызвать сброс бакета и управлять whitelist/blacklist-ом. CLI может работать через GRPC/HTTP интерфейс.

Развертывание
Развертывание микросервиса должно осуществляться командой make run (внутри docker compose up) в директории с проектом.

Тестирование
Рекомендуется выделить модуль обработки одного bucket и протестировать его с помощью unit-тестов.

Так же необходимо написать интеграционные тесты, проверяющие все вызовы API.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 ACP

Минималистичный инструмент командной строки на GO
для передачи файлов P2P.


🖥 Github
📝 Инструкция

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 CROC

Инструмент на Go, который, позволяет любым двум компьютерам просто и безопасно передавать файлы и папки.

обеспечивает сквозное шифрование 
обеспечивает простую межплатформенную передачу (Windows,Mac, Linux)
поддерживает прокси
позволяет передавать сразу несколько файлов
позволяет возобновить прерванные передачи
локальный сервер или перенаправление портов не требуется

#golang #go #shell

🖥 GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 VBalancer

VBalancer - это проект, направленный на создание гибкой и масштабируемой системы балансировки нагрузки.

Он реализует функциональность, поддерживающую на данный момент стратегию Round Robin. VBalancer является одной из свободно-распространяемых утилит, которые можно использовать, чтобы увеличить производительность, доступность, надежность и расширяемость работы сетевых служб.

Основные преимущества проекта:

удобно расширять сетевую инфраструктуру, через конфигурационный YMAL файл добавляя или удаляя конечные сетевые узлы

в проекте реализован Dockerfile что позволяет легко развернутьVBalancer в облаке

гибко настраиваемое логирование в CSV формате (может писать логи по времени или по объемы), а так же их архивировать

на сайте проекта уже есть готовые бинарные файлы под любую платформу: Linux/MacOS/Win

проект написан на GO

git clone https://github.com/microup/vbalancer.git

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Задание на разработку демона, осуществляющего "Системный мониторинг"

Общее описание

Демон - программа, собирающая информацию о системе, на которой запущена, и отправляющая её своим клиентам по GRPC.

Архитектура
GRPC сервер;
допускается использование временных (/tmp) файлов;
статистика хранится в памяти, долговременное хранение не предусмотрено.

Требования
Необходимо каждые N секунд выдавать информацию, усредненную за последние M секунд.

Например, N = 5с, а M = 15с, тогда демон "молчит" первые 15 секунд, затем выдает снапшот за 0-15с; через 5с (в 20с) выдает снапшот за 5-20с; через 5с (в 25с) выдает снапшот за 10-25с и т.д.

N и M указывает клиент в запросе на получение статистики.

Что необходимо собирать:

Средняя загрузка системы (load average).

Средняя загрузка CPU (%user_mode, %system_mode, %idle).

Загрузка дисков:

-tps (transfers per second);
-KB/s (kilobytes (read+write) per second);

Информация о дисках по каждой файловой системе:

-использовано мегабайт, % от доступного количества;
-использовано inode, % от доступного количества.
Top talkers по сети:

- по протоколам: protocol (TCP, UDP, ICMP, etc), bytes, % от sum(bytes) за последние M), сортируем по убыванию процента;
-по трафику: source ip:port, destination ip:port, protocol, bytes per second (bps), сортируем по убыванию bps.

Статистика по сетевым соединениям:

- слушающие TCP & UDP сокеты: command, pid, user, protocol, port;
-количество TCP соединений, находящихся в разных состояниях (ESTAB, FIN_WAIT, SYN_RCV и пр.).

Разрешено использовать только стандартную библиотеку языка Go!
Команды, которые могут пригодиться:

$ top -b -n1
$ df -k
$ df -i
$ iostat -d -k
$ cat /proc/net/dev
$ sudo netstat -lntup
$ ss -ta
$ tcpdump -ntq -i any -P inout -l
$ tcpdump -nt -i any -P inout -ttt -l
Статистика представляет собой объекты, описанные в формате Protobuf.

Информацию необходимо выдавать всем подключенным по GRPC клиентам с использованием однонаправленного потока.

Выдавать "снапшот" системы можно как отдельными сообщениями, так и одним жирным объектом.

Сбор информации, её парсинг и пр. должен осуществляться как можно более конкурентно.

Конфигурация

Через аргументы командной строки можно указать, на каком порту стартует сервер.
Через файл можно указать, какие из подсистем сбора включены/выключены.
Тестирование

Юнит-тесты
по возможности мок интерфейсов и проверка вызовов конкретных методов;
тесты вспомогательных функций и пр.

Интеграционные тесты

потестировать факт потока статистики, можно без конкретных цифр;
можно посоздавать файлы, пооткрывать сокеты и посмотреть на изменение снапшота.

Клиент

Необходимо реализовать простой клиент, который в реальном времени получает и выводит в STDOUT статистику по одному из пунктов (например, сетевую информацию) в читаемом формате (например, в виде таблицы).

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 ChatGPT-bot

Реализация Telegram бота с ChatGPT на GO.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 116+ Coding Interview Problems with Detailed Solutions

Репозиторий для подготовки к собеседованию GO.

Здесь собраны практические задачи на позицию Go-разработчика. Код с алгоритмами и структуами данных на Go и анализ их эффективности.

🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Книга Docker на практике

Данная книга научит вас надежным, проверенным методам, используемым Docker, таким как замена виртуальных машин, использование архитектуры микросервисов, эффективное моделирование сети, производительность в автономном режиме и создание процесса непрерывной доставки на базе контейнеров. Следуя формату «проблема/решение» в стиле
поваренной книги, вы изучите реальные варианты использования Docker и узнаете, как применить их к собственным проектам.

Издание предназначено разработчикам, использующим Docker в своем рабочем окружении.

📚 Книга

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Vulnerability Management

Инструмент для проверки уязвимостей Go.

go install golang.org/x/vuln/cmd/govulncheck@latest

🖥 Github
🛠 Инструменты Go для проверки уязвимостей

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Concurrency in go.

Репозиторий для погружения в конкуренцию Go, c выжимками и примера из книги Concurrency in Go: Tools and Techniques for Developers. Доступно и лаконично.

🖥 Github
📚 Книга

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание на разработку инструмента "SQL-мигратор"

Общее описание

Аналог инструментов, приведенных в секции "Database schema migration" awesome-go.

Инструмент, работающий с миграциями, написанными на Go или представленными в виде SQL-файлов.

Позволяет:

генерировать шаблон миграции;
применять миграции;
откатывать миграции.

Архитектура

Тулза должна создавать свои служебные таблицы в БД и работать с ними.

Требования

Установка в $GOPATH/bin командой go get github.com/awesomegother/migrator/cmd/gomigrator.

Или можно использовать её API в своих программах напрямую, импортировав библиотеку как пакет.

При этом вся логика тулзы должна располагаться в internal, а экспортируемое API в pkg.

Команды

Необходимо реализовать следующие команды (флаги команд см. в разделе Конфигурирование).

Создание миграции
$ gomigrator create <имя_миграции>

Применение всех миграций
$ gomigrator up
Откат последней миграции
$ gomigrator down
Повтор последней миграции (откат + накат)
$ gomigrator redo
Вывод статуса миграций
$ gomigrator status

Таблица из:

Статус (применена, применяется, ошибка и пр.)
Время последнего обновления статуса
Имя миграции

Вывод версии базы
$ gomigrator dbversion
- по сути номер последней примененной миграции.

Формат миграций
Вы должны предоставить пользователю API для описания up/down шагов миграции.

Если миграция в формате Go-кода, то она может иметь формат:

func Up_migration(o *someObject) {
}

func Down_migration(o *someObject) {
}

Где someObject - один из аргументов, которые вы считаете, могут пригодиться при описании миграции (транзакция, структура вашей библиотеки и пр.)

Если миграция в формате SQL, то необходимо придумать способ разделения между Up и Down шагами, например, с помощью комментариев.

Драйвер
Поддержки PostgreSQL достаточно.

Консистентность

Запуск тулзы в параллельных процессах возможен (например, две ноды приложения решили на старте применить свои миграции), при этом процессы не должны мешать друг другу и дублировать свои миграции, что можно реализовать с помощью блокировок на уровне БД (SELECT FOR UPDATE, pg_advisory_lock, etc).

Если идентификаторы миграций совпадают (ID, время, имя, пр. атрибут, который вы решили выбрать для идентификации миграции), то возможно, что один из процессов пропускает свои миграции, так как они уже применены другим.

Логирование
На ваше усмотрение, но здорово, когда инструмент имеет понятный и подробный вывод о ходе своей работы и статусе выполнения команды (ошибка, успех, что было сделано, какие идентификаторы и пр.).

Конфигурация
Основные параметры:

Строка подключения (DSN) к БД
Путь к директории с файлами миграций
Тип миграции: go/sql

Конфигурировать должно быть можно как через аргументы командной строки, так и через файл, при этом в файле можно указывать переменные окружения, которые должны заэкспандиться:

dsn: $DB_DSN

Тестирование

Юнит-тесты
по возможности мок интерфейсов и проверка вызовов конкретных методов;
тесты вспомогательных функций и пр.

Интеграционные тесты
docker-compose + проверка работы тулзы на контейнере с PSQL;
тестовые миграции можно хардкодить;
можно напрямую дергать PSQL, чтобы проверить результат миграций.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Go 1.20 is released!

Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, в том числе предоставляя реализованные на уровне операторов средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за допустимые области выделенных блоков памяти и обеспечивает возможность использования сборщика мусора.

Предоставлена поддержка оптимизации на основе результатов профилирования кода (PGO - Profile-guided optimization), позволяющей учитывать особенности, определяемые во время выполнения программы. Учёт профиля выполнения при сборке позволяет повысить производительность приложений на 3-4%. Для включения PGO в go build, go install и другие сборочные команды добавлена опция "-pgo".

Теперь можно передать флаг -C <dir>, чтобы задать рабочую директорию для подкоманды go;

В пакет unsafe добавлены функции SliceData, String и StringData для низкоуровневых манипуляций со срезами (массивы динамического размера) и строками (например, для преобразования области памяти, на которую ссылается указатель в строку с типом string и наоборот).

Правила преобразования типов расширены возможностью прямого преобразования из среза (slice) в массив.

В спецификации явно определён порядок сравнения элементов массива и полей структур.

Утилита cover расширена возможностью построения coverage-профиля для всей программы, а не только unit-тестов. Для формирования coverage-профиля в go build, go install и другие сборочные команды добавлена опция "-cover".

Утилита go избавлена от привязки к размещаемым в каталоге $GOROOT/pkg заранее скомпилированным пакетам стандартной библиотеки, что позволило исключить их из поставки и добиться уменьшения размера загружаемых данных. Пакеты стандартной библиотеки, как и обычные пакеты, теперь собираются по мере необходимости и кэшируются в сборочном кэше.

В команде go по умолчанию отключено применение пакета cgo на системах без инструментария для сборки кода на языке Си. На подобных системах теперь используются варианты пакетов стандартной библиотеки на языке Go, вместо использования предварительно скомпилированных пакетов.

В утилите vet реализованы дополнительные предупреждения о проблемах с используемыми в циклах переменными, выявленными при параллельном запуске тестов.

В стандартную библиотеку добавлен пакет crypto/ecdh с поддержкой обмена ключами на основе эллиптических кривых ECDH (Elliptic Curve Diffie-Hellmann).
Добавлен новый тип http.ResponseController для создания расширенных обработчиков HTTP-ответов.
В тип httputil.ReverseProxy добавлена функция Rewrite для изменения запроса.

Добавлена функция context.WithCancelCause, позволяющая отменить вызов с указанием определённой ошибки.
В тип os/exec.Cmd добавлены поля Cancel и WaitDelay, определяющие поведение при отмене контекста или завершении процесса.

В компиляторе и сборщике мусора снижено потребление памяти и проведена оптимизация производительности (прирост скорости достигает 2%).
Проведена работа по ускорению компиляции - сокращение времени сборки может достигать 10%.

Добавлена поддержка платформы FreeBSD на системах с арихитектурой RISC-V (GOOS=freebsd, GOARCH=riscv64).

go build и go install и некоторые другие команды принимают новый флаг --pgo, который включает profile-guided optimization, а также флаг --cover.

https://go.dev/blog/go1.20
🏎️ Go 1.20 Released

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM