SlideShare a Scribd company logo
Твой личный
Spring Boot Starter
@tolkv
2
@aatarasoff
3
Твой личный
Spring Boot Starter
План такой
1. Будем решать задачу
2. Будут сложности
3. Будем бороться с ними
4. Сделаем выводы
5. Ответим на вопросы
5
Простая задача.
Кодовое имя:
“Где Джош?”
6
7
8
Сайт
конференции
Сервис
9
Попытка №1
10
11
К несчастью у нас целая куча сервисов
Слайд Боли
● Boilerplate-боль
○ бизнес-логика
○ куча непонятного, но нужного
● Конфигурация-боль
○ много настроек
○ сложная композировать настройки
● Имплементация-боль
○ не DRY
12
К чему это ведёт?
● Низкая скорость создания
● Высокий порог вхождения
● Нужно держать в голове детали
13
Spring Boot Starter
Джош мог бы вам уже всё рассказать :)
14
Принципы
● композиция через аннотации
● согласованность технологий
● изменение поведения через конфигурацию
15
Простой пример
@SpringBootApplication
public class Application {
@PostConstruct
public void init(){
..boilerplate...
business logic
..boilerplate...
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
} 16
Простой пример
@SpringBootApplication
@EnableThriftServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
17
Добавим пару аннотаций
@EnableHystrix
@EnableHystrixDashboard
@SpringBootApplication
@EnableThriftServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
18
Или не пару
@EnableZuulProxy
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
@SpringBootApplication
@EnableThriftServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
19
Пишем свой...
стартер
20
7 простых шагов
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
21
7 простых шагов
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
22
23
24
Схема работы автоконфигуратора
25
26
7 простых шагов
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
27
7 простых шагов
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
28
7 простых шагов
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
29
7 простых шагов
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
30
Зачем нужен spring.provides?
31
Зачем нужен spring.provides?
32
Что ещё нужно сделать
Добавим метрики, обработку ошибок и логирование:
proxyFactory.addAdvice(new MetricsThriftMethodInterceptor(gaugeService))
proxyFactory.addAdvice(new ExceptionsThriftMethodInterceptor())
proxyFactory.addAdvice(new LoggingThriftMethodInterceptor())
@Slf4j
public class LoggingThriftMethodInterceptor implements MethodBeforeAdvice, AfterReturningAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
log.info("Thrift method {}.{}() is called with args: {}",
target.getClass().getSimpleName(), method.getName(), args
);
}
//afterReturning method is implemented here %)
}
33
Что ещё можно улучшить
@ThriftClient(serviceId = "greeting-service", path = "/api")
TGreetingService.Client client;
greeting-service: #service name
endpoint: http://localhost:8080/api #direct endpoint
ribbon: #ribbon
listOfServers: localhost:8080 #hardcoded list
path: /service #general path
connectTimeout: 1000 #default=1000
readTimeout: 10000 #default=30000
34
Как распространять?
● Не прячьте свой труд. Используйте GitHub.
● Делитесь своими разработками со всеми. Используйте Bintray и jcenter.
35
Парадокс (де)централизации микросервисов
Чтобы эффективно работать с распределенными приложениями, нужно
иметь очень хорошие централизованные библиотеки/инструменты
Например: логирование, health-чеки, метрики,
обработку программных ошибок
36
Парадокс (де)централизации микросервисов
Чтобы эффективно работать с распределенными приложениями, нужно
иметь очень хорошие централизованные библиотеки/инструменты
Но: не выносите бизнес-логику или доменные объекты
37
7 простых шагов к счастью
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
38
7 простых шагов к счастью
1. Напиши “простой” тест. Разберись в технологии.
2. Напиши микросервис так, как если бы он был один
3. Создай автоконфигуратор и переведи сервис на него
4. Добавь точки расширения
5. Не забудь про конфигурацию по-умолчанию
6. Напиши тесты на автоконфигурацию
7. Создай и распространяй стартер
39
Зачем?
Ссылки
Полная версия: https://github.com/aatarasoff/spring-thrift-starter
Для grpc: https://github.com/lavcraft/grpc-spring-boot-starter
40
Спасибо! Готовы ответить на ваши вопросы
@tolkv
@aatarasoff
41

More Related Content

PDF
Расширь границы возможного вместе с Gradle
PDF
Хипстеры в энтерпрайзе
PDF
микроСЕРВИСЫ: огонь, вода и медные трубы
PDF
Continuous Delivery with Jenkins: Lessons Learned
PDF
Joker 2015. WILD microSERVICES
POTX
Разработка надежных параллельных, распределенных приложений: быстро и дешево
PDF
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
PDF
Никита Галкин "Ловушки микросервисной архитектуры"
Расширь границы возможного вместе с Gradle
Хипстеры в энтерпрайзе
микроСЕРВИСЫ: огонь, вода и медные трубы
Continuous Delivery with Jenkins: Lessons Learned
Joker 2015. WILD microSERVICES
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Олег Миколайченко "Как перестать хранить секреты в git и начать использовать ...
Никита Галкин "Ловушки микросервисной архитектуры"

What's hot (20)

PDF
Микросервисы: взгляд сверху и в бок
PDF
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
PDF
Как приручить реактивное программирование
PDF
Как это будет: ASP.NET Core
PDF
Continuous Delivery для ASP.NET MVC проекта под Linux
PPTX
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
PDF
Эволюционный дизайн. Joker Students Day 2016
PDF
Gradle in Enterprise, Is it possible?
PDF
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
PDF
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
PPTX
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
PDF
Илья Ефимов «IoC/DI на примере Autofac»
PDF
Инструменты разные нужны, инструменты разные важны
PDF
Jenkins Imperative Pipeline vs Declarative Pipeline
PDF
Сергей Сергеев — Maintainer кода в большом проекте
PDF
Владислав Грязнов "Многозадачность в PHP"
PPTX
Coding like a sex
PPT
Let's Talk About Junit 5
PPTX
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
PDF
Многопоточное программирование на C#, путевые заметки
Микросервисы: взгляд сверху и в бок
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Как приручить реактивное программирование
Как это будет: ASP.NET Core
Continuous Delivery для ASP.NET MVC проекта под Linux
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Эволюционный дизайн. Joker Students Day 2016
Gradle in Enterprise, Is it possible?
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Илья Ефимов «IoC/DI на примере Autofac»
Инструменты разные нужны, инструменты разные важны
Jenkins Imperative Pipeline vs Declarative Pipeline
Сергей Сергеев — Maintainer кода в большом проекте
Владислав Грязнов "Многозадачность в PHP"
Coding like a sex
Let's Talk About Junit 5
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Многопоточное программирование на C#, путевые заметки
Ad

Viewers also liked (6)

PDF
CD with Jenkins. Lessons Learned
PDF
Дикие микросервисы на JUG Екатеринбург
PDF
WILD microSERVICES v2 (JEEConf Edition)
PDF
Docker In Bank Unrated
PDF
Service Discovery. Spring Cloud Internals
PDF
A Research Study into DevOps Bottlenecks
CD with Jenkins. Lessons Learned
Дикие микросервисы на JUG Екатеринбург
WILD microSERVICES v2 (JEEConf Edition)
Docker In Bank Unrated
Service Discovery. Spring Cloud Internals
A Research Study into DevOps Bottlenecks
Ad

Similar to Jbreak 2016: Твой личный Spring Boot Starter (20)

PDF
Денис Иванов
PDF
Паттерны проектирования в автотестах [NoBugs WTF PRO уровень]
PDF
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
PPT
Микросервисы: первая кровь
PDF
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
PDF
Стратегии масштабирования [NoBugs WTF PRO уровень]
PPTX
Software craftsmanship 17: Microservices interaction
PDF
Преимущества и недостатки микросервисной архитектуры в HeadHunter / Антон Ива...
PDF
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
PDF
Разработка Enterprise-приложения на основе Spring Framework
PDF
Wild microservices and imaginary DevOps
PPTX
Konstantin slisenko - Spring Framework
PPTX
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
PPTX
«Microservices. Как правильно делать и когда применять?»
PDF
Микросервисный фронтенд
PDF
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
PDF
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
PDF
Рефакторинг монолита в микросервисы на Go
PDF
Рефакторинг монолита в микросервисы на Go / Refactoring of Monolithe to Micro...
PDF
Как превратить приложение в платформу
Денис Иванов
Паттерны проектирования в автотестах [NoBugs WTF PRO уровень]
DUMP-2015 «Микросервисная архитектура в теории и на практике» Иван Бурмистров...
Микросервисы: первая кровь
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Стратегии масштабирования [NoBugs WTF PRO уровень]
Software craftsmanship 17: Microservices interaction
Преимущества и недостатки микросервисной архитектуры в HeadHunter / Антон Ива...
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
Разработка Enterprise-приложения на основе Spring Framework
Wild microservices and imaginary DevOps
Konstantin slisenko - Spring Framework
CodeID - PHP Odessa Conf: Сергей Тимошевский "Все пути ведут к микросервисам"
«Microservices. Как правильно делать и когда применять?»
Микросервисный фронтенд
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Рефакторинг монолита в микросервисы на Go
Рефакторинг монолита в микросервисы на Go / Refactoring of Monolithe to Micro...
Как превратить приложение в платформу

Jbreak 2016: Твой личный Spring Boot Starter

  • 5. План такой 1. Будем решать задачу 2. Будут сложности 3. Будем бороться с ними 4. Сделаем выводы 5. Ответим на вопросы 5
  • 7. 7
  • 8. 8
  • 11. 11 К несчастью у нас целая куча сервисов
  • 12. Слайд Боли ● Boilerplate-боль ○ бизнес-логика ○ куча непонятного, но нужного ● Конфигурация-боль ○ много настроек ○ сложная композировать настройки ● Имплементация-боль ○ не DRY 12
  • 13. К чему это ведёт? ● Низкая скорость создания ● Высокий порог вхождения ● Нужно держать в голове детали 13
  • 14. Spring Boot Starter Джош мог бы вам уже всё рассказать :) 14
  • 15. Принципы ● композиция через аннотации ● согласованность технологий ● изменение поведения через конфигурацию 15
  • 16. Простой пример @SpringBootApplication public class Application { @PostConstruct public void init(){ ..boilerplate... business logic ..boilerplate... } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 16
  • 17. Простой пример @SpringBootApplication @EnableThriftServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 17
  • 18. Добавим пару аннотаций @EnableHystrix @EnableHystrixDashboard @SpringBootApplication @EnableThriftServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 18
  • 19. Или не пару @EnableZuulProxy @EnableDiscoveryClient @EnableHystrix @EnableHystrixDashboard @SpringBootApplication @EnableThriftServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 19
  • 21. 7 простых шагов 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 21
  • 22. 7 простых шагов 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 22
  • 23. 23
  • 25. 25
  • 26. 26
  • 27. 7 простых шагов 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 27
  • 28. 7 простых шагов 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 28
  • 29. 7 простых шагов 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 29
  • 30. 7 простых шагов 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 30
  • 33. Что ещё нужно сделать Добавим метрики, обработку ошибок и логирование: proxyFactory.addAdvice(new MetricsThriftMethodInterceptor(gaugeService)) proxyFactory.addAdvice(new ExceptionsThriftMethodInterceptor()) proxyFactory.addAdvice(new LoggingThriftMethodInterceptor()) @Slf4j public class LoggingThriftMethodInterceptor implements MethodBeforeAdvice, AfterReturningAdvice { @Override public void before(Method method, Object[] args, Object target) throws Throwable { log.info("Thrift method {}.{}() is called with args: {}", target.getClass().getSimpleName(), method.getName(), args ); } //afterReturning method is implemented here %) } 33
  • 34. Что ещё можно улучшить @ThriftClient(serviceId = "greeting-service", path = "/api") TGreetingService.Client client; greeting-service: #service name endpoint: http://localhost:8080/api #direct endpoint ribbon: #ribbon listOfServers: localhost:8080 #hardcoded list path: /service #general path connectTimeout: 1000 #default=1000 readTimeout: 10000 #default=30000 34
  • 35. Как распространять? ● Не прячьте свой труд. Используйте GitHub. ● Делитесь своими разработками со всеми. Используйте Bintray и jcenter. 35
  • 36. Парадокс (де)централизации микросервисов Чтобы эффективно работать с распределенными приложениями, нужно иметь очень хорошие централизованные библиотеки/инструменты Например: логирование, health-чеки, метрики, обработку программных ошибок 36
  • 37. Парадокс (де)централизации микросервисов Чтобы эффективно работать с распределенными приложениями, нужно иметь очень хорошие централизованные библиотеки/инструменты Но: не выносите бизнес-логику или доменные объекты 37
  • 38. 7 простых шагов к счастью 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 38
  • 39. 7 простых шагов к счастью 1. Напиши “простой” тест. Разберись в технологии. 2. Напиши микросервис так, как если бы он был один 3. Создай автоконфигуратор и переведи сервис на него 4. Добавь точки расширения 5. Не забудь про конфигурацию по-умолчанию 6. Напиши тесты на автоконфигурацию 7. Создай и распространяй стартер 39 Зачем?
  • 40. Ссылки Полная версия: https://github.com/aatarasoff/spring-thrift-starter Для grpc: https://github.com/lavcraft/grpc-spring-boot-starter 40
  • 41. Спасибо! Готовы ответить на ваши вопросы @tolkv @aatarasoff 41