User Tools

Site Tools


Golang samples

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

Цель cоздания этой страницы: показать опыт разработки, и избежать простых вопросов типа “что будет, если писать в закрытый канал, по дизайну runtime” (“надо дать по рукам обучить контролю жизненного цикла объектов того, кто так пишет код”).

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

Note2: Большое количество подходов, решений, стандартов не охвачено примерами ниже, или скрыто внутри и отсутсвует в описании ниже. О подходе к деятельности отдельно, например, специально изучал проектное управление в оригинале, PMM, и сдал минимальный экзамен.


RPC фреймворк и протокол

Упрощенный и переделанный вариант моего же фреймворка для коммерческого проекта.

Клиентская часть включает три метода: Exec, Get, Put. Два последних позволяют, вместе с RPC, запросить или отправить на сервер в потоке BLOB размером в гигабайты. В требованиях до 5-10Gb, массово по 16-64Mb.

Есть возможность добавлять свой middleware, в pre- и post- обработке. Рабочие примеры плагинов включены в пакет.
Включает опциональную дайджест аутентификацию, и возможность легко сделать авторизацию запросов.
Написание API очень простое - 1 обрабочик, 1 структура запроса и 1 ответа для 1-го API, общие для клиента и сервера. Можно сделать генератор API хоть из камней и палок.

Ответ на Put обрабатывается асинхронно, что бы была возможность корректно и быстро ответить на вложенный RPC запрос и закрыть соединение, не дожидаясь приема всего BLOB-а. Get аналогично.
Разумеется, все запросы обрабатываются в отдельных потоках. Есть обработка паники для потоков.

Для тестирования ответ-запрос сделан фейковый Conn, соотвествующий по интерфейсу библиотечному TCP

По идеологии неожиданно получился похожим на фреймворк Gin.

Проект распределенной системы системы резервирования

Три класса мини-сервисов: управляющий “мастер”, системный агент и сервис хранения.

Идиологический предок: Bacula.
В разработке. Из особенностей: после оценки требований и существующих форматов упаковки, все-таки принял свой формат, позволяющий записать контрольные суммы и доп-информацию в хвосте, при передаче в резервной копии данных потоке

Sysrun

Небольшое full stack REST приложение, созданное для обеспечения процессов прозводства на фабрике.
Цель: дать возможность инженерам удаленно, с любого места и мобильного (да, риски осознаны всеми), остановить или запустить виртуальные KVM-машины с легаси приложениями.

Сделано для временно закрыть серъезную проблему, связанную с тяжело легаси приложениями. Которое фактически останавливали производство целиком, по всем производственным линиям.
Цель достигнута, получено время для переработки легаси.

Особенность: все *.js, *.css и прочие данные фронта упакованы в obj file приложения, через кодогенератор.

Это полноценно инсталируемое Linux Debian приложение, по требованиям эксплуатации.

Dedup

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

Особенность: скорость обработки и простота использования.
Использовал Hash-алгоритм https://github.com/minio/highwayhash
Сделал как порядочный дистрибутив в систему.

Кастомная десериализация из JSON

Пакет с кастомными типами Int, Float, Bool и прочими, для десериализации и нормализации некорректных JSON документов.
Использован в сервисах коммерческих шлюзов-обработчиков, 24/7 принимающим данные из транспортно-логистических компаний.

Apollo GraphQL web-socket клиент

Клиент для чтения и дальнейшего разбора Apollo GraphQL сообщений, передаваемых по web сокету. Из коммерческого проекта.
Написан мной по спецификации протокола https://github.com/apollographql/subscriptions-transport-ws/blob/master/PROTOCOL.md за отсутсвием готового пакета на Go.

GraphQL over Apollo protocol over websocket over HTTP over TCP, но таково было требование по взаимодействию сервисов.

JSON web token аутентификация

Модуль и middleware для Gin, созданный для кастомной JWT аутентификации корпоративных сервисов.
Не последняя версия, какая-то из промежуточных рабочих.
Код авторизации API (“этот запрос-api этому клиенту можно-нельзя”) не публикую, из-за коммерческих данных.

Перехватчик-рекордер API запросов

Кастомный dummy proxy-recorder, созданный для записи данных запросов. И их дальнейшего анализа из полученного массива.
Создан за полдня, работал трое суток (принимал копии запросов, и записал пару гигабайт json документов), но позволил отследить и понять все форматы json документов, передаваемые между компаниями. Без обращения ко множеству департаментов, которые могли затянуться на месяцы и кончится ничем.

Опубликован упрощенный вариант, без коммерческой аналитической части. Может быть пригодится.
На базе Gin.

Кастомная gRPC аутентификация и если необходимо авторизация

Реализация JSON RPC 2.0 сервиса

Сделана как опорная реализация-шаблон, для коммерческих мини-сервисов. Данный open source вариант не включает обработку пакетов запросов.
Включает особенности

  • Возможность валидации JSON запроса
  • Работу через web socket

JSON Schema генератор, reflect

Генератор схемы для произвольной Go структуры, через рекурсивный анализ c помощью пакета reflect

Упаковка-распаковка целых типов, reflect

Одно из маленьких исследований для коммерческого проекта.

Другое

“Не Go единым”. Годами ранее довольно много кода написано на С & Perl, немного на С++, и еще разных.

C, Микро "операционная система" для STM32

Это действительно минимальная основа встраиваемой операционной системы:

  1. вытесняющий планировщик
  2. семафоры/mutex.

Ничего особо нового, но написана самостоятельно, чисто, с пониманием и перелопачиванием документов.

Цель: часть любительского проекта для встраиваемых летных систем, и профессиональное развитие.

C, Шаблон для разработки устройства на базе STM32 и FreeRTOS

Весь код, за исключением FreeRTOS, написан самостоятельно, на основании документации по устройствам.
Цель: поддержание профессиональных навыков и знаний, “just for fun” и рабочий шаблон встраиваемой системы.