Save 37% off PRO during our Black Friday Sale! »

Марк Шевченко "Микросервисы на С#"

Марк Шевченко "Микросервисы на С#"

Введение в тему микросервисов и конкретно их разработку на С#. Немного о подводных камнях и том, как с ними справляться.

Ceecdee9ee77b63d81100be62b7e1090?s=128

DotNetRu

May 29, 2020
Tweet

Transcript

  1. Микросервисы на C# C# на сервере и архитектура

  2. Марк Шевченко Backend разработчик http://markshevchenko.pro @markshevchenko http://prog.msk.ru 2

  3. Микросервисы — это… 3

  4. Не монолит Монолит 4

  5. Не монолит Монолит Coupling 5

  6. Не монолит Монолит Coupling 6

  7. Не монолит Монолит Coupling µ-сервис µ-сервис µ-сервис µ-сервис 7

  8. UNIX way Make each program do one thing well 8

  9. UNIX way Make each program do one thing well ps

    aux | tail -n +2 | wc -l 9
  10. Масштабирование 10

  11. Масштабирование 11

  12. Масштабирование 12

  13. Remote Procedure Call 1967 Simula SmallTalk 1972 1975 RFC 684

    RPC term 1981 1983 C++ Turbo C++ 1991 1991 CORBA DCOM 1996 1996 HTTP 2000 SOAP AJAX 2005 2006 REST JSON 2013 2015 gRPC 13
  14. Remote Procedure Call 1967 Simula SmallTalk 1972 1975 RFC 684

    RPC term 1981 1983 C++ Turbo C++ 1991 1991 CORBA DCOM 1996 1996 HTTP 2000 SOAP AJAX 2005 2006 REST JSON 2013 2015 gRPC 14
  15. Микросервисы — это веб-приложения 15

  16. Continuous Integration 16

  17. Виртуализация Hardware Emulator Host OS Host OS Guest OS Bin/Lib

    App Guest OS Hypervisor Bin/Lib App Container Engine Bin/Lib App 17 Host OS
  18. 18

  19. Картина целиком 19

  20. Картина целиком 20

  21. Картина целиком 21

  22. Картина целиком 22

  23. Картина целиком 23

  24. Микросервисы — это… 24

  25. Ссылки про микросервисы - https://auth0.com/blog/an-introduction-to-microservices-p art-1/ https://auth0.com/blog/an-introduction-to-microservices-p art-2-API-gateway/ https://auth0.com/blog/an-introduction-to-microservices-p art-3-the-service-registry/

    https://auth0.com/blog/introduction-to-microservices-part -4-dependencies/ - https://12factor.net/ru/ https://microservices.io/patterns/apigateway.html https://martinfowler.com/articles/microservices.html 25
  26. Web в .NET 26

  27. Web в .NET 2003 WebForms WCF 2006 2009 MVC Web

    API 2009 2013 OWIN Katana 2013 .NET Core 1 2016 2016 Kestrel 2017 .NET Core 2 27
  28. Пример 28

  29. Пример [Route("api/v1/todo-items")] public class TodoItemsController : ControllerBase { private readonly

    TodoDbContext dbContext; [HttpGet(“{id}”)] public async Task<TodoItem> GetByIdAsync(int id) { return await dbContext.TodoItems .SingleAsync(x => x.Id == id); } } 29
  30. Пример [Route("api/v1/todo-items")] public class TodoItemsController : ControllerBase { private readonly

    TodoDbContext dbContext; [HttpGet(“{id}”)] public async Task<TodoItem> GetByIdAsync(int id) { return await dbContext.TodoItems .SingleAsync(x => x.Id == id); } } 30
  31. Пример [Route("api/v1/todo-items")] public class TodoItemsController : ControllerBase { private readonly

    TodoDbContext dbContext; [HttpGet(“{id}”)] public async Task<TodoItem> GetByIdAsync(int id) { return await dbContext.TodoItems .SingleAsync(x => x.Id == id); } } GET /api/v1/todo-items/123 31
  32. Пример [Route("api/v1/todo-items")] public class TodoItemsController : ControllerBase { private readonly

    TodoDbContext dbContext; [HttpGet(“{id}”)] public async Task<TodoItem> GetByIdAsync(int id) { return await dbContext.TodoItems .SingleAsync(x => x.Id == id); } } GET /api/v1/todo-items/123 32
  33. Пример [Route("api/v1/todo-items")] public class TodoItemsController : ControllerBase { private readonly

    TodoDbContext dbContext; [HttpGet(“{id}”)] public async Task<TodoItem> GetByIdAsync(int id) { return await dbContext.TodoItems .SingleAsync(x => x.Id == id); } } 33
  34. Пример [Route("api/v1/todo-items")] public class TodoItemsController : ControllerBase { private readonly

    TodoDbContext dbContext; [HttpGet(“{id}”)] public async Task<TodoItem> GetByIdAsync(int id) { return await dbContext.TodoItems .SingleAsync(x => x.Id == id); } } 34
  35. Ссылки про веб-приложения - https://dotnetcore.show/episode-1-a-brief-history-of-net- core/ - https://docs.microsoft.com/ru-ru/aspnet/core/tutorials/fi rst-web-api -

    https://github.com/dotnet-architecture/eShopOnContainers 35
  36. Проблемы 36

  37. 37

  38. 38

  39. 39

  40. 40

  41. 41

  42. Ссылки про проблемы - https://dwmkerr.com/the-death-of-microservice-madness-in- 2018/ 42

  43. Решения 43

  44. Транзакции - отказ - партиции, шардирование - эмуляция - уборка

    - в виде исключения 44
  45. Сцепленность Шаг Шаг Шаг 45

  46. Сцепленность Шаг Шаг Шов Шаг 46

  47. Сцепленность Шаг Шаг Шов Шаг Шаг Шаг 47

  48. Микросервисы — это деталь 48

  49. Деталь реализации Product Order OrderItem OrderItem OrderService 49

  50. Деталь реализации Product Order OrderItem OrderItem OrderService IDiscountService OrderDto DiscountDto

    50
  51. Деталь реализации Product Order OrderItem OrderItem OrderService IDiscountService OrderDto DiscountDto

    XmasDiscountService 51
  52. Деталь реализации Product Order OrderItem OrderItem OrderService IDiscountService OrderDto DiscountDto

    XmasDiscountService 52
  53. Деталь реализации Supplier Customer Contract NuGet 53

  54. Contract NuGet interface IDiscountService { DiscountDto[] Calculate(OrderDto orderDto); } class

    DiscountDto { public int ProductId { get; set; } public decimal Amount { get; set; } public string Description { get; set; } } 54 class OrderDto { . . . }
  55. Customer [Route(“api/v1/discounts”)] class DiscountController : ControllerBase, IDiscountService { [HttpPost] public

    DiscountDto[] Calculate(OrderDto orderDto) { var discounts = from item in orderDto.Items select new DiscountDto { ProductId = item.ProductId, Amount = item.Sum * 0.03m, Description = “Merry Christmas” }; return discounts.ToArray(); } } 55
  56. Supplier class DiscountProxy : IDiscountService { private readonly IHttpClientFactory clientFactory;

    public DiscountDto[] Calculate(OrderDto orderDto) { return clientFactory.Create() .Put<DiscountDto[]>(“api/v1/discount”, orderDto); } } 56
  57. paths: /: get: operationId: listVersionsv2 summary: List API versions responses:

    '200': description: |- 200 response content: application/json: examples: foo: value: { "versions": [ { "status": "CURRENT", "updated": "2011-01-21T11:33:21Z", "id": "v2.0", "links": [ 57
  58. Feature Envy 58

  59. Решения - Supplier/Customer или Shared Core - Интерфейсы служб -

    Косвенный вызовы - DTO, а не POCO - NuGet - Message Queue - Open-Closed Principle 59
  60. Ссылки про решения - https://github.com/ThreeMammals/Ocelot - https://www.envoyproxy.io/ - https://www.nuget.org/packages/Binateq.JsonRestClient -

    https://github.com/domaindrivendev/Swashbuckle - https://github.com/RicoSuter/NSwag 60
  61. Содержание - не монолит - UNIX way - масштабирование -

    SOAP, REST, gRPC - CI/CD - контейнеры, оркестрация - шлюзы - manage its own data - web в .NET - MVC, маршрутизация - асинхронность - проблема: транзакции - проблема: сеть - проблема: версии - решения для транзакций - решения для сцепленности - деталь реализации, Open API - feature envy, MQ Марк Шевченко http://markshevchenko.pro @markshevchenko 61