Slide 1

Slide 1 text

Microprofile.io не спрингом единым Микросервисы можно писать и не на буте

Slide 2

Slide 2 text

2 Дмитрий Александров Старший проектировщик информационных систем @bercut2000

Slide 3

Slide 3 text

Основано на: https://github.com/bgjug/microprofile-hol-1x BGJUG,Иван Иванов, Дмитрий Александров 3

Slide 4

Slide 4 text

Представьте себе невероятное: Нам надо написать веб приложение! 4

Slide 5

Slide 5 text

Естественно надо разбить все на микросервисы 5

Slide 6

Slide 6 text

Мы все ОЧЕНЬ МНОГО слышали про микросервисы 6

Slide 7

Slide 7 text

Но их надо как-то писать! 7

Slide 8

Slide 8 text

Прориворугатель: На этом докладе мы НЕ будем рассуждать: ● что такое микросервис ● чем он лучше или хуже других ● почему их применяют 8

Slide 9

Slide 9 text

Наш основной вопрос: как? 9

Slide 10

Slide 10 text

,а не зачем? 10

Slide 11

Slide 11 text

Демо 1 11

Slide 12

Slide 12 text

12 GUI Subscribers Authors Content Users Magazine Manager

Slide 13

Slide 13 text

Это надо сделать модно и красиво! 13

Slide 14

Slide 14 text

Node? … Go? 14

Slide 15

Slide 15 text

.. нее, у нас Java стек! 15

Slide 16

Slide 16 text

.. ну тогда естественно! 16

Slide 17

Slide 17 text

А что еще? Не Вебсферу же прикручивать?! 17

Slide 18

Slide 18 text

А что еще? Не Вебсферу же прикручивать?! (хотя об этом позже...) 18

Slide 19

Slide 19 text

Собственно, а что такое.. 19

Slide 20

Slide 20 text

Спринг буут Spring Boot это Spring-овое convention-over-configuration решение для создания stand-alone, production-grade Spring-овых приложений, которые можно "просто запускать". Оно уже преконфигурировано под “оптимальное” исполнение наиболее стандартных приложений. Почти не нужно конфигурировать.. 20

Slide 21

Slide 21 text

Спринг буут Крутое, потому что: ● Stand-alone 21

Slide 22

Slide 22 text

Спринг буут Крутое, потому что: ● Stand-alone ● Embed Tomcat или Jetty (не нужно деплоить WAR) 22

Slide 23

Slide 23 text

Спринг буут Крутое, потому что: ● Stand-alone ● Embed Tomcat или Jetty (не нужно деплоить WAR) ● Предоставляет 'starter' POMs, чтобы не путаться 23

Slide 24

Slide 24 text

Спринг буут Крутое, потому что: ● Stand-alone ● Embed Tomcat или Jetty (не нужно деплоить WAR) ● Предоставляет 'starter' POMs, чтобы не путаться ● Автоматическая конфигурация Spring 24

Slide 25

Slide 25 text

Спринг буут Крутое, потому что: ● Stand-alone ● Embed Tomcat или Jetty (не нужно деплоить WAR) ● Предоставляет 'starter' POMs, чтобы не путаться ● Автоматическая конфигурация Spring ● Полезные плюшки metrics, health checks и externalized configuration 25

Slide 26

Slide 26 text

Спринг буут Крутое, потому что: ● Stand-alone ● Embed Tomcat или Jetty (не нужно деплоить WAR) ● Предоставляет 'starter' POMs, чтобы не путаться ● Автоматическая конфигурация Spring ● Полезные плюшки metrics, health checks и externalized configuration ● Вообще нет кодогенерации и не нужна XML конфигурация 26

Slide 27

Slide 27 text

По идее, Спринг прекрасен! 27

Slide 28

Slide 28 text

По идее, Спринг прекрасен! И так думают все! 28

Slide 29

Slide 29 text

По идее, Спринг прекрасен! И так думают все! И не без почвы! 29

Slide 30

Slide 30 text

Демо 2 30

Slide 31

Slide 31 text

Но .. он один такой? 31

Slide 32

Slide 32 text

Как я перестал бояться и начал любить ЕЕ 32

Slide 33

Slide 33 text

ЕЕ: 33

Slide 34

Slide 34 text

ЕЕ: 34

Slide 35

Slide 35 text

Потом Вы сами знаете, что случилось! 35

Slide 36

Slide 36 text

36

Slide 37

Slide 37 text

37

Slide 38

Slide 38 text

ЕЕ: 38

Slide 39

Slide 39 text

А что там у спринга: 39

Slide 40

Slide 40 text

У них тоже много чего: 40

Slide 41

Slide 41 text

Кстати, мы тут немного не об этом.. 41

Slide 42

Slide 42 text

Нам нужно написать несколько микросервисов и заставить их работать вместе! 42

Slide 43

Slide 43 text

Зачем поднимать все это безумие, если нужно совсем немного.. 43

Slide 44

Slide 44 text

Так подумали несколько кантор: 44

Slide 45

Slide 45 text

Так подумали несколько кантор: 45

Slide 46

Slide 46 text

46

Slide 47

Slide 47 text

Ну это же все тоже самое ЕЕ! 47

Slide 48

Slide 48 text

48

Slide 49

Slide 49 text

об чем: ● Eclipse MicroProfile это open-source community specification для Enterprise Java Microservices 49

Slide 50

Slide 50 text

об чем: ● Eclipse MicroProfile это open-source community specification для Enterprise Java Мicroservices ● Сообщество частных лиц, организаций и разработчиков, работающих в рамках проекта с открытым исходным кодом (Eclipse), для Enterprise Java Мicroservices 50

Slide 51

Slide 51 text

Основные концепции: ● Минималистичный Fat jar 51

Slide 52

Slide 52 text

Основные концепции: ● Минималистичный Fat jar ● Минимальная (или полностью отсутствующая) конфигурация 52

Slide 53

Slide 53 text

Основные концепции: ● Минималистичный Fat jar ● Минимальная (или полностью отсутствующая) конфигурация ● Портабильность! 53

Slide 54

Slide 54 text

Сели и подумали: что из этого всего нужно для написания микросервиса? 54

Slide 55

Slide 55 text

MicroProfile 1.0 (Sep, 2016) MicroProfile 1.0 JAX-RS 2.0 JSON-P 1.0 CDI 1.2 55

Slide 56

Slide 56 text

MicroProfile 1.0 (Sep, 2016) io.microprofile microprofile 1.0.0 provided pom compile group: 'io.microprofile', name: 'microprofile', version: '1.0.0', ext: 'pom' 56

Slide 57

Slide 57 text

Если сервер сертифицирован по (или пишет, что поддерживает) Microprofile 1.0 – просто запускаем приложение! 57

Slide 58

Slide 58 text

Демо 3 58

Slide 59

Slide 59 text

Портабильный код… но не конфигурация.. 59

Slide 60

Slide 60 text

Eclipse MicroProfile 1.1 (Aug, 2017) MicroProfile 1.1 JAX-RS 2.0 JSON-P 1.0 CDI 1.2 Config 1.0 = New = No change from last release 60

Slide 61

Slide 61 text

Конфигурация логично выносить конфигурацию из программы, но каждый сервер конфигурится по-своему.. Dev Test Prod 61

Slide 62

Slide 62 text

Конфигурация ● DeltaSpike Config (http://deltaspike.apache.org/documentation/configuration.html) ● Extracted parts of DeltaSpike Config (https://github.com/struberg/javaConfig/) ● Apache Tamaya (http://tamaya.incubator.apache.org/) ● Sabot, merged into Tamaya (https://tomitribe.io/p/sabot) 62

Slide 63

Slide 63 text

Eclipse MicroProfile 1.1 (Aug, 2017) org.eclipse.microprofile.bom microprofile-bom-spec provided 1.1.0 pom compile group: 'org.eclipse.microprofile.bom', name: 'microprofile-bom-spec', version: '1.1.0', ext: 'pom' 63

Slide 64

Slide 64 text

64

Slide 65

Slide 65 text

Eclipse MicroProfile 1.2 (Sep, 2017) MicroProfile 1.2 = Updated = No change from last release JAX-RS 2.0 JSON-P 1.0 CDI 1.2 Config 1.1 Fault Tolerance 1.0 JWT Propagation 1.0 Health Check 1.0 Metrics 1.0 = New 65

Slide 66

Slide 66 text

Конфигурация 1.1 ● API/SPI Изменения a. ConfigSource SPI был расширен с помощью метода по умолчанию, который возвращает имена свойств для данного ConfigSource ● Функциональные изменения a. Реализации теперь должны включать конвертер URL-адресов @Priority (1) b. Формат имени свойства по умолчанию для точки injection с использованием @ConfigProperty был изменен первой буквы класса. Реализации могут поддерживать это поведение. Вместо этого в MicroProfile Config 1.1 требуется использовать имя класса. c. Реализации теперь должны поддерживать примитивные типы, в дополнение к уже указанным примитивным типам враперов ● Изменения спецификации a. Уточнения по значениям параметров 66

Slide 67

Slide 67 text

Health Check 1.0 ● Необходима совместимость с контейнерами (i.e. http://kubernetes.io/docs/user-guide/liveness/) 67

Slide 68

Slide 68 text

Health Check 1.0 ● Необходима совместимость с контейнерами (i.e. http://kubernetes.io/docs/user-guide/liveness/) ● хорошо бы чтобы machine-to-machine communication как-то работало 68

Slide 69

Slide 69 text

Health Check 1.0 ● Необходима совместимость с контейнерами (i.e. http://kubernetes.io/docs/user-guide/liveness/) ● хорошо бы чтобы machine-to-machine communication как-то работало ● … но чтобы и человек мог понять 69

Slide 70

Slide 70 text

Метрики Нужно хорошо и правильно мониторить сервисы, и это нужно делать из коробочки Metric Registry Required Base метрики Application метрики Vendor-specific метрики 70

Slide 71

Slide 71 text

Fault Tolerance Все ломается! Особенно микросервисы! 71

Slide 72

Slide 72 text

Fault Tolerance Все ломается! Особенно микросервисы! С этим надо жить! И хендлить их грациозно! 72

Slide 73

Slide 73 text

Fault Tolerance 1.0 В основном повлияли: ● Hystrix ● Failsafe Цели: ● Отделить ответственность от логики (Runnables/Callables/etc) через retry policies, bulkheads, circuit breakers 73

Slide 74

Slide 74 text

Fault Tolerance 1.0 - что делает ● Timeout: Ну собственно все ясно 74

Slide 75

Slide 75 text

Fault Tolerance 1.0 - что делает ● Timeout: Ну собственно все ясно ● RetryPolicy: Определить критерии сколько еще пробовать 75

Slide 76

Slide 76 text

Fault Tolerance 1.0 - что делает ● Timeout: Ну собственно все ясно ● RetryPolicy: Определить критерии сколько еще пробовать ● Fallback: если чтото пойдет не так, как действовать дальше! 76

Slide 77

Slide 77 text

Fault Tolerance 1.0 - что делает ● Timeout: Ну собственно все ясно ● RetryPolicy: Определить критерии сколько еще пробовать ● Fallback: если чтото пойдет не так, как действовать дальше! ● CircuitBreaker: это сложно - предлагает способы предотвращать перегрузку системы или ненужные таймауты 77

Slide 78

Slide 78 text

Fault Tolerance 1.0 - что делает ● Timeout: Ну собственно все ясно ● RetryPolicy: Определить критерии сколько еще пробовать ● Fallback: если чтото пойдет не так, как действовать дальше! ● CircuitBreaker: это сложно - предлагает способы предотвращать перегрузку системы или ненужные таймауты ● Bulkhead: способ изоляции частей системы, в случае сбоев которых, остальные остаются работоспособными. 78

Slide 79

Slide 79 text

Circuit Breaker 79

Slide 80

Slide 80 text

Circuit Breaker 80 https://martinfowler.com/bliki/CircuitBreaker.html

Slide 81

Slide 81 text

JWT Требования безопасности, связанные с архитектурой микросервиса, тесно связаны с безопасностью RESTful сервисов. В стиле архитектуры RESTful службы обычно не имеют состояния и любое состояние безопасности, связанное с клиентом, отправляется в целевую службу по каждому запросу, чтобы позволить службам повторно создавать контекст безопасности для вызывающего и выполнять проверку подлинности и авторизации 81

Slide 82

Slide 82 text

JWT Повлияли в основном: ● OAuth2 ● OpenID Connect(OIDC), and ● JSON Web Tokens(JWT) Цель: ● Одна из основных стратегий распространения состояния безопасности от клиентов к услугам или даже от служб к услугам связана с использованием токенов безопасности. ● Для микросервисов на основе RESTful маркеры безопасности предлагают очень легкий и совместимый способ распространения идентификаторов между различными службами. 82

Slide 83

Slide 83 text

JWT Инфраструктура: Аннотации: ● @Clame (String or ClaimValue) ● @RolesAllowed ● @LoginConfig ● @DeclareRoles 83

Slide 84

Slide 84 text

JWT Инфраструктура: Классы: ● @Inject JsonWebToken jwt; ● @Inject Principal principal; ● @Inject JsonNumber jsonNumber; ● ● Various JWT tools 84

Slide 85

Slide 85 text

Eclipse MicroProfile 1.2 (Sep, 2017) org.eclipse.microprofile microprofile provided 1.2 pom compile group: 'org.eclipse.microprofile', name: 'microprofile', version: '1.2', ext: 'pom' 85

Slide 86

Slide 86 text

Демо 5 86

Slide 87

Slide 87 text

87

Slide 88

Slide 88 text

Собственно, на этой версии заканчивается стабильность! 88

Slide 89

Slide 89 text

89

Slide 90

Slide 90 text

Eclipse MicroProfile 1.3 (Q1 CY2018) MicroProfile 1.3 JAX-RS 2.0 JSON-P 1.0 CDI 1.2 Config 1.2 Fault Tolerance 1.0 JWT Propagation 1.0 Health Check 1.0 Metrics 1.1 Open Tracing 1.0 Open API 1.0 = Updated = No change from last release = New Rest Client 1.0 90

Slide 91

Slide 91 text

Метрики 1.1 Что нового: ● Улучшенное TCK. ● org.eclipse.microprofile.metrics.MetricRegistry.register(String name, Metric, Metadata) депрекейтнуто. ● Use org.eclipse.microprofile.metrics.MetricRegistry.register(Metadata, Metric) instead, where Metadata already has a field for the name. ● Глобальные таги теперь доступны через MicroProfile Config (env переменная все еще валидна). ● Аннотации и метаданные теперь могут иметь флаг для многократного использования. Имя метрики может быть зарегистрировано более одного раза. Значение по умолчанию равно falsе. 91

Slide 92

Slide 92 text

Configuration 1.2 Новые фичи: ● SPI ConfigBuilder был расширен с помощью метода, который позволяет зарегистрировать конвертер с указанным типом класса. Это изменение устраняет ограничение, при котором не возможно добавить лямбда-конвертоты. ● Реализации должны теперь поддерживать преобразователь массива. Для преобразователя массива программный луукап свойства (например, config.getValue (myProp, String []. Class)) должен поддерживать возвращаемый тип массива. Для поиска injection необходимо также поддерживать массив, список или набор (например, @Inject @ConfigProperty (name = "myProp") список propValue;). ● Реализации также должны поддерживать преобразователи общего плана, если для данного класса нет соответствующих типов преобразователей. Реализация должна использовать конструктор класса с одним строковым параметром, а затем попробовать valueOf (String), за которым следует CharSequence. ● Имплементации должны поддерживать Class конверторы 92

Slide 93

Slide 93 text

OpenAPI Управление микросервисами в MSA может стать громоздким по мере увеличения количества микросервисов. Управление микросервисами осуществляется через их API. Управление, безопасность, балансировка нагрузки и дросселирование - это политики, которые могут применяться к API-интерфейсам с микросервисами. OpenAPI предоставляет Java- интерфейсы и модели программирования, которые позволяют разработчикам Java изначально создавать документы OpenAPI v3 из своих приложений JAX-RS. 93

Slide 94

Slide 94 text

OpenAPI 1.0 ● Enterprise Java Binding of the OpenAPI v3 specification ● Основан на Swagger Core ● OpenAPI ○ Определяет стандартны, программное language-agnostic описание языка для REST APIs ○ Понимание и машин и человека 94

Slide 95

Slide 95 text

OpenTracing ● Назначает каждому внешнему запросу уникальный идентификатор внешнего запроса ● Пропускает идентификатор внешнего запроса ко всем службам, связанным с обработкой запроса ● Включает внешний идентификатор запроса во всех сообщениях журнала ● Записывает информацию (например, время начала, время окончания) о запросах и операциях, выполняемых при обработке внешнего запроса в централизованной службе 95

Slide 96

Slide 96 text

RestClient ● Как оказалось, сервисы не только предоставляются, но и потребляются ● Не хотелось бы думать о мапинге ● Необходимо быть максимально декларативными ● Вся инфраструктура уже есть 96

Slide 97

Slide 97 text

Eclipse MicroProfile 1.3 (Q1 CY2018) org.eclipse.microprofile microprofile 1.3 provided pom compile group: 'org.eclipse.microprofile', name: 'microprofile', version: '1.3', ext: 'pom' 97

Slide 98

Slide 98 text

Eclipse MicroProfile 1.4 (Q2 CY2018) MicroProfile 1.4 JAX-RS 2.0 JSON-P 1.0 CDI 1.2 Config 1.2 Fault Tolerance 1.0 JWT Propagation 1.0 Health Check 1.0 Metrics 1.1 Open Tracing 1.0 Open API 1.0 = Updated = No change from last release = New Rest Client 1.0 ● Improve developer documentation of existing specifications ● Incremental specification updates 98

Slide 99

Slide 99 text

Eclipse MicroProfile 2.0 (2H 2018) MicroProfile 2.0 JAX-RS 2.1 JSON-P 1.1 CDI 2.0 Config 1.2 Fault Tolerance 1.0 JWT Propagation 1.0 Health Check 1.0 Metrics 1.1 Open Tracing 1.0 Open API 1.0 JSON-B 1.0 Rest Client 1.0 99 = Updated = No change from last release = New

Slide 100

Slide 100 text

Eclipse MicroProfile 2.1 MicroProfile 2.1 = Updates = No change from last release JAX-RS 2.1 JSON-P 1.1 CDI 2.0 Config 1.2 Fault Tolerance 1.0 JWT Propagation 1.0 Health Check 1.0 Metrics 1.1 Open API 1.0 JSON-B 1.0 Rest Client 1.0 100 OpenTracing 1.2

Slide 101

Slide 101 text

Eclipse MicroProfile 2.2 MicroProfile 2.2 = Updates = No change from last release JAX-RS 2.1 JSON-P 1.1 CDI 2.0 Config 1.2 Fault Tolerance 2.0 JWT Propagation 1.0 Health Check 1.0 Metrics 1.1 JSON-B 1.0 101 OpenTracing 1.3 OpenAPI 1.1 RestClient 1.2.0

Slide 102

Slide 102 text

Eclipse MicroProfile 2.2 (2019) org.eclipse.microprofile microprofile 2.2 provided pom compile group: 'org.eclipse.microprofile', name: 'microprofile', version: '2.2', ext: 'pom' 102

Slide 103

Slide 103 text

Ну, по идее можно и ISTIO прикрутить... 103

Slide 104

Slide 104 text

104 MicroService Service Mesh Fault Tolerance Security Health Metrics

Slide 105

Slide 105 text

105 ISTIO/LINKERD Service Mesh MicroService

Slide 106

Slide 106 text

https://github.com/eclipse/microprofile-service-mesh 106 Service Mesh

Slide 107

Slide 107 text

Как там с тестированием? 107

Slide 108

Slide 108 text

Тестирование 108

Slide 109

Slide 109 text

Многие считают Arquillian тяжелым и трудным в настройке 109

Slide 110

Slide 110 text

Тестирование 110

Slide 111

Slide 111 text

https://antoniogoncalves.org/2018/01/16/ java-ee-vs-spring-testing/ 111

Slide 112

Slide 112 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное 112

Slide 113

Slide 113 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное ● Оно opensource 113

Slide 114

Slide 114 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное ● Оно opensource ● Оно сапортится крутыми вендорами и комюнити 114

Slide 115

Slide 115 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное ● Оно opensource ● Оно сапортится крутыми вендорами и комюнити ● Всего один POM 115

Slide 116

Slide 116 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное ● Оно opensource ● Оно сапортится крутыми вендорами и комюнити ● Всего один POM ● Автоматическая конфигурация 116

Slide 117

Slide 117 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное ● Оно opensource ● Оно сапортится крутыми вендорами и комюнити ● Всего один POM ● Автоматическая конфигурация ● Полезные плюшки metrics, health checks и externalized configuration 117

Slide 118

Slide 118 text

Ну так вот Почему стоит задуматься применить Microprofile ● Оно стандартное ● Оно opensource ● Оно сапортится крутыми вендорами и комюнити ● Всего один POM ● Автоматическая конфигурация ● Полезные плюшки metrics, health checks и externalized configuration ● Вообще нет кодогенерации и не нужна XML конфигурация 118

Slide 119

Slide 119 text

Спринг буут <- Вспомним это слайд Крутое, потому что: ● Stand-alone ● Embed Tomcat или Jetty (не нужно деплоить WAR) ● Предоставляет 'starter' POMs, чтобы не путаться ● Автоматическая конфигурация Spring ● Полезные плюшки metrics, health checks и externalized configuration ● Вообще нет кодогенерации и не нужна XML конфигурация 119

Slide 120

Slide 120 text

Если не разницы, зачем платить больше! 120

Slide 121

Slide 121 text

Именно платить: Для разработчика оно может быть и бесплатное.. 121

Slide 122

Slide 122 text

Именно платить: Для разработчика оно может быть и бесплатное.. Но для конторы оно может быть очень даже платное 122

Slide 123

Slide 123 text

Именно платить: Для разработчика оно может быть и бесплатное.. Но для конторы оно может быть очень даже платное ● А как там с лицензиями? 123

Slide 124

Slide 124 text

Именно платить: Для разработчика оно может быть и бесплатное.. Но для конторы оно может быть очень даже платное ● А как там с лицензиями? ● А как там с саппортом? 124

Slide 125

Slide 125 text

Именно платить: Для разработчика оно может быть и бесплатное.. Но для конторы оно может быть очень даже платное ● А как там с лицензиями? ● А как там с саппортом? ● А как там допусками и сертификацией? 125

Slide 126

Slide 126 text

Именно платить: Для разработчика оно может быть и бесплатное.. Но для конторы оно может быть очень даже платное ● А как там с лицензиями? ● А как там с саппортом? ● А как там допусками и сертификацией? ● … А как там с законодательством? 126

Slide 127

Slide 127 text

А может плюсов больше? Почему стоит задуматься применить Microprofile ● Практически переписывается заново 127

Slide 128

Slide 128 text

А может плюсов больше? Почему стоит задуматься применить Microprofile ● Практически переписывается заново ● Опенсорс 128

Slide 129

Slide 129 text

А может плюсов больше? Почему стоит задуматься применить Microprofile ● Практически переписывается заново ● Опенсорс ● Выбрасывается наследие ЕЕ (например все делается с CDI) 129

Slide 130

Slide 130 text

А может плюсов больше? Почему стоит задуматься применить Microprofile ● Практически переписывается заново ● Опенсорс ● Выбрасывается наследие ЕЕ (например все делается с CDI) ● Oracle не отстает (точнее немного отстает): Helidon 130

Slide 131

Slide 131 text

Helidon: MicroFramework: WebServer.create( Routing.builder() .get("/greet", (req, res) -> res.send("Hello World!")) .build()) .start(); 131 MicroProfile: public class GreetService { @GET @Path("/greet") public String getMsg() { return "Hello World!"; } }

Slide 132

Slide 132 text

Повод задуматься: 132

Slide 133

Slide 133 text

Ну так вот, ЕЕ уже не тяжел! 133

Slide 134

Slide 134 text

А еще появился starter 134

Slide 135

Slide 135 text

135

Slide 136

Slide 136 text

Оно еще и легкое 136

Slide 137

Slide 137 text

… а еще все очень быстро меняется! 137

Slide 138

Slide 138 text

138

Slide 139

Slide 139 text

139

Slide 140

Slide 140 text

140

Slide 141

Slide 141 text

И с тестами там все правильно! 141

Slide 142

Slide 142 text

Спасибо!!! 142 142