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

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

Embed Size (px)

Citation preview

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

микроСЕРВИСЫ

огонь, вода, медные трубы

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

@tolkv

2

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

@aatarasoff

3

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

микроСЕРВИСЫ

огонь, вода, медные трубы

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

DISCLAIMER

Наше мнение может не совпадать с официальной позицией банка, начальника, коллег или других специалистов. Мы не претендуем на роль последней инстанции в вопросах использования той или иной технологии. Все представленные решения вы можете использовать на свой страх и риск. За все ваши действия ответственность несёте только вы сами.

5

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

Agenda

1. Past

2. Present

3. Future

6

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

Agenda

1. Past

2. Present

3. Future

7

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

8

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

9

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

Ball of Mud

10

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

11

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

SOA Principles

● standardized service contract

● loose coupling

● encapsulation

● reusability

● autonomy

● statelessness

● discoverability

12

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

13

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

UDDI

● Никто не говорит и никто не знает ;)

● Но все же. Кто знает что это и зачем это?

● А кто внедрял ? :)

14

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

Прекрасная технология

15

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

Как это выглядит? “Тогда”

16

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

Как это выглядит? “Сейчас”

Oracle SOA Governance

17

Page 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")

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

Okay, перейдем по ссылке

19

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

Никто не хочет UDDI

20

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

<S:Envelope> <S:Header> ... <Security S:actor="null" S:mustUnderstand="..."> ... </Security> ... </S:Header> ...</S:Envelope>

…а реализация врозь

Не все реализации клиентов могут так сделать :(

21

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

22

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

Никто не любит “некрасивые” технологии

поэтому они умирают

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

А что с людьми?● Что волновало людей тогда?● Их волновало то, как не использовать

технологию● Сейчас эта книга до сих пор продается. 20$

Ничто не не вечно :)

2004 год

24

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

А что ещё?● REST (RESTful) services

○ operations -> resources

● JSON-Pure

○ https://mmikowski.github.io/json-pure/

● modern RPC

○ Apache Thrift

○ grpc

25

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

Выводы

26

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

Agenda

1. Past

2. Present

3. Future

27

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

28

Про тренды

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

29

Page 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

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

Определение

1. Набор маленьких сервисов

a. насколько маленьких?

31

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

Размер имеет значение?

● Method/Function = Microservice?

● 10-300 LOC = Microservice?

● 1 week = Microservice?

● 1 developer = Microservice?

32

Page 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

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

Domain-Driven Development

34

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

Пример

Микросервис платежей

- принимает платеж и проводит его

- но платежей много типов

- а если внешние системы?

- а если каждый тип разный для разных

групп пользователей?35

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

Определение

1. Набор маленьких сервисов

a. насколько маленьких?

2. Изоляция и независимый деплой

36

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

Process segregation

37

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

Независимый деплой

build test38

Page 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

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

Failed

40

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

Определение

1. Набор маленьких сервисов

a. насколько маленьких?

2. Изоляция и независимый деплой

3. Децентрализация

41

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

Language/technology segregation

42

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

Data segregation

43

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

Team segregation

44

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

Trade-off

- N языков программирования- M в среднем фреймворков на язык- L типов источников данных

complexity = N * M * L

45

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

Пример- три языка программирования- два в среднем фреймворка на язык- семь типов источников данных

- legacy WS- mongo db- реляционная БД (oracle)

- хранимые процедуры- JDBC templates/ORM

- elasticsearch- neo4j/orient db- мишкина база

complexity = 3 * 2 * 7 = 42 (!)46

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

42!!!

47

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

Ключевые характеристики

● Domain-Driven Design

● Single responsibility

● Independent DURS

○ deploy, update, replace, scale

● Lightweight contract and communication

● Segregation

○ people

○ technologies

48

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

Ключевое приемущество

Вывод: микросервисы ради того, чтобы не

впихивать невпихуемое

49

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

Так на чём писать микросервисы?

50

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

min (N * M * L) -> max (L)

51

Закон трёх букв

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

А что есть в мире Java?

● Java EE

● Spring Boot/Spring Cloud

● Ratpack

● Dropwizard

● Vert.x

● Restlet

● Spark52

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

Почему Spring Boot/Spring Cloud?

53

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

Почему Spring Boot/Spring Cloud?

● Развитая экосистема

● Неограниченные возможности кастомизации и

интеграции новых фреймворков

● Не только REST/HTTP

● Великолепные возможности мониторинга

54

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

А теперь попробуем

55

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

Demo

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

Demo -> Deploy Time

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

Service Discovery

60

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

61

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

62

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

Service Registry

63

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

Netflix Eureka

64

● Как работает heartbeat?● Как работает healthcheck?

eureka.instance.leaseRenewalIntervalInSeconds: 3eureka.instance.leaseExpirationDurationInSeconds: 3

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

Boo

65

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

Consul + Docker

https://github.com/docker/docker/issues/8795

docker run --net=host \ --privileged --rm \

cap10morgan/conntrack

production way! :)

66

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

Boo

67

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

Demo -> Time to Discover

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

69

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

Где мой порт?

70

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

71

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

Какие есть варианты?

● Nginx/Haproxy + consul template

● Haproxy + bamboo (need marathon)

● Netflix Zuul (Java way!!!)

● Custom Servlet <- все с этого начинают!

72

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

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

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

Nginx + consul_templateupstream 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

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

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

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

Netflix Zuul

76

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

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

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

Boo

78

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

Demo -> Gateway Time

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

Demo -> FBI Time

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

82

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

+-------------------------------------------+

| Server |

| (single-threaded, event-driven etc) |

+-------------------------------------------+

| Processor |

| (compiler generated) |

+-------------------------------------------+

| Protocol |

| (JSON, compact, binary etc) |

+-------------------------------------------+

| Transport |

| (raw TCP, HTTP etc) |

+-------------------------------------------+

● Просто*

● Гибко*

● Безопасно*

*по нашему скромному мнению83

Apache Thrift

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

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

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

Demo -> RPC Time

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

Безопасность

86

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

Защита на уровне сервиса

87

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

Защита на уровне сервиса #2

88

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

Опять этот gateway

89

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

REST/HTTP

Authorization: Bearer <TOKEN>

ClientID: <ID>

90

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

Thrift API Gateway

service InternalTestService {

SomeReturnData getSomeData(

1: UserData userData,

2: RequestData requestData

) throws (1: SomeException e);

}

91

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

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

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

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

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

94

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

Springway

@SpringBootApplication@EnableThriftGatewaypublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

95

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

Demo -> Thrift the Ripper

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

Основные возможности

● Fallbacks

● Gracefull degradation

● Concurrency Execution

● Request Collapsing

● Caching

● Metrics polling99

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

Demo -> Hystrix the Saviour

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

Boo

102

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

Типичная микросервисная архитектура

103

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

104

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

А что в этих ваших интернетах?

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

И чё?

Гибкость

Поддерживаемость

● Микросервисы это непросто

○ orchestration

○ discovery

○ fallbackСкорость

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

И чё?

● В Spring-е нет:

○ @ThriftHandler

○ @ThriftClient

○ @EnableThriftGateway

● Consul Cloud -> 1.0.0.M3

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

Помните SOAP ?

Микросервисы тоже не бесплатный обед

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

Agenda

1. Past

2. Present

3. Future

109

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

110

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

Operational requirements

● Orchestration (DURS)

● Service discovery

● Monitoring

● Resiliency

● Culture

111

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

112

https://xebialabs.com/periodic-table-of-devops-tools/

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

Docker etc.

113

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

Docker evolution

114

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

Эра PAAS

● Mesos + Marathon framework

● Kubernetes

● Cloud foundry

● Other..

○ Heroku

○ Tutum

○ Mesosphere DCOS

○ ...115

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

116

Network

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

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

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

grpc.io

● http/2

● только async / netty

● protobuf 3

118

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

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

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

Zuul 2.0

● websocket support

● migrate to netty

120

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

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

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

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 - bridge122

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

Ooops

123

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

Java SE 9

● Jigsaw

○ http://openjdk.java.net/jeps/200

● Java Reactive JEP 266 (не в 9ке видимо)

○ http://openjdk.java.net/jeps/266

124

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

Eureka 2.0

● server group

● guaranted instance id uniqueness

● fast and simple replication

● write cluster/read cluster

125

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

Event Sourcing / CQRS / SAGA

http://gotocon.com/dl/goto-chicago-2015/slides/CaitieMcCaffrey_ApplyingTheSagaPattern.pdf

126

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

127

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

128

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

Saga guarantee

● T1 -> T2 -> T3 -> … -> Tn

● T1 -> T2 -> … Tn -> Cn … -> C2 -> C1

129

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

130

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

131

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

132

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

133

DDDD (4D)

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

Выводы. Микросервисы...

134

1. должны работать как единая система для предоставления законченной функциональности

2. дают вам опции, как тестировать и где тестировать ваш код

3. дают возможность закладывать нужные оси вариативности в вашу архитектуру (да да, подготавливаемся вставлять костыли на любых уровнях!)

4. предполагают, что вы готовы вникать в вещи, не связанные непосредственно с кодом продукта (а это 80% времени)

5. принесут вам радость, только если налажен CD, иначе только боль

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

135

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

СсылкиОригинальное исполнениеhttps://github.com/bsideup/thrift-spring-boot-starter

Крутой плагин для Gradlehttps://github.com/bsideup/GradleThrift

Forward2Dockerhttps://github.com/bsideup/forward2docker/releases

136

@bsideup

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

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-corehttps://github.com/aatarasoff/spring-thrift-api-gateway

Примеры сегодняшнего дняhttps://github.com/lavcraft/jug-samples

137

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

Высокие теории

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

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

Спасибо! Ваши вопросы

@tolkv

@aatarasoff

139