O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

микроСЕРВИСЫ: огонь, вода и медные трубы

5.594 visualizações

Publicada em

Микросервисы, кто-то только слышал о них, кто-то пытался делать, кто-то уже использует в продакшене. Идеи, заложенные в концепцию микросервисов, не новы и основные постулаты уже звучали раньше. Так почему же в последнее время мы всё чаще слышим о микросервисах? Что такое микросервисы для нас и чем они отличаются от старого доброго подхода SOA? Как теперь разрабатывать enterprise-приложения с микросервисным подходом на нашем любимом языке программирования Java?

На эти и некоторые другие вопросы постараемся ответить во время встречи. Наши гости, Кирилл Толкачёв и Александр Тарасов, в режиме live coding попытаются создать небольшой стартап, попутно использовав новомодные подходы и инструменты.

На пути к релизу стартапа будут затронуты основные проблемы выбранных подходов в целом и технологий в частности:


Микросервис — что это, для чего и как с этим дальше жить. Где теория брат? ;)
На чём писать API: REST или RPC, и почему Thrift имеет право на жизнь в эпоху тотального распространения JSON-а. Упрощай и превозмогай с помощью Spring boot starter;
Какой стек выбрать для разработки, что выбрали мы и почему. Небольшое сравнение легковесных и не очень java фреймворков а так же сопутствующих инструментов;
Способы упаковки, дистрибуции и разворачивания микросервисов, как Spring Boot и Docker помогают нам в решении этих непростых для разработчика проблемах;
Как микросервисам найти друг друга, как готовить Spring Cloud и как обойти существующие проблемы и ограничения. Не доверяйте технологиям, доверяйте только себе;
API Gateway. Предохраняй и сохраняй свои микросервисы.

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

Publicada em: Software

микроСЕРВИСЫ: огонь, вода и медные трубы

  1. 1. микроСЕРВИСЫ огонь, вода, медные трубы
  2. 2. @tolkv 2
  3. 3. @aatarasoff 3
  4. 4. микроСЕРВИСЫ огонь, вода, медные трубы
  5. 5. DISCLAIMER Наше мнение может не совпадать с официальной позицией банка, начальника, коллег или других специалистов. Мы не претендуем на роль последней инстанции в вопросах использования той или иной технологии. Все представленные решения вы можете использовать на свой страх и риск. За все ваши действия ответственность несёте только вы сами. 5
  6. 6. Agenda 1. Past 2. Present 3. Future 6
  7. 7. Agenda 1. Past 2. Present 3. Future 7
  8. 8. 8
  9. 9. 9
  10. 10. Ball of Mud 10
  11. 11. 11
  12. 12. SOA Principles ● standardized service contract ● loose coupling ● encapsulation ● reusability ● autonomy ● statelessness ● discoverability 12
  13. 13. 13
  14. 14. UDDI ● Никто не говорит и никто не знает ;) ● Но все же. Кто знает что это и зачем это? ● А кто внедрял ? :) 14
  15. 15. Прекрасная технология 15
  16. 16. Как это выглядит? “Тогда” 16
  17. 17. Как это выглядит? “Сейчас” Oracle SOA Governance 17
  18. 18. Как это выглядит? “Сейчас” 18 @UDDIService( businessKey="uddi:myBusinessKey", serviceKey="uddi:myServiceKey", description = "Hello World test service") @UDDIServiceBinding( bindingKey="uddi:myServiceBindingKey", description="WSDL endpoint for the hello${department} Service. This service is used for testing the jUDDI annotation functionality", accessPointType="wsdlDeployment", accessPoint="http://localhost:8080/juddiv3-samples/services/helloworld?wsdl")
  19. 19. Okay, перейдем по ссылке 19
  20. 20. Никто не хочет UDDI 20
  21. 21. <S:Envelope> <S:Header> ... <Security S:actor="null" S:mustUnderstand="..."> ... </Security> ... </S:Header> ... </S:Envelope> …а реализация врозь Не все реализации клиентов могут так сделать :( 21
  22. 22. 22
  23. 23. Никто не любит “некрасивые” технологии поэтому они умирают
  24. 24. А что с людьми? ● Что волновало людей тогда? ● Их волновало то, как не использовать технологию ● Сейчас эта книга до сих пор продается. 20$ Ничто не не вечно :) 2004 год 24
  25. 25. А что ещё? 25
  26. 26. Выводы 26
  27. 27. Agenda 1. Past 2. Present 3. Future 27
  28. 28. 28 Про тренды
  29. 29. 29
  30. 30. 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 Что такое микросервисы? 30
  31. 31. Определение 1. Набор маленьких сервисов a. насколько маленьких? 31
  32. 32. Размер имеет значение? ● Method/Function = Microservice? ● 10-300 LOC = Microservice? ● 1 week = Microservice? ● 1 developer = Microservice? 32
  33. 33. Размер не имеет значения* ● 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 *до разумных пределов конечно 33
  34. 34. Domain-Driven Development 34
  35. 35. Пример Микросервис платежей - принимает платеж и проводит его - но платежей много типов - а если внешние системы? - а если каждый тип разный для разных групп пользователей? 35
  36. 36. Определение 1. Набор маленьких сервисов a. насколько маленьких? 2. Изоляция и независимый деплой 36
  37. 37. Process segregation 37
  38. 38. Независимый деплой build test 38
  39. 39. Trade-off - name: copy nginx config sudo: yes template: src: "nginx.conf" dest: "{{nginx_config_dir}}/project1.conf" tags: copy_nginx_config - name: copy nginx config sudo: yes template: src: "nginx.conf" dest: "{{nginx_config_dir}}/project2.conf" tags: copy_nginx_config server { server_name {{ hostname }}.superproject; } server { server_name {{ hostname }}.superproject; } 39
  40. 40. Failed 40
  41. 41. Определение 1. Набор маленьких сервисов a. насколько маленьких? 2. Изоляция и независимый деплой 3. Децентрализация 41
  42. 42. Language/technology segregation 42
  43. 43. Data segregation 43
  44. 44. Team segregation 44
  45. 45. Trade-off - N языков программирования - M в среднем фреймворков на язык - L типов источников данных complexity = N * M * L 45
  46. 46. Пример - три языка программирования - два в среднем фреймворка на язык - семь типов источников данных - legacy WS - mongo db - реляционная БД (oracle) - хранимые процедуры - JDBC templates/ORM - elasticsearch - neo4j/orient db - мишкина база complexity = 3 * 2 * 7 = 42 (!) 46
  47. 47. 42!!! 47
  48. 48. Ключевые характеристики ● Domain-Driven Design ● Single responsibility ● Independent DURS ○ deploy, update, replace, scale ● Lightweight contract and communication ● Segregation ○ people ○ technologies 48
  49. 49. Ключевое приемущество Вывод: микросервисы ради того, чтобы не впихивать невпихуемое 49
  50. 50. Так на чём писать микросервисы? 50
  51. 51. min (N * M * L) -> max (L) 51 Закон трёх букв
  52. 52. А что есть в мире Java? ● Java EE ● Spring Boot/Spring Cloud ● Ratpack ● Dropwizard ● Vert.x ● Restlet ● Spark 52
  53. 53. Почему Spring Boot/Spring Cloud? 53
  54. 54. Почему Spring Boot/Spring Cloud? ● Развитая экосистема ● Неограниченные возможности кастомизации и интеграции новых фреймворков ● Не только REST/HTTP ● Великолепные возможности мониторинга 54
  55. 55. А теперь попробуем 55
  56. 56. Demo
  57. 57. Demo -> Deploy Time
  58. 58. Service Discovery 60
  59. 59. 61
  60. 60. 62
  61. 61. Service Registry 63
  62. 62. Netflix Eureka 64 ● Как работает heartbeat? ● Как работает healthcheck? eureka.instance.leaseRenewalIntervalInSeconds: 3 eureka.instance.leaseExpirationDurationInSeconds: 3
  63. 63. Boo 65
  64. 64. Consul + Docker https://github.com/docker/docker/issues/8795 docker run --net=host --privileged --rm cap10morgan/conntrack production way! :) 66
  65. 65. Boo 67
  66. 66. Demo -> Time to Discover
  67. 67. 69
  68. 68. Где мой порт? 70
  69. 69. 71
  70. 70. Какие есть варианты? ● Nginx/Haproxy + consul template ● Haproxy + bamboo (need marathon) ● Netflix Zuul (Java way!!!) ● Custom Servlet <- все с этого начинают! 72
  71. 71. Nginx + consul_template {{range services}} upstream {{.Name}} { least_conn; {{range service .Name}} server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server localhost:60000;{{end}} } {{end}} server { server_name localhost; {{range services}} location /{{.Name}}/ { proxy_pass http://{{.Name}}/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } {{end}} } 73
  72. 72. Nginx + consul_template upstream hippoapi { least_conn; server server1:8080 max_fails=3 fail_timeout=60 weight=1; server server1:8081 max_fails=3 fail_timeout=60 weight=1; server server1:8082 max_fails=3 fail_timeout=60 weight=1; } server { server_name localhost; location /hippoapi/ { proxy_pass http://hippoapi/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } 74
  73. 73. Bamboo + haproxy + marathon { "Marathon": { "Endpoint": "{{bamboo_marathon_endpoint}}", "UseEventStream": true }, "Bamboo": { "Endpoint": "{{bamboo_endpoint}}", "Zookeeper": { "Host": "{{bamboo_zk_hosts}}", "Path": "/marathon-haproxy/state", "ReportingDelay": 5 }}, "HAProxy": { "TemplatePath": "config/haproxy_template.cfg", "OutputPath": "/etc/haproxy/haproxy.cfg", "ReloadCommand": "haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -D -sf $(cat /var/run/haproxy.pid)" }, "StatsD": { "Enabled": false, "Host": "localhost:8125", "Prefix": "{{bamboo_statsd_prefix}}" } } Работает при наличии mesos+marathon :)75
  74. 74. Netflix Zuul 76
  75. 75. Netflix Zuul 77 POST /myservice?param1=1&param2=2&param3=3 BODY { “order_id”: 1234 } Что тут может быть не так? if(request.getMethod().equalsIgnoreCase("POST") && request.getQueryString() !=null) { StringTokenizer st = new StringTokenizer(this.request.getQueryString(), "&"); while (st.hasMoreTokens()) { String s = st.nextToken(); int i = s.indexOf("="); if (i > 0 && s.length() > i + 1) { String name = s.substring(0, i); builder.remove(name); } } } POST /myservice?param1=1&param2=2&param3=3 Окау, добавим свой Zull pre filter
  76. 76. Boo 78
  77. 77. Demo -> Gateway Time
  78. 78. Demo -> FBI Time
  79. 79. 82
  80. 80. +-------------------------------------------+ | Server | | (single-threaded, event-driven etc) | +-------------------------------------------+ | Processor | | (compiler generated) | +-------------------------------------------+ | Protocol | | (JSON, compact, binary etc) | +-------------------------------------------+ | Transport | | (raw TCP, HTTP etc) | +-------------------------------------------+ ● Просто* ● Гибко* ● Безопасно* *по нашему скромному мнению 83 Apache Thrift
  81. 81. namespace java info.developerblog.services struct TUser { #это наш любимый пользователь 1: required i64 userId #а это его идентификатор } struct TFbiResponse { #результат вызова сервиса 1: required string lastFink #дата последнего стука ( да, это строка :) ) } service TFbiService { #а это наш сервис TFbiResponse fink( #метод “постучи в ФБР” 1: required TUser user, 2: required i32 hippoCount, 3: required i32 fee ) } 84
  82. 82. Demo -> RPC Time
  83. 83. Безопасность 86
  84. 84. Защита на уровне сервиса 87
  85. 85. Защита на уровне сервиса #2 88
  86. 86. Опять этот gateway 89
  87. 87. REST/HTTP Authorization: Bearer <TOKEN> ClientID: <ID> 90
  88. 88. Thrift API Gateway service InternalTestService { SomeReturnData getSomeData( 1: UserData userData, 2: RequestData requestData ) throws (1: SomeException e); } 91
  89. 89. Thrift API Gateway service InternalTestService { SomeReturnData getSomeData( 1: UserData userData, 2: RequestData requestData ) throws (1: SomeException e); } service ExternalTestService { SomeReturnData getSomeData( 1: AuthToken authData, 2: RequestData requestData ) throws (1: SomeException e, 99: UnauthorizedException ue); } 92
  90. 90. int startPosition = findStartPosition(protocol); TBase userData = exchanger.process( extractAuthToken(protocol,exchanger.createEmptyAuthToken()) ); int endPosition = findEndPosition(protocol); return mergeArrays( getSkippedPart(protocol, startPosition), serializeUserData(protocolFactory, userData), getAfterTokenPart(protocol, endPosition, thriftBody.length) ); 93
  91. 91. 94
  92. 92. Springway @SpringBootApplication @EnableThriftGateway public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 95
  93. 93. Demo -> Thrift the Ripper
  94. 94. Основные возможности ● Fallbacks ● Gracefull degradation ● Concurrency Execution ● Request Collapsing ● Caching ● Metrics polling 99
  95. 95. Demo -> Hystrix the Saviour
  96. 96. Boo 102
  97. 97. Типичная микросервисная архитектура 103
  98. 98. 104
  99. 99. А что в этих ваших интернетах?
  100. 100. И чё? Гибкость Поддерживаемость ● Микросервисы это непросто ○ orchestration ○ discovery ○ fallback Скорость
  101. 101. И чё? ● В Spring-е нет: ○ @ThriftHandler ○ @ThriftClient ○ @EnableThriftGateway ● Consul Cloud -> 1.0.0.M3
  102. 102. Помните SOAP ? Микросервисы тоже не бесплатный обед
  103. 103. Agenda 1. Past 2. Present 3. Future 109
  104. 104. 110
  105. 105. Operational requirements ● Orchestration (DURS) ● Service discovery ● Monitoring ● Resiliency ● Culture 111
  106. 106. 112 https://xebialabs.com/periodic-table-of-devops-tools/
  107. 107. Docker etc. 113
  108. 108. Docker evolution 114
  109. 109. Эра PAAS ● Mesos + Marathon framework ● Kubernetes ● Cloud foundry ● Other.. ○ Heroku ○ Tutum ○ Mesosphere DCOS ○ ... 115
  110. 110. 116 Network
  111. 111. HTTP/2 ● HTTP/2 Client (Java SE) ○ http://openjdk.java.net/jeps/110 ● Servlet 4.0 (HTTP/2) ○ https://www.jcp.org/en/jsr/detail?id=369 117
  112. 112. grpc.io ● http/2 ● только async / netty ● protobuf 3 118
  113. 113. Hello grpc world! service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } public static interface Greeter { public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver); } 119
  114. 114. Zuul 2.0 ● websocket support ● migrate to netty 120
  115. 115. Docker Network http://developerblog.info/2015/11/16/splendors-and-miseries-of-docker-network/ ● синтаксический сахар ○ docker network create --driver bridge mynet ● пока проблемы с multi-host сетями ○ несколько сетевых интерфейсов ○ рудиментарный DNS ○ плагины не работают/не на 100% 121
  116. 116. Docker Network + Spring Consul Cloud https://github.com/spring-cloud/spring-cloud-consul/issues/115 public static InetAddress getFirstNonLoopbackAddress() { /// for (Enumeration<NetworkInterface> enumNic = NetworkInterface.getNetworkInterfaces(); enumNic.hasMoreElements(); ) { /// } /// } eth0 - overlay eth1 - bridge 122
  117. 117. Ooops 123
  118. 118. Java SE 9 ● Jigsaw ○ http://openjdk.java.net/jeps/200 ● Java Reactive JEP 266 (не в 9ке видимо) ○ http://openjdk.java.net/jeps/266 124
  119. 119. Eureka 2.0 ● server group ● guaranted instance id uniqueness ● fast and simple replication ● write cluster/read cluster 125
  120. 120. Event Sourcing / CQRS / SAGA http://gotocon.com/dl/goto-chicago-2015/slides/CaitieMcCaffrey_ApplyingTheSagaPattern.pdf 126
  121. 121. 127
  122. 122. 128
  123. 123. Saga guarantee ● T1 -> T2 -> T3 -> … -> Tn ● T1 -> T2 -> … Tn -> Cn … -> C2 -> C1 129
  124. 124. 130
  125. 125. 131
  126. 126. 132
  127. 127. 133 DDDD (4D)
  128. 128. Выводы. Микросервисы... 134 1. должны работать как единая система для предоставления законченной функциональности 2. дают вам опции, как тестировать и где тестировать ваш код 3. дают возможность закладывать нужные оси вариативности в вашу архитектуру (да да, подготавливаемся вставлять костыли на любых уровнях!) 4. предполагают, что вы готовы вникать в вещи, не связанные непосредственно с кодом продукта (а это 80% времени) 5. принесут вам радость, только если налажен CD, иначе только боль
  129. 129. 135
  130. 130. Ссылки Оригинальное исполнение https://github.com/bsideup/thrift-spring-boot-starter Крутой плагин для Gradle https://github.com/bsideup/GradleThrift Forward2Docker https://github.com/bsideup/forward2docker/releases 136 @bsideup
  131. 131. Code. Better. Together. Spring Thrift Client (Proof of Concept) https://github.com/aatarasoff/spring-thrift-starter Thrift API Gateway (Proof of Concept) https://github.com/aatarasoff/thrift-api-gateway-core https://github.com/aatarasoff/spring-thrift-api-gateway Примеры сегодняшнего дня https://github.com/lavcraft/jug-samples 137
  132. 132. Высокие теории Sam Newman “Building Microservices” Martin Fowler “Microservice TradeOff” “Microservices” “The Twelwe-Factor App” http://12factor.net Hystrix: managing failures in distributed systems - Tomasz Nurkiewicz https: //www.youtube.com/watch?v=JadVts_prtA 138
  133. 133. Спасибо! Ваши вопросы @tolkv @aatarasoff 139

×