Публичные контракты, как обеспечить их согласованность

Содержание

Слайд 3

Изменение контрактов

Изменение контрактов

Слайд 4

Изменение контрактов

Изменение контрактов

Слайд 5

Нужно что-то предпринять

Нужно что-то предпринять

Слайд 6

Нужно что-то предпринять

Нужно что-то предпринять

Слайд 7

Как сделать так, чтобы такое больше не повторялось

Как сделать так, чтобы такое больше не повторялось

Слайд 8

Экосистема Sungero

Экосистема Sungero

Слайд 9

Экосистема Sungero

Экосистема Sungero

Слайд 10

Экосистема Sungero

Экосистема Sungero

Слайд 11

Проблема. В каждом сервисе своя реализация клиента StorageServiceClientProxy

Проблема. В каждом сервисе своя реализация клиента StorageServiceClientProxy

Слайд 12

Проблема. В каждом сервисе своя реализация клиента StorageServiceClientProxy

Проблема. В каждом сервисе своя реализация клиента StorageServiceClientProxy

Слайд 13

Постановка задачи

Постановка задачи

Слайд 14

Постановка задачи

Постановка задачи

Слайд 16

Инструменты

RPC

REST

Инструменты RPC REST

Слайд 17

REST vs RPC

REST vs RPC

Слайд 33

Где расположить контракты? Как осуществить доступ сервисов к контрактам?

Где расположить контракты? Как осуществить доступ сервисов к контрактам?

Слайд 34

Где расположить контракты? Как осуществить доступ сервисов к контрактам?

Где расположить контракты? Как осуществить доступ сервисов к контрактам?

Слайд 35

В какой момент выполнять генерацию?

В какой момент выполнять генерацию?

Слайд 36

В какой момент выполнять генерацию?

В какой момент выполнять генерацию?

Слайд 37

Где расположить код клиента?

Где расположить код клиента?

Слайд 38

Где расположить код клиента?

Где расположить код клиента?

Где расположить код клиента? Где расположить код клиента?

Слайд 39

Где расположили код клиента

Где расположили код клиента

Слайд 40

Детали реализации

Детали реализации

Слайд 41

DescriptionController.cs

[Route("[controller]")]
[ApiController]
public class DescriptionController : ControllerBase {
[OpenApiOperation("GetDescription")]
[ProducesResponseType(typeof(ConversionDescription), 200)]
[ProducesResponseType(401)]
[ProducesResponseType(403)]
[HttpGet("{pluginName}/{binaryDataId}")]
public ActionResult GetDescription(
string pluginName, Guid binaryDataId)

DescriptionController.cs [Route("[controller]")] [ApiController] public class DescriptionController : ControllerBase { [OpenApiOperation("GetDescription")] [ProducesResponseType(typeof(ConversionDescription), 200)]
{ // код... }

Слайд 42

FileController.cs

[Route("[controller]")]
[ApiController]
public class FileController : ControllerBase {
[OpenApiOperation("SaveFile")]
[ProducesResponseType(401)]
[ProducesResponseType(403)]
[HttpPost("{pluginName}/{binaryDataId}/{fileName}")]
[FileUploadOperation]
public async Task SaveFile() { // код...

FileController.cs [Route("[controller]")] [ApiController] public class FileController : ControllerBase { [OpenApiOperation("SaveFile")] [ProducesResponseType(401)] [ProducesResponseType(403)]
}

Слайд 43

Процессор

Процессор

Слайд 44

Конфигурация Nswag.json

"runtime": "NetCore22",
"documentGenerator": { "webApiToOpenApi": {
"defaultUrlTemplate": "api/{controller}/{id?}",
"infoTitle": "PreviewStorage", "infoVersion": "1.0.0",
"documentName": "v1","allowNullableBodyParameters":

Конфигурация Nswag.json "runtime": "NetCore22", "documentGenerator": { "webApiToOpenApi": { "defaultUrlTemplate": "api/{controller}/{id?}", "infoTitle": "PreviewStorage",
true,
"output": "../../api-docs/PreviewStorage_swagger.json",
"outputType": "OpenApi3",
"assemblyPaths": [
"../../bin/$(Configuration)/PreviewStorage/netcoreapp2.2/PreviewStorage.dll“ ], } },
"codeGenerators": { "openApiToCSharpClient": { "input": "../../api-docs/PreviewStorage_swagger.json",
"namespace": "PreviewStorage.WebApiProxy",
"generateClientInterfaces": true,
"useHttpRequestMessageCreationMethod": true,
“httpClientType": "System.Net.Http.HttpClient",
"additionalNamespaceUsages": [ "PreviewService.Common.Model“ ],
"output": "../PreviewStorage.WebApiProxy/PreviewStorageProxy.g.cs",
"className": "{controller}PreviewStorageProxy",
"operationGenerationMode": "SingleClientFromOperationId“ } } }

Слайд 45

Как добавили поддержку JWT

Как добавили поддержку JWT

Слайд 46

Как добавили поддержку JWT

Как добавили поддержку JWT

Слайд 47

Как добавили поддержку JWT

Как добавили поддержку JWT

Слайд 48

Как добавили поддержку JWT

Как добавили поддержку JWT

Слайд 49

Вывод

Вывод

Слайд 50

Вывод

Вывод

Слайд 51

Версионирование

Версионирование

Слайд 52

Изменение
контрактов

Команда сервиса поставщика сама исправляет сервисы потребители.
Без версионирования

Варианты решения

Изменение контрактов Команда сервиса поставщика сама исправляет сервисы потребители. Без версионирования Варианты решения

Слайд 53

Изменение
контрактов

Плохо работает:
Разные репозитории
Нет компетенций

Варианты решения

Изменение контрактов Плохо работает: Разные репозитории Нет компетенций Варианты решения

Слайд 54

Изменение
контрактов

Команда сервиса поставщика оставляет предыдущую версию контрактов

Варианты решения

Изменение контрактов Команда сервиса поставщика оставляет предыдущую версию контрактов Варианты решения

Слайд 55

Версионирование

Версионирование

Слайд 56

Версионирование

Версионирование

Слайд 57

Версионирование

Версионирование

Слайд 58

Версионирование

Версионирование

Слайд 59

Когда вводить новую версию

Когда вводить новую версию

Слайд 60

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

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

Слайд 61

Consumer driven contracts

Consumer driven contracts

Слайд 64

Спасибо за внимание!

Разработчик Directum
в г. Уфа Романюк Антон
romanyuk_aa@directum.ru

Спасибо за внимание! Разработчик Directum в г. Уфа Романюк Антон romanyuk_aa@directum.ru

Слайд 65

REST + gRPC

REST + gRPC

Слайд 66

Настройка csproj

Настройка csproj

Слайд 67

Как CDC можно встроить в CI

Как CDC можно встроить в CI

Слайд 68

Процессор

public class FileUploadOperationAttribute : OpenApiOperationProcessorAttribute {
public FileUploadOperationAttribute() : base(typeof(FileUploadOperationProcessor)) { } }
public

Процессор public class FileUploadOperationAttribute : OpenApiOperationProcessorAttribute { public FileUploadOperationAttribute() : base(typeof(FileUploadOperationProcessor)) {
class FileUploadOperationProcessor : IOperationProcessor {
public bool Process(OperationProcessorContext context) {
var parameters = context.OperationDescription.Operation.Parameters;
parameters.Add(new OpenApiParameter() {
Name = "stream", Kind = OpenApiParameterKind.Body,
Schema = new JsonSchema { Type = JsonObjectType.String, Format = "binary" },
IsRequired = true, Description = "Файл.",
});
return true; } }

Слайд 69

WSDL

Language, platform, and transport independent (REST requires use of HTTP)   
Works well

WSDL Language, platform, and transport independent (REST requires use of HTTP) Works
in distributed enterprise environments (REST assumes direct point-to-point communication)
Standardized
Provides significant pre-build extensibility in the form of the WS* standards
Built-in error handling
Automation when used with certain language products

Слайд 70

Версионирование

Версионирование

Слайд 72

https://servicesblog.redhat.com/2019/01/31/comparing-openapi-with-grpc/
https://docs.microsoft.com/en-us/aspnet/core/grpc/comparison?view=aspnetcore-3.1
https://blog.maddevs.io/introduction-to-grpc-6de0d9c0fe61
https://github.com/Azure/openapi-diff
https://www.davidkaya.com/with-openapi-against-breaking-changes/
https://github.com/grpc/grpc-web/issues/517 не подойдет для передачи больших файлов
https://developers.google.com/protocol-buffers/docs/techniques?hl=en#large-data сообщения не больше 1 мб
https://app.swaggerhub.com/help/integrations/api-auto-mocking

https://servicesblog.redhat.com/2019/01/31/comparing-openapi-with-grpc/ https://docs.microsoft.com/en-us/aspnet/core/grpc/comparison?view=aspnetcore-3.1 https://blog.maddevs.io/introduction-to-grpc-6de0d9c0fe61 https://github.com/Azure/openapi-diff https://www.davidkaya.com/with-openapi-against-breaking-changes/ https://github.com/grpc/grpc-web/issues/517 не подойдет для передачи больших файлов
Имя файла: Публичные-контракты,-как-обеспечить-их-согласованность.pptx
Количество просмотров: 22
Количество скачиваний: 0