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

Николай Михайлычев "Подход Contract-First при р...

DotNetRu
October 05, 2019

Николай Михайлычев "Подход Contract-First при разработке распределенных систем"

Расскажу о простых программистских проблемах, ежедневно возникающих при разработке и потреблении различных API в распределенных системах: 
- как добиться гарантированной совместимости клиентской и серверной сторон;
- как избежать потери времени разработчиков на описание развесистых моделей на каждом из задействованных узлов;
- как вовремя донести до разработчика серверной части пожелания клиентской, чтобы его работа не улетела в стол;
А еще рассмотрю подходы и инструменты, имеющиеся на .NET для .NET (и не только), с помощью которых можно решить эти маленькие проблемы, которые оказываются совсем не маленькими в пересчете на человекочасы.

DotNetRu

October 05, 2019
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. Классический процесс разработки 7 • Согласование • Описание контракта •

    Документировани е API • Разработка • Services • Clients • UI • Интеграция • Приводим в работоспособное состояние
  2. Классический процесс разработки 8 • Согласование • Описание контракта •

    Документировани е API • Разработка • Services • Clients • UI • Интеграция • Приводим в работоспособное состояние
  3. Проблемы • Необходимость ручной имплементации • Ошибки при переносе в

    код • Необходимость поддержки документации • Проблемы коммуникации и доработок 12
  4. Проблемы • Необходимость ручной имплементации • Ошибки при переносе в

    код • Необходимость поддержки документации • Проблемы коммуникации и доработок • Непредсказуемая интеграция 13
  5. Проблемы • Необходимость ручной имплементации • Ошибки при переносе в

    код • Необходимость поддержки документации • Проблемы коммуникации и доработок • Непредсказуемая интеграция Могут отнимать до 20% времени разработки 14
  6. Open API https://swagger.io/ • Json Schema-Based • YAML или JSON

    • Большой выбор инструментов 17
  7. Open API 18 ---
 swagger: '2.0'
 info:
 version: 1.0.0
 title:

    Sample CERT API
 description: Sample CERT API
 schemes:
 - http
 consumes:
 - application/json
 produces:
 - application/json
 paths:
 /api/incidents: ... definitions:
 IncidentListDto:
  8. NSwag https://github.com/RicoSuter/ NSwag • Полный набор инструментов для swagger •

    На .NET • nuget & npm • Поддерживает C# и TypeScript 19
  9. Процесс Contract-First 20 • Разработк а Специфик ации • Согласова

    ние Специфик ации • Выпуск Артефакта Специфик ации • Генерация Клиента и Сервера • Разработк а • Интеграци я
  10. Альтернативы • Swagger Codegen - https://swagger.io/tools/swagger-codegen/ • Java on-premise or

    cloud-based • SwaggerHub - https://swagger.io/tools/swaggerhub/ • 15$/user/month Cloud less than 25 users or Enterprise over 25 users 23
  11. Альтернативы • Swagger Codegen - https://swagger.io/tools/swagger-codegen/ • Java on-premise or

    cloud-based • SwaggerHub - https://swagger.io/tools/swaggerhub/ • 15$/user/month Cloud less than 25 users or Enterprise over 25 users • RAML Toolkit - https://raml.org/ 24
  12. Альтернативы • Swagger Codegen - https://swagger.io/tools/swagger-codegen/ • Java on-premise or

    cloud-based • SwaggerHub - https://swagger.io/tools/swaggerhub/ • 15$/user/month Cloud less than 25 users or Enterprise over 25 users • RAML Toolkit - https://raml.org/ • API Blueprint - https://apiblueprint.org/ 25
  13. gRPC https://grpc.io • Кросс-платформенный • Производительный • HTTP/2 • Google

    protobuf-based • ASP.NET Core 3.0 – полностью поддерживает 27
  14. Contract-First • Сократили время на имплементацию (генерируем клиент) • Сократили

    время на интеграцию(Гарантировали согласованность API) • Получили автодокументирование (Swagger UI) • Согласование через Code-review • Доступность подхода для разных протоколов и технологий 29
  15. Недостатки подхода • Необходимость разработки спецификации • Привязка к набору

    инструментов • Особенности кодогенерации 30 oneOf:
 - $ref: '#/components/schemas/ Cat'
 - $ref: '#/components/schemas/ Dog'
 discriminator:
 propertyName: pet_type