Презентации лучше смотреть с десктопа
Слайды рассчитаны на широкий экран, клавиатуру и формат 16:9. Откройте эту страницу на ноутбуке или компьютере.
Вернуться на сайтEasyP:
или как переизобрести prototool?
Эдгар Сипки//Developer Advocate MWS
Эдгар Сипки
- НЕгений, НЕмиллиардер, НЕфилантроп
- Евангелист gRPC
- Фанат
War / Craft / Hammer
О чём поговорим?
- 01Что такое protobuf?
- 02Как расширяется proto?
- 03Toolset для работы с proto
- 04Берём всё в свои руки
ЧТО ТАКОЕ
PROTOBUF?
Что такое Protobuf?
Бинарный формат
Меньше размер по сравнению с JSON и XML, быстрее парсится.
Строгая типизация
Использует схемы (.proto файлы) для определения структуры сообщений.
Обратная совместимость
Позволяет эволюционировать API без нарушения работы существующих клиентов.
Что такое gRPC?
Разработан Google
Protobuf-сериализация
Кодогенерация
HTTP/2 транспорт
Расширяется плагинами
Гибкая архитектура
Поддерживает модули для расширения функциональности.
Кодогенерация
Плагины генерируют код на разных языках.
Ускорение разработки
Валидация, документация, тестирование — из коробки.
Свои плагины
Собственные расширения под задачи команды.
SPEC
FIRST
- Спека — истина, ваш код — тоже истина
- Не получаем рассинхрон кода и документации
О чём поговорим?
- Что такое protobuf?
- Как расширяется proto?
- Toolset для работы с proto
- Берём всё в свои руки
КАК РАСШИРЯЕТСЯ
PROTO?
Плагины для protoc
plugins:
- name: go
out: .
opts:
paths: source_relative
- name: go-grpc
out: .
opts:
paths: source_relative
require_unimplemented_servers: falseОфициальные и
популярные библиотеки
google.golang.org/protobuf/compiler/protogenСтандартная библиотека от Google.
github.com/lyft/protoc-gen-starКомьюнити-вариант с удобной обёрткой над AST.
main.go
protogen.Options{
ParamFunc: flag.CommandLine.Set,
}.Run(func(gp *protogen.Plugin) error {
gp.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL)
for _, name := range gp.Request.FileToGenerate {
glog.V(1).Infof("Processing %s", name)
glog.V(2).Infof("Generating %s\n", fmt.Sprintf("%s.pb.json.go", f.GeneratedFilenamePrefix))
gf := gp.NewGeneratedFile(fmt.Sprintf("%s.pb.mocker.go", f.GeneratedFilenamePrefix), f.GoImportPath)
err := templates.ApplyTemplate(gf, f)
...
}
return nil
})Собираем вызовы
func ApplyTemplate(w io.Writer, f *protogen.File) error {
if err := headerTemplate.Execute(w, tplHeader{
File: f,
}); err != nil {
return err
}
return applyMessages(w, f.Messages)
}Headers
type tplHeader struct {
*protogen.File
}
var headerTemplate = template.Must(template.New("header").Parse(`
// Code generated by protoc-gen-mocker. DO NOT EDIT.
// source: {{.Proto.Name}}
package {{.GoPackageName}}
import (
"go.uber.org/mock/gomock"
"google.golang.org/protobuf/proto"
)
var _ gomock.Matcher
`))Messages
type tplMessage struct {
*protogen.Message
}
var messageTemplate = template.Must(template.New("message").Parse(`
// Matches implements gomock.Matcher.
func (msg *{{.GoIdent.GoName}}) Matches(y interface{}) bool {
p2, ok := y.(proto.Message)
if !ok {
return false
}
return proto.Equal(msg, p2)
}
`))Вызов
plugins:
- name: go
out: .
opts:
paths: source_relative
- name: go-grpc
out: .
opts:
paths: source_relative
require_unimplemented_servers: false
- name: mocker
out: .
opts:
paths: source_relativeО чём поговорим?
- Что такое protobuf?
- Как расширяется proto?
- Toolset для работы с proto
- Берём всё в свои руки
TOOLSET
ДЛЯ PROTO
Проблемы proto?
- Отсутствие встроенного пакетного менеджера
- Разнообразие стилей
- Лёгкая возможность поломать обратную совместимость
- Неудобство в генерации
(ох уж эти 10-строчные bash-команды)
Prototool
Update: We recommend checking out Buf, which is under active development. There are a ton of docs for getting started, including for migration from Prototool.
License: MIT · v1.10.0 · last release: 5 years ago
Protop
gradlew.bat What: executable task created. 5 years ago
install.sh Feature/Registry (#24) 5 years ago
settings.gradle init 5 years agoApache-2.0 · последний коммит — 5 лет назад.
Да кто это такой
ваш Buf?
Единственный выживший?
- Linter
- Package manager
- Breaking checker
- Generator
Это всё что ли?
Но нас заблокировали
- Linter
- Package manager
- Breaking checker
- Generator
Часть функционала недоступна из РФ.
О чём поговорим?
- Что такое protobuf?
- Как расширяется proto?
- Toolset для работы с proto
- Берём всё в свои руки
БЕРЁМ ВСЁ
В СВОИ РУКИ
Нам нужно работать
- Локально на VPN
- CI/CD поломан
- Перевезти целый BigTech не легко
Даниил Подольский
- Нужно срочное решение
- Перевезти на что-то своё быстро нельзя
- Блокировка многих мест
- Велосипед?
Архитектура package manager
Client CLI ResolveSvc RepositorySvc DownloadSvc | | | | | |--Request-> | | | | |--Resolve---->| | | | |<--repo-addr--| | | | |--Get repo info------------>| | | |<--repo info----------------| | | |--Download------------------------> | | |<--files------------------------------------| |<-Packages-| | | |
URL до нашего сервера
deps:
- <your_host>/googleapis/googleapis
- <your_host>/bufbuild/protoc-gen-validateПочему так?
- Разблокировали большую часть процесса
- Не пришлось перевозить сотрудников
(оставили им buf) - Быстро
Василий Близнецов
Open Source должен быть для всех.
- Не хотели сидеть на
bufдальше - Хотели механизм, не позволяющий блокировать
- Любим велосипеды
ВИЖУ ЦЕЛЬ —
ИДУ К ЦЕЛИ
Должны не повторить,
а улучшить
Package manager
Как работает go get?
[ go get command ] -> [ Git repo URL ] -> [ Fetch package ] -> [ Save locally ] -> [ Update lock file ]
Это не шутка
os.Exec("git", ...)
git init --bare
git fetch --depth=1
git ls-tree
git archive --format=zip
# и всё! (ну почти)Полная
совместимость (ну почти)
deps: [
github.com/googleapis/googleapis,
github.com/grpc-ecosystem/grpc-gateway@v2.1.4,
github.com/bufbuild/protoc-gen-validate@<hash_commit>,
]easyp.lock
github.com/bufbuild/protoc-gen-validate v1.1.1
github.com/googleapis/googleapis v0.0.0-202411...
github.com/grpc-ecosystem/grpc-gateway v0.0.0-...О чём поговорим?
- Что такое protobuf?
- Как расширяется proto?
- Toolset для работы с proto
- Берём всё в свои руки
Так чего в итоге?
- Не боимся делать проблем — они дают возможность
(АУФ) - Любим gRPC — он удобен
- Пилим свои плагины и расширяем свою экосистему
easyp.tech · github.com/easyp-tech