Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Live перезагрузка кода в Go

Live перезагрузка кода в Go

Юрий Насретдинов

5b8d20aa7d63c5d391b1c881e1764460?s=128

Iskander (Alex) Sharipov

April 25, 2020
Tweet

Transcript

  1. Горячая перезагрузка кода в Go Юрий Насретдинов nasretdinov@gmail.com nasretdinov@google.com

  2. Я работаю SRE в Google, но этот доклад про моё

    хобби и не связан с моей работой в компании. Все мнения — мои собственные и не являются мнениями компании Google. Disclaimer
  3. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  4. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  5. Горячая перезагрузка / Live Reload

  6. Горячая перезагрузка / Live Reload

  7. Горячая перезагрузка / Live Reload Горячая перезагрузка кода — обновление

    кода программы в процессе её исполнения, без потери данных в памяти
  8. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  9. Зачем? • Ускорение разработки (stateful приложений) • Применение патчей в

    production
  10. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  11. Плагины https://golang.org/pkg/plugin/

  12. Плагины https://golang.org/pkg/plugin/

  13. Плагины https://golang.org/pkg/plugin/

  14. Плагины • Всегда пакет main • Нельзя выгрузить из памяти

    • Код пакетов должен в точности совпадать
  15. Плагины • Всегда пакет main • Нельзя выгрузить из памяти

    • Код пакетов должен в точности совпадать
  16. Плагины Живая перезагрузка кода с помощью плагинов невозможна*, расходимся *

    в том плане, что нельзя собрать тот же пакет с другим кодом и потом загрузить оттуда новую функцию
  17. Плагины Но можно же и так: - Скопировать код функции

    в пакет main. - Собрать плагин. - Остается только каким-то образом подменить реализацию существующей функции...
  18. Плагины =>

  19. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  20. Soft Mocks для Go • Подмена функций и методов «на

    лету» • Путем переписывания $GOPATH (и $GOROOT)
  21. Soft Mocks для Go

  22. Soft Mocks для Go • В тело каждой функции вставляется

    код в начале, который проверяет, не нужно ли выполнить другой код вместо текущего • Для этого создается копия $GOPATH с новым содержимым
  23. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  24. Ограничения реализации =>

  25. Ограничения реализации • Нельзя добавлять новые функции, константы, переменные •

    Можно только менять код существующих функций/ методов • Код обязан использовать публичные типы • (решаемо) Нельзя ссылаться на глобальные типы / переменные из того же пакета • (решаемо) Код должен жить в $GOPATH
  26. План • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  27. Демо

  28. Выводы • Понятие «горячей перезагрузки» кода • Зачем? • Плагины

    в Go • "Soft Mocks" для Go • Ограничения реализации • Демо • Выводы
  29. Выводы • «Живая перезагрузка» кода в Go возможна, но с

    оговорками ‣ Не переизобретайте Erlang :) • Open-Source: https://github.com/YuriyNasretdinov/hotreload • Экономия по времени сборки будет не всегда • Не применяйте в production! • Будете применять для разработки?