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

Wild microservices and imaginary DevOps

Wild microservices and imaginary DevOps

Сегодня очень часто можно услышать множество модных словечек, но даже среди них девопс и микросервисы будоражат умы людей как то по особенному.

Для обычного инженера DevOps и Микросервисы – это всего лишь маркетинговая профанация. Куда важнее “держать DevOps в своих руках” и уметь им пользоваться. Хочется понять где заканчиваются наши и чужие фантазии, где начинаются реально полезные практики, какие инструменты нам помогут и какие фундаментальные принципы помогут увеличить профит от используемых практик и инструментов.

Доклад в первую очередь про внедрение различных технологий, инструментов и методологий в большой организации. Поделюсь проблемами с которыми мы столкнулись при внедрении различных принципов и технологий, расскажу о решениях и выработанных принципах масштабирования процессов/инструментов.
Сегодня наш лозунг будет “DevOps в руках а не в головах”. Но то что в головах всё же важно, хоть это и совсем другая история.

Kirill Tolkachev

September 11, 2017
Tweet

More Decks by Kirill Tolkachev

Other Decks in Technology

Transcript

  1. 5 → Theory → Practice → QA В программе: 1.

    Дикости 21го века – DevOps и Микросервисы 2. Немного интерактива 3. Проблемы понимания и внедрения этих дикостей 4. Поделюсь своей историей в их осознания a. Масштабирование на команды b. Выработанные принципы c. Используемые инструменты 5. Сделаем быстрые выводы (если успеем) Agenda
  2. Re: Re: Re: Re: Re: Re: …. Привет Y, Мне

    сказали ты можешь сделать нам X, сделай! У нас в проекте DevOps! С уважением Работник Большой Компании <Лого Компании>
  3. Re: Re: Re: Re: Re: Re: …. Привет Дружище, мне

    сказали ты можешь помочь сделать нам X, помоги нам пожалуйста, ведь у нас в проекте DevOps! С уважением Работник Большой Компании <Лого Компании>
  4. Re: Re: Re: Re: Re: Re: …. Привет Дружище, мне

    сказали ты можешь помочь сделать нам X, помоги нам пожалуйста, ведь у нас в проекте DevOps! С уважением Работник Большой Компании <Лого Компании>
  5. Re: Re: Re: Re: Re: Re: …. Привет Дружище, мне

    сказали ты можешь помочь сделать нам X, помоги нам пожалуйста, ведь у нас в проекте DevOps! С уважением Работник Большой Компании <Лого Компании>
  6. Таблицы половозрелости Используется Jenkins да Уровень 1 Пишутся тесты да

    Уровень 1 Автоматизирована доставка да Уровень 2 Еще что то нет Уровень 2 Еще что то сложное нет Уровень 3
  7. 35

  8. 36

  9. 49

  10. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx sleuth Sl zipkin Zn groovy Gy 50 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Conway’s Law Co Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An
  11. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx sleuth Sl zipkin Zn groovy Gy 51 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Conway’s Law Co Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An
  12. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx sleuth Sl zipkin Zn groovy Gy 52 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Conway’s Law Co Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An
  13. DevOps – это про взаимоотношения → Никто не делает продукт

    для одного клиента → Никто не должен строить процесс вокруг {dev,ops,dba,etc} → Работать вместе над всем циклом создания продукта → Обучать не только "своих" → Не строить стен и колодцев
  14. Принципы SOA 1. Standardized service contract 2. Loose coupling 3.

    Encapsulation 4. Reusability 5. Autonomy 6. Statelessness 7. Discoverability 70
  15. Принципы SOA 1. Standardized service contract 2. Loose coupling 3.

    Encapsulation 4. Reusability 5. Autonomy 6. Statelessness 7. Discoverability 71
  16. In short, the microservice architectural style is an approach to

    developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. -- James Lewis and Martin Fowler Что такое микросервисы? 75
  17. In short, the microservice architectural style is an approach to

    developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. -- James Lewis and Martin Fowler Что такое микросервисы? 76
  18. Размер имеет значение? → Method/Function = Microservice? → 10-300 LOC

    = Microservice? → 1 week = Microservice? → 1 developer = Microservice? 77
  19. Размер не имеет значения* → Single Responsibility → One capability

    → Bounded context “In your organization, you should be thinking not in terms of data that is shared, but about the capabilities those contexts provide the rest of the domain.” – Sam Newman, Building Microservices *до разумных пределов конечно 78
  20. In short, the microservice architectural style is an approach to

    developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. -- James Lewis and Martin Fowler Что такое микросервисы? 80
  21. In short, the microservice architectural style is an approach to

    developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. -- James Lewis and Martin Fowler Что такое микросервисы? 82
  22. In short, the microservice architectural style is an approach to

    developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. -- James Lewis and Martin Fowler Что такое микросервисы? 84
  23. Принцип LSD → L языков программирования → S среднее число

    фреймворков на язык → D типов источников данных complexity = L * S * D 92
  24. 93 ? → Spring Boot/Spring Cloud → Ratpack → Dropwizard

    → Vert.x → Restlet → Spark → KumuluzEE
  25. 94 Выбирайте то, что больше нравится / в чем есть

    экспертиза → Spring Boot/Spring Cloud → Ratpack → Dropwizard → Vert.x → Restlet → Spark → KumuluzEE
  26. 95

  27. 96

  28. Немного LSD для вас → три языка программирования → два

    в среднем фреймворка на язык → семь типов источников данных ⇢ legacy WS, mongo db ⇢ OLTP, OLAP ⇢ elasticsearch, neo4j ⇢ Мишкина база %) 97
  29. java Ja spring boot Sb 102 DDD Dd SOA So

    LSD principle Ls Conway’s Law Co
  30. 103

  31. ~home > lazybones create api 0.0.1 rent-service Creating project from

    template api 0.0.1 in 'rent-service' Define value for 'group' [ru.gdg.rostov]: 117
  32. ~home > lazybones create api 0.0.1 rent-service Creating project from

    template api 0.0.1 in 'rent-service' Define value for 'group' [ru.gdg.rostov]: Define value for 'version' [0.0.1]: 118
  33. ~home > lazybones create api 0.0.1 rent-service Creating project from

    template api 0.0.1 in 'rent-service' Define value for 'group' [ru.gdg.rostov]: Define value for 'version' [0.0.1]: srv1 ├──srv2 └──srv3 logging sleuth Define value for 'dependencies' [logging,sleuth]: 119
  34. ~home > lazybones create api 0.0.1 rent-service Creating project from

    template api 0.0.1 in 'rent-service' Define value for 'group' [ru.gdg.rostov]: Define value for 'version' [0.0.1]: srv1 ├──srv2 └──srv3 logging sleuth Define value for 'dependencies' [logging,sleuth]: Project created for rent-service! 120
  35. 121

  36. lazybones Lz yeoman Yo start.spring.io Ss java Ja spring boot

    Sb groovy Gy 122 LSD principle Ls DDD Dd SOA So Conway’s Law Co
  37. TServerTransport serverTransport = new TServerSocket( new InetSocketAddress(InetAddress.getLocalHost(), port)); TProcessor processor

    = new TInsuranceService.Processor<>( //business value here ); server = new TSimpleServer( new TServer.Args(serverTransport).processor(processor)); server.serve(); 124
  38. TSocket transport = new TSocket(host, port); transport.open(); TBinaryProtocol tBinaryProtocol =

    new TBinaryProtocol(transport); TInsuranceService.Client client = new TInsuranceService.Client(tBinaryProtocol); perform(client); //business value here transport.close(); 125
  39. @Getter // generate getters @Setter // generate setters @Aspect //

    we are an aspect @ToString // generate toString() @EnableWs // SOAP is so enterprisy, we definitely need it @Endpoint // Seriously, just read above @EnableWebMvc // we want MVC @EnableCaching // and we want to cache stuff @Configuration // this class can configure itself @RestController // we want some REST @XmlRootElement // this component is marshallable @EnableWebSocket // we want web socket, it's so new-generation @RedisHash("cat") // this class is an entity saved in redis @EnableScheduling // we want scheduled tasks @EnableWebSecurity // and some built-in security @NoArgsConstructor // generate no args constructor @ContextConfiguration // we want context configuration for unit testing @SpringBootApplication // this is a Sprint Boot application @Accessors(chain = true) // getters/setters are chained (ala jQuery) @EnableAspectJAutoProxy // we want AspectJ auto proxy @EnableAutoConfiguration // and auto configuration @EnableRedisRepositories // since it is an entity we want to enable spring data repositories for redis @EnableWebSocketMessageBroker // we want a broker for web socket messages 132 Fluent annotations
  40. @Getter // generate getters @Setter // generate setters @Aspect //

    we are an aspect @ToString // generate toString() @EnableWs // SOAP is so enterprisy, we definitely need it @Endpoint // Seriously, just read above @EnableWebMvc // we want MVC @EnableCaching // and we want to cache stuff @Configuration // this class can configure itself @RestController // we want some REST @XmlRootElement // this component is marshallable @EnableWebSocket // we want web socket, it's so new-generation @RedisHash("cat") // this class is an entity saved in redis @EnableScheduling // we want scheduled tasks @EnableWebSecurity // and some built-in security @NoArgsConstructor // generate no args constructor @ContextConfiguration // we want context configuration for unit testing @SpringBootApplication // this is a Sprint Boot application @Accessors(chain = true) // getters/setters are chained (ala jQuery) @EnableAspectJAutoProxy // we want AspectJ auto proxy @EnableAutoConfiguration // and auto configuration @EnableRedisRepositories // since it is an entity we want to enable spring data repositories for redis @EnableWebSocketMessageBroker // we want a broker for web socket messages 133 Fluent annotations
  41. Not smart = This is main documentation This document describes

    how to be the most fundamental and important document in the world of documents ... COPY-PASTE documentation from another document ... 136
  42. Not so smart = This is main documentation This document

    describes how to be the most fundamental and important document in the world of documents include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[] include::../other.adoc[] include::/home/tolkv/git/docs-0/superdoc.adoc[] 137
  43. Really smart = This is main documentation This document describes

    how to be the most fundamental and important document in the world of documents include::https://raw.github.com/asciidoctor/asciidoctor/master/Gemfile[] include::gradle://gradle-advanced:service-with-deps:1.0/deps.adoc[] include::gradle://:service/doc.adoc[] 138
  44. Payment Service[jar,doc] Insurance Service [jar,doc] One Point of View [UberDoc.zip]

    Rent Service[jar,doc] Other Service [jar,doc] Агрегация информации 139
  45. Парадокс централизации Чтобы эффективно разрабатывать распределённые приложения, нам нужны очень

    хорошие централизованные библиотеки и инструменты Например: логирование, health-checking, метрики, обработка типовых ошибок, автодокументирование 140
  46. Парадокс централизации Чтобы эффективно разрабатывать распределённые приложения, нам нужны очень

    хорошие централизованные библиотеки и инструменты Но: не выносите бизнес-логику или доменные объекты! Не размывайте бизнес-контекст вашего API 141
  47. lazybones Lz yoman Yo start.spring.io Ss java Ja thrift Th

    spring boot Sb gradle Gr asciidoctor Ad groovy Gy 142 Centralization paradox Cp LSD principle Ls DDD Dd Smart Docs Sd Smart Libs Sl SOA So Conway’s Law Co
  48. 154

  49. lazybones Lz yoman Yo start.spring.io Ss java Ja thrift Th

    spring boot Sb gradle Gr asciidoctor Ad groovy Gy 158 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Conway`s law Co Smart Docs Sd Smart Libs Sl SOA So
  50. 169

  51. 173

  52. 180

  53. lazybones Lz yoman Yo start.spring.io Ss python Py java Ja

    spring boot Sb gradle Gr asciidoctor Ad docker Dr mesos Ms marathon Ma chronos Ch aurora Au Kubernetes Kb groovy Gy 183 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd SAGAS Sa Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An thrift Th Artifactory Ar
  54. update template → services.location kill -s HUP nginx 186 Остаётся

    статическая привязка ресурсов
  55. 188 Service Client Registry-aware HTTP Client Service Registry Service Instance

    1 Service Instance N Service Instance ... Load balance request Client side discovery
  56. 189 Service Client Service Registry Service Instance 1 Service Instance

    N Service Instance ... Load balance request Router/Proxy Server side discovery
  57. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk groovy Gy 190 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd SAGAS Sa Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An
  58. 192

  59. 205

  60. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx groovy Gy 206 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An Conway’s Law Co
  61. 212 Rent Service Payment Service No TraceId No SpanId TraceId

    = X SpanId = A TraceId = X SpanId = B TraceId = X SpanId = C
  62. 213 Rent Service Payment Service Blockchain Service No TraceId No

    SpanId TraceId = X SpanId = A TraceId = X SpanId = B TraceId = X SpanId = C TraceId = X SpanId = D TraceId = X SpanId = D TraceId = X SpanId = F
  63. 214 Rent Service Payment Service Security Service Blockchain Service No

    TraceId No SpanId TraceId = X SpanId = A TraceId = X SpanId = B TraceId = X SpanId = C TraceId = X SpanId = D TraceId = X SpanId = D TraceId = X SpanId = E TraceId = X SpanId = E TraceId = X SpanId = F TraceId = X SpanId = G
  64. 215 Rent Service Payment Service Security Service Blockchain Service No

    TraceId No SpanId TraceId = X SpanId = A TraceId = X SpanId = B TraceId = X SpanId = B TraceId = X SpanId = C TraceId = X SpanId = C TraceId = X SpanId = D TraceId = X SpanId = D TraceId = X SpanId = E TraceId = X SpanId = E TraceId = X SpanId = F TraceId = X SpanId = G
  65. 216 Rent Service Payment Service Security Service Blockchain Service TraceId

    = X SpanId = A No TraceId No SpanId TraceId = X SpanId = A TraceId = X SpanId = A TraceId = X SpanId = B TraceId = X SpanId = B TraceId = X SpanId = C TraceId = X SpanId = C TraceId = X SpanId = D TraceId = X SpanId = D TraceId = X SpanId = E TraceId = X SpanId = E TraceId = X SpanId = F TraceId = X SpanId = G
  66. 217

  67. 218

  68. 221 Rent Service Payment Service SpanId = B Client Send

    SpanId = B Server Received TraceId = X SpanId = A TraceId = X SpanId = C
  69. 222 Rent Service Payment Service SpanId = B Client Send

    SpanId = B Server Received SpanId = B Server Send TraceId = X SpanId = A TraceId = X SpanId = C
  70. 223 Rent Service Payment Service SpanId = B Client Send

    SpanId = B Server Received SpanId = B Client Received SpanId = B Server Send TraceId = X SpanId = A TraceId = X SpanId = C
  71. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx sleuth Sl zipkin Zn groovy Gy 224 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An Conway’s Law Co
  72. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx sleuth Sl zipkin Zn groovy Gy 225 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An Conway’s Law Co
  73. yoman Yo start.spring.io Ss python Py lazybones Lz java Ja

    spring boot Sb gradle Gr asciidoctor Ad thrift Th docker Dr mesos Ms marathon Ma chronos Ch aurora Au Artifactory Ar Kubernetes Kb eureka Eu consul Cl etcd Ed zookeeper Zk hystrix Hx sleuth Sl zipkin Zn groovy Gy 226 Data Isolation Di Centralization paradox Cp LSD principle Ls DDD Dd Smart Docs Sd Dynamic Sharing Ds Smart Libs Sl SOA So ansible An Conway’s Law Co ?
  74. Выводы 228 Микросервисы – это просто DevOps – это просто

    Микросервисы – это сложно DevOps – это сложно
  75. 1. Не пишите в резюме DevOps Инженер 2. SOA принципы

    живы 3. Принцип LSD 4. Изоляция данных делает жизнь приятнее 5. Парадокс централизации 6. Планируй ресурсы динамически 7. Любите и поддерживайте друг друга (и не важно что такое DevOps) Придерживайтесь принципов 229
  76. DevOps – образ мышления команды, при котором все осознают что

    нужно для предоставления сервиса https://twitter.com/bsideup/status/906154114991652864