Слайд 7Как сделать так,
чтобы такое больше не повторялось
Слайд 11Проблема. В каждом сервисе своя реализация клиента StorageServiceClientProxy
Слайд 12Проблема. В каждом сервисе своя реализация клиента StorageServiceClientProxy
Слайд 33Где расположить контракты?
Как осуществить доступ сервисов к контрактам?
Слайд 34Где расположить контракты?
Как осуществить доступ сервисов к контрактам?
Слайд 35В какой момент выполнять генерацию?
Слайд 36В какой момент выполнять генерацию?
Слайд 38Где расположить код клиента?
Где расположить код клиента?
Слайд 41DescriptionController.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)
{ // код... }
Слайд 42FileController.cs
[Route("[controller]")]
[ApiController]
public class FileController : ControllerBase {
[OpenApiOperation("SaveFile")]
[ProducesResponseType(401)]
[ProducesResponseType(403)]
[HttpPost("{pluginName}/{binaryDataId}/{fileName}")]
[FileUploadOperation]
public async Task SaveFile() { // код...
}
Слайд 44Конфигурация Nswag.json
"runtime": "NetCore22",
"documentGenerator": { "webApiToOpenApi": {
"defaultUrlTemplate": "api/{controller}/{id?}",
"infoTitle": "PreviewStorage", "infoVersion": "1.0.0",
"documentName": "v1","allowNullableBodyParameters":
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“ } } }
Слайд 52Изменение
контрактов
Команда сервиса поставщика сама исправляет сервисы потребители.
Без версионирования
Варианты решения
Слайд 53Изменение
контрактов
Плохо работает:
Разные репозитории
Нет компетенций
Варианты решения
Слайд 54Изменение
контрактов
Команда сервиса поставщика оставляет предыдущую версию контрактов
Варианты решения
Слайд 68Процессор
public class FileUploadOperationAttribute : OpenApiOperationProcessorAttribute {
public FileUploadOperationAttribute() : base(typeof(FileUploadOperationProcessor)) { } }
public
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; } }
Слайд 69WSDL
Language, platform, and transport independent (REST requires use of HTTP)
Works well
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
Слайд 72https://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