Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
микроСЕРВИСЫ
огонь, вода, медные трубы
@tolkv
2
@aatarasoff
3
микроСЕРВИСЫ
огонь, вода, медные трубы
DISCLAIMER
Наше мнение может не совпадать с официальной
позицией банка, начальника, коллег или других
специалистов. Мы не претендуем на роль
последней инстанции в вопросах использования
той или иной технологии. Все представленные
решения вы можете использовать на свой страх и
риск. За все ваши действия ответственность несёте
только вы сами.
5
Agenda
1. Past
2. Present
3. Future
6
Agenda
1. Past
2. Present
3. Future
7
8
9
Ball of Mud
10
11
SOA Principles
● standardized service contract
● loose coupling
● encapsulation
● reusability
● autonomy
● statelessness
● discoverability
12
13
UDDI
● Никто не говорит и никто не знает ;)
● Но все же. Кто знает что это и зачем это?
● А кто внедрял ? :)
14
Прекрасная технология
15
Как это выглядит? “Тогда”
16
Как это выглядит? “Сейчас”
Oracle SOA Governance
17
Как это выглядит? “Сейчас”
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")
Okay, перейдем по ссылке
19
Никто не хочет UDDI
20
<S:Envelope>
<S:Header>
...
<Security S:actor="null" S:mustUnderstand="...">
...
</Security>
...
</S:Header>
...
</S:Envelope>
…а реализация врозь
Не все реализации клиентов могут так сделать :(
21
22
Никто не любит “некрасивые” технологии
поэтому они умирают
А что с людьми?
● Что волновало людей тогда?
● Их волновало то, как не использовать
технологию
● Сейчас эта книга до сих пор продается. 20$
Ничто не не вечно :)
2004 год
24
А что ещё?
25
Выводы
26
Agenda
1. Past
2. Present
3. Future
27
28
Про тренды
29
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
Определение
1. Набор маленьких сервисов
a. насколько маленьких?
31
Размер имеет значение?
● Method/Function = Microservice?
● 10-300 LOC = Microservice?
● 1 week = Microservice?
● 1 developer = Microservice?
32
Размер не имеет значения*
● 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
Domain-Driven Development
34
Пример
Микросервис платежей
- принимает платеж и проводит его
- но платежей много типов
- а если внешние системы?
- а если каждый тип разный для разных
групп пользователей?
35
Определение
1. Набор маленьких сервисов
a. насколько маленьких?
2. Изоляция и независимый деплой
36
Process segregation
37
Независимый деплой
build test
38
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
Failed
40
Определение
1. Набор маленьких сервисов
a. насколько маленьких?
2. Изоляция и независимый деплой
3. Децентрализация
41
Language/technology segregation
42
Data segregation
43
Team segregation
44
Trade-off
- N языков программирования
- M в среднем фреймворков на язык
- L типов источников данных
complexity = N * M * L
45
Пример
- три языка программирования
- два в среднем фреймворка на язык
- семь типов источников данных
- legacy WS
- mongo db
- реляционная БД (oracle)
- хранимые процедуры
- JDBC templates/ORM
- elasticsearch
- neo4j/orient db
- мишкина база
complexity = 3 * 2 * 7 = 42 (!)
46
42!!!
47
Ключевые характеристики
● Domain-Driven Design
● Single responsibility
● Independent DURS
○ deploy, update, replace, scale
● Lightweight contract and communication
● Segregation
○ people
○ technologies
48
Ключевое приемущество
Вывод: микросервисы ради того, чтобы не
впихивать невпихуемое
49
Так на чём писать микросервисы?
50
min (N * M * L) -> max (L)
51
Закон трёх букв
А что есть в мире Java?
● Java EE
● Spring Boot/Spring Cloud
● Ratpack
● Dropwizard
● Vert.x
● Restlet
● Spark
52
Почему Spring Boot/Spring Cloud?
53
Почему Spring Boot/Spring Cloud?
● Развитая экосистема
● Неограниченные возможности кастомизации и
интеграции новых фреймворков
● Не только REST/HTTP
● Великолепные возможности мониторинга
54
А теперь попробуем
55
Demo
микроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубы
Demo -> Deploy Time
Service Discovery
60
61
62
Service Registry
63
Netflix Eureka
64
● Как работает heartbeat?
● Как работает healthcheck?
eureka.instance.leaseRenewalIntervalInSeconds: 3
eureka.instance.leaseExpirationDurationInSeconds: 3
Boo
65
Consul + Docker
https://github.com/docker/docker/issues/8795
docker run --net=host 
--privileged --rm 
cap10morgan/conntrack
production way! :)
66
Boo
67
Demo -> Time to Discover
69
Где мой порт?
70
71
Какие есть варианты?
● Nginx/Haproxy + consul template
● Haproxy + bamboo (need marathon)
● Netflix Zuul (Java way!!!)
● Custom Servlet <- все с этого начинают!
72
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
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
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
Netflix Zuul
76
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
Boo
78
Demo -> Gateway Time
микроСЕРВИСЫ: огонь, вода и медные трубы
Demo -> FBI Time
82
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact, binary etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
● Просто*
● Гибко*
● Безопасно*
*по нашему скромному мнению
83
Apache Thrift
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
Demo -> RPC Time
Безопасность
86
Защита на уровне сервиса
87
Защита на уровне сервиса #2
88
Опять этот gateway
89
REST/HTTP
Authorization: Bearer <TOKEN>
ClientID: <ID>
90
Thrift API Gateway
service InternalTestService {
SomeReturnData getSomeData(
1: UserData userData,
2: RequestData requestData
) throws (1: SomeException e);
}
91
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
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
94
Springway
@SpringBootApplication
@EnableThriftGateway
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
95
Demo -> Thrift the Ripper
микроСЕРВИСЫ: огонь, вода и медные трубы
микроСЕРВИСЫ: огонь, вода и медные трубы
Основные возможности
● Fallbacks
● Gracefull degradation
● Concurrency Execution
● Request Collapsing
● Caching
● Metrics polling
99
Demo -> Hystrix the Saviour
микроСЕРВИСЫ: огонь, вода и медные трубы
Boo
102
Типичная микросервисная архитектура
103
104
А что в этих ваших интернетах?
И чё?
Гибкость
Поддерживаемость
● Микросервисы это непросто
○ orchestration
○ discovery
○ fallback
Скорость
И чё?
● В Spring-е нет:
○ @ThriftHandler
○ @ThriftClient
○ @EnableThriftGateway
● Consul Cloud -> 1.0.0.M3
Помните SOAP ?
Микросервисы тоже не бесплатный обед
Agenda
1. Past
2. Present
3. Future
109
110
Operational requirements
● Orchestration (DURS)
● Service discovery
● Monitoring
● Resiliency
● Culture
111
112
https://xebialabs.com/periodic-table-of-devops-tools/
Docker etc.
113
Docker evolution
114
Эра PAAS
● Mesos + Marathon framework
● Kubernetes
● Cloud foundry
● Other..
○ Heroku
○ Tutum
○ Mesosphere DCOS
○ ... 115
116
Network
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
grpc.io
● http/2
● только async / netty
● protobuf 3
118
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
Zuul 2.0
● websocket support
● migrate to netty
120
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
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
Ooops
123
Java SE 9
● Jigsaw
○ http://openjdk.java.net/jeps/200
● Java Reactive JEP 266 (не в 9ке видимо)
○ http://openjdk.java.net/jeps/266
124
Eureka 2.0
● server group
● guaranted instance id uniqueness
● fast and simple replication
● write cluster/read cluster
125
Event Sourcing / CQRS / SAGA
http://gotocon.com/dl/goto-chicago-2015/slides/CaitieMcCaffrey_ApplyingTheSagaPattern.pdf
126
127
128
Saga guarantee
● T1 -> T2 -> T3 -> … -> Tn
● T1 -> T2 -> … Tn -> Cn … -> C2 -> C1
129
130
131
132
133
DDDD (4D)
Выводы. Микросервисы...
134
1. должны работать как единая система для
предоставления законченной функциональности
2. дают вам опции, как тестировать и где тестировать
ваш код
3. дают возможность закладывать нужные оси
вариативности в вашу архитектуру (да да,
подготавливаемся вставлять костыли на любых
уровнях!)
4. предполагают, что вы готовы вникать в вещи, не
связанные непосредственно с кодом продукта (а это
80% времени)
5. принесут вам радость, только если налажен CD,
иначе только боль
135
Ссылки
Оригинальное исполнение
https://github.com/bsideup/thrift-spring-boot-starter
Крутой плагин для Gradle
https://github.com/bsideup/GradleThrift
Forward2Docker
https://github.com/bsideup/forward2docker/releases
136
@bsideup
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
Высокие теории
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
Спасибо! Ваши вопросы
@tolkv
@aatarasoff
139

More Related Content

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