$30 off During Our Annual Pro Sale. View Details »

Перевод Spring Boot-микросервисов с Java 8 на 11: что может пойти не так?

Перевод Spring Boot-микросервисов с Java 8 на 11: что может пойти не так?

С новым циклом релизов платформа Java стала баловать нас версиями каждые полгода, но мало кто в enterprise-мире торопится на них переходить. Однако Java 11 стала исключением — благодаря сразу нескольким факторам она показалась многим подходящей целью для обновления. И всё бы ничего, но если у вас парк микросервисов на Spring Boot, это обновление может стать несколько более занимательным, чем просто перещёлкнуть версию...

В докладе речь пойдет не только и не столько о новых языковых фичах, сколько о граблях на пути обновления Boot-микросервисов в целом, начиная со сборки (например, Gradle-ом) и заканчивая развёртыванием Docker-контейнеров (например, в Kubernetes). Отдельно поговорим о том, чего ждать от перехода на Spring Boot версии 2.1 (начавшей поддерживать Java 11) и его спутников, привносящих немало новшеств и спецэффектов.

Доклад ориентирован на тех разработчиков и тестировщиков микросервисных приложений на Spring Boot, которые переводят или планируют перевести свои продукты на 11-ю версию платформы Java.

Vladimir Plizga

April 06, 2019
Tweet

More Decks by Vladimir Plizga

Other Decks in Programming

Transcript

  1. Перевод Spring Boot
    микросервисов с Java 8 на 11
    Что может пойти (не) так?
    Владимир Плизгá
    ЦФТ

    View Slide

  2. Привет!
    ➢ Владимир Плизгá
    https://github.com/Toparvion
    ➢ ЦФТ (Центр Финансовых Технологий)
    Один из крупнейших разработчиков ПО в России
    ➢ Backend-разработчик (Java)
    7+ лет в деле
    ➢ TechLead в команде Интернет-банка
    2

    View Slide

  3. Интернет-банк для предоплаченных карт
    ➢ 20+ федеральных партнеров
    ➢ В топ-10 рейтинга Markswebb Mobile Banking Rank 2018
    http://markswebb.ru/e-finance/mobile-banking-rank-2018/
    3

    View Slide

  4. Проект состоит из
    1 монолита и
    ≈25 микросервисов
    на Spring Boot

    View Slide

  5. Ой, что будет…
    1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие
    5

    View Slide

  6. Чего точно не будет:
    6
    Обзора всех
    новых фич Java
    с 9 по 11 версии
    Инструкции
    по распилу
    на модули
    Агитации
    переходить
    немедленно

    View Slide

  7. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  8. Погружение
    Почему и зачем?

    View Slide

  9. Цикл релизов Java
    8
    • март 2014

    9
    • сентябрь 2017
    10
    • март 2018
    11
    • сентябрь 2018
    12
    • март 2019
    4,5 года
    9

    View Slide

  10. Среди релизов есть особенные
    8
    • март 2014

    9
    • сентябрь 2017
    10
    • март 2018
    11
    • сентябрь 2018
    12
    • март 2019
    LTS
    LTS
    * LTS – Long-Term
    Support (Oracle)
    10

    View Slide

  11. В январе’19 версия 8 резко постарела
    8
    • март 2014

    9
    • сентябрь 2017
    10
    • март 2018
    11
    • сентябрь 2018
    • январь 2019
    12
    • март 2019
    LTS
    LTS
    Public Updates от Oracle
    прекращены 17.01.19
    end
    11

    View Slide

  12. Условия поддержки
    Java 8 у других
    вендоров могут
    отличаться

    View Slide

  13. 13
    Ориентация на LTS-релизы –
    распространенная практика

    View Slide

  14. Пример с Amazon Corretto
    14
    https://aws.amazon.com/en/corretto

    View Slide

  15. Пример с Liberica JDK
    15
    https://bell-sw.com/

    View Slide

  16. Пример со Spring (и его Boot)
    Spring Framework 5.1 requires JDK 8 …
    and specifically supports JDK 11
    (as the next long-term support release)
    https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x
    16

    View Slide

  17. И зачем это все?
    17

    View Slide

  18. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  19. Сборка проекта на Gradle
    Грабли на самом раннем этапе

    View Slide

  20. Для сборки на Java 11 нужен Gradle 5
    https://github.com/gradle/gradle/issues/5120
    20

    View Slide

  21. Но есть один нюанс…
    21

    View Slide

  22. Gradle 5.0
    (build scan)
    22

    View Slide

  23. Некоторые сборки
    на Gradle 5.0
    замедлились в 10+ раз
    2,5
    109
    13
    Версия Gradle
    Время ‘$ gradle dependencies’ (сек)
    4.10.3 5.0 5.1.1

    View Slide

  24. 24
    Gradle 5.1 позволяет связывать
    репозитории с зависимостями

    View Slide

  25. Repository to dependency matching
    25
    Подробнее:

    View Slide

  26. Maven repository filtering
    26

    View Slide

  27. Поддержка BOM (как было)
    27

    View Slide

  28. Поддержка BOM (как стало)
    28

    View Slide

  29. Gradle + Lombok
    Подключение библиотеки после 5.х

    View Slide

  30. Как было до 5.0
    30

    View Slide

  31. Как стало
    после 5.0 …
    31

    View Slide

  32. Как должно стать после 5.0
    * Для тестов –
    * Можно через плагин: https://plugins.gradle.org/plugin/io.freefair.lombok
    32
    *

    View Slide

  33. Совместимость с новым импортом BOM
    33

    View Slide

  34. И как быть?
    34
    ➢ Способ 1 – добавить директиву:
    ➢ Способ 2 – плагин
    ➢ Способ 3 – плагин

    View Slide

  35. Разделение зависимостей
    Compile & Runtime Scopes

    View Slide

  36. Во времена Gradle 4 жил-был импорт…
    36

    View Slide

  37. … а потом случился Gradle 5
    37

    View Slide

  38. Зависимость оказалась транзитивной
    38

    View Slide

  39. Новшество версии Gradle 5.0
    … the compilation classpath only includes
    compile-scoped dependencies
    https://docs.gradle.org/5.0/userguide/upgrading_version_4.html
    39

    View Slide

  40. Источник
    runtime
    зависимости
    https://mvnrepository.com/artifact/com.netflix.ribbon/ribbon-httpclient/2.3.0
    40

    View Slide

  41. ➢ Менять транзитивные зависимости на явные
    ➢ Анализировать зависимости (Gradle):


    ➢ Build Scan https://scans.gradle.com/
    И как быть?
    41

    View Slide

  42. Для работы с Java 11 нужен Maven 3.5.0, а также:
    ➢ compiler plugin: 3.8.0
    ➢ surefire & failsafe: 2.22.0
    Полезные материалы:
    ➢ https://blog.codefx.org/java/java-11-migration-guide/
    ➢ https://winterbe.com/posts/2018/08/29/migrate-maven-projects-to-
    java-11-jigsaw/
    Минутка справедливости: Maven
    42

    View Slide

  43. Для тех, кто любит поподробнее
    43
    https://2018.jokerconf.com/2018/talks/ciamjmk7uwqwyseuy6iao

    View Slide

  44. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  45. Причём тут Spring?
    Java 11 is supported as of Spring Boot 2.1.0.M2*
    https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9-and-above
    45
    * Но можно пробовать и на меньших версиях

    View Slide

  46. Spring Boot
    2.1
    Tomcat 9 Undertow 2 Hibernate 5.3 JUnit 5.2
    Micrometer
    1.1
    Spring
    Framework 5.1
    Spring Cloud
    Greenwich
    Версии транзитивных зависимостей
    46

    View Slide

  47. Запрет переопределения бинов

    View Slide

  48. Новшество версии 2.1
    Bean overriding
    has been disabled by default
    to prevent a bean being
    accidentally overridden
    https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes
    48

    View Slide

  49. Такие изменения
    бывают не только
    случайными

    View Slide

  50. Пример 1: библиотечный код
    }
    50

    View Slide

  51. Пример 1: прикладной код
    51

    View Slide

  52. Пример 1: последствия
    52

    View Slide

  53. Пример 2: прикладной код
    53

    View Slide

  54. Пример 2: тестовый код
    54

    View Slide

  55. Пример 2: последствия
    55

    View Slide

  56. Решение (вариант 1): глобально
    56
    + Быстро, просто, понятно
    + Обратно совместимо
    + Масштабно
    – Не безопасно
    – Не гибко

    View Slide

  57. Решение (вариант 2): локально
    57

    View Slide

  58. ➢ Префикс (или иной) – для различия имен
    ➢ Аннотация – для перекрытия исходного бина
    Пояснения к решению 2
    + Безопасно
    + Контролируемо
    + Гибко
    58
    – Не масштабируемо
    – [Трудоемко]

    View Slide

  59. Оптимизация
    производительности

    View Slide

  60. Есть хорошая новость
    … Spring Boot 2.1 and Spring 5.1
    have some quite nice optimizations
    for startup time and heap usage
    https://spring.io/blog/2018/12/12/how-fast-is-spring
    60

    View Slide

  61. По данным испытаний от разработчиков
    Время запуска
    на Tomcat
    сократилось
    на ≈14%
    https://github.com/dsyer/spring-boot-allocations
    61

    View Slide

  62. 0
    2
    4
    6
    8
    10
    12
    14
    16
    18
    20
    Время старта микросервисов, сек
    По нашему опыту
    Запуск ускорился на ≈20%
    62

    View Slide

  63. Источники вдохновения от Dave Syer (@david_syer):
    ➢ https://spring.io/blog/2018/12/12/how-fast-is-spring
    ➢ https://www.youtube.com/watch?v=97UTDmonq7w
    ➢ https://github.com/dsyer/spring-boot-allocations
    Как еще можно ускорить запуск?
    63

    View Slide

  64. Кардинальный метод ускорения
    64
    https://jpoint.ru/talks/1emn9byzaklzozk6ec56dp

    View Slide

  65. ➢ Fix the location of the Spring Boot config file(s)
    Удобно (кое-где), но не очень эффективно
    ➢ Unpack the fat jar and run with an explicit classpath
    Перспективно
    ➢ Run the JVM with –noverify
    Сомнительно, см. https://www.youtube.com/watch?v=-OocG7tFIOQ
    Опробованные способы (1/2)
    65

    View Slide

  66. ➢ Use Class Data Sharing (CDS)
    Не просто, но полезно (см. далее)
    ➢ «Let's make SpringBoot app start faster»
    https://dev.to/bufferings/lets-make-springboot-app-start-faster-k9m
    ➢ Use Spring Boot 2.1 and Spring 5.1
    Бесплатно, без регистрации, без СМС*
    Опробованные способы (2/2)
    66

    View Slide

  67. *)
    … several introspection algorithms
    have been streamlined …
    potentially causing side effects
    https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x
    67

    View Slide

  68. Lombok

    View Slide

  69. Причем здесь Lombok?
    Spring Boot 2.1 has upgraded to Lombok 1.18.x
    [which] will no longer generate
    a private, no-args constructor by default
    https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.1-Release-Notes
    69

    View Slide

  70. Причина изменения
    70
    https://github.com/rzwitserloot/lombok/issues/1708

    View Slide

  71. Пример из реальной жизни
    71

    View Slide

  72. И это работает!
    (по крайней мере,
    до 1.16.20)

    View Slide

  73. Запуск на Lombok 1.16.20
    73

    View Slide

  74. DeLombok
    74
    Пропало
    в 1.16.20

    View Slide

  75. Lombok Changelog (v1.16.20)
    BREAKING CHANGE: by default
    lombok no longer … generates
    @ConstructorProperties…
    Oracle … broke this annotation
    with the release of JDK9
    https://projectlombok.org/changelog
    75

    View Slide

  76. Причем тут JDK9?
    76
    https://docs.oracle.com/javase/9/docs/api/java/beans/ConstructorProperties.html

    View Slide

  77. Причем тут JDK9?
    77
    https://docs.oracle.com/javase/9/docs/api/java/beans/ConstructorProperties.html

    View Slide

  78. The reason we added this feature was that
    since java9 @ConstructorProperties moved
    to the module java.desktop,
    which is not added by default.
    https://github.com/rzwitserloot/lombok/issues/1708
    Зачем добавили extraPrivate=true?
    78

    View Slide

  79. 1. Вернуть генерацию аннотации вручную:
    ➢ Требует зависимости от на Jigsaw
    2. Использовать аннотацию
    ➢ Делает класс изменяемым (mutable)
    ➢ Может не помочь на 1.18, потому что…
    Варианты решения
    79

    View Slide

  80. Lombok Changelog (v1.18.0)
    BREAKING CHANGE: configuration key
    lombok.noArgsConstructor.extraPrivate
    is now false by default
    https://projectlombok.org/changelog
    80

    View Slide

  81. 1. Вернуть генерацию конструктора вручную:
    2. Использовать обходные пути:
    ➢ https://github.com/rzwitserloot/lombok/issues/1708
    Варианты решения II
    81

    View Slide

  82. Краткая хроника событий
    82
    F A I L
    1.18.0: переключили extraPrivate=false
    1.16.22: добавили extraPrivate=true
    1.16.20: убрали @ConstructorProperties

    View Slide

  83. Не все то золото,
    что Lombok

    View Slide

  84. ➢ Завести в проекте файл
    ➢ Договориться с командой о порядке применения lombok
    Что можно сделать?
    84

    View Slide

  85. Пример файла
    85

    View Slide

  86. ➢ Завести в проекте файл
    ➢ Договориться с командой о порядке применения lombok
    ➢ Не полагаться на версию Lombok из Spring Boot BOM
    ➢ Не забывать о delombok
    ➢ ;)
    Что можно сделать?
    86

    View Slide

  87. Spring Cloud Greenwich

    View Slide

  88. Проекты Spring Cloud Netflix
    переведены в режим поддержки
    88

    View Slide

  89. Что значит «Maintenance Mode»?
    89
    Не касается
    Eureka и модулей
    concurrency-limits
    ➢ https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now
    С 23.01.19
    минимум
    на 1 год
    Без новых фич,
    только правка
    багов и угроз

    View Slide

  90. Текущий вариант Альтернатива
    Hystrix Resilience4j
    Hystrix Dashboard / Turbine Micrometer + Monitoring System
    Ribbon Spring Cloud Loadbalancer
    Zuul 1 Spring Cloud Gateway
    Archaius 1
    Spring Boot external config +
    Spring Cloud Config
    К счастью, есть альтернативы
    90

    View Slide

  91. Spring Cloud Greenwich
    зависит от OpenFeign 10.1.0
    91

    View Slide

  92. Изменение в API OpenFeign: ответы
    92

    View Slide

  93. Изменение в API OpenFeign: запросы
    93

    View Slide

  94. Подробнее:
    В Greenwich появилась поддержка @QueryMap
    94
    POJO с полями
    login и password

    View Slide

  95. OpenFeign поддерживает Java HTTP Client
    95
    https://github.com/OpenFeign/feign#java-11-http2
    ➢ Обеспечивает работу по HTTP/2
    ➢ Требует запуска на Java 11+

    View Slide

  96. [Standard] HTTP Client (JEP-321)
    96

    View Slide

  97. А если хочется узнать больше
    97
    https://jpoint.ru/talks/35watcftbrvf8a6xrqeykj

    View Slide

  98. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  99. Базовый образ JDK
    Для запуска в Docker

    View Slide

  100. ➢ При Java 8 был популярен образ
    В чем вопрос?
    100
    *
    ✓ Проверенный
    ✓ Обновляемый
    ✓ Легкий (80 МБ)
    * Alpine – компактный
    дистрибутив Linux
    ➢ Для Java 11 такого образа нет

    View Slide

  101. 101
    В Java 11 больше нет JRE.
    Но можно собрать из модулей.

    View Slide

  102. И как это сделать?
    102
    https://2018.jokerconf.com/2018/talks/4sanwhahpe8kgagmceqsyk

    View Slide

  103. Официальный образ
    весит ≈270 МБ

    View Slide

  104. ➢ Использовать AdoptOpenJDK
    https://github.com/AdoptOpenJDK/openjdk-docker
    ➢ Перейти на Azul Zulu OpenJDK
    или на Bellsoft Liberica OpenJDK
    ➢ Собрать самому
    https://stackoverflow.com/a/53669152/3507435
    ➢ Дождаться реализации проекта Portola
    https://openjdk.java.net/projects/portola/
    Некоторые способы остаться на Alpine
    104



    View Slide

  105. ➢ Пример тега
    ➢ Включают опцию
    ➢ Поставляются с HotSpot и OpenJ9
    Образы AdoptOpenJDK
    105
    The Alpine Linux and the slim images
    are not yet TCK certified
    https://github.com/AdoptOpenJDK/openjdk-docker

    View Slide

  106. Подробнее о других вариантах
    106
    https://jpoint.ru/talks/35hks9g6etavlgijj8nfvh

    View Slide

  107. Оптимизация логирования
    107

    View Slide

  108. ➢ Spring Boot по умолчанию использует Logback
    ➢ Logback отправляет логи в ELK* асинхронно
    ➢ За отправку отвечает Logback Logstash Appender
    ➢ Он поддерживает несколько стратегий ожидания записей
    Контекст задачи
    108
    * ELK – Elastic[Search]
    & Logstash & Kibana

    View Slide

  109. Обычно подходит стратегия sleeping
    109
    … it attempts to be conservative
    with CPU usage …
    A common use case is
    for asynchronous logging.
    https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started

    View Slide

  110. Но если хочется
    большего…
    110

    View Slide

  111. 111
    В Java 9 добавлен метод
    Thread#onSpinWait

    View Slide

  112. Пример применения
    112
    ➢ Реализован в HotSpot для x86 (инструкцией )
    Java 9+
    JEP-285

    View Slide

  113. Подключение стратегии к Logback
    113

    View Slide

  114. Не все стратегии
    одинаково экономны
    с CPU
    0%
    20%
    40%
    60%
    80%
    100%
    Blocking Sleeping BusySpin
    Стратегии ожидания
    Загрузка CPU при бездействии, %

    View Slide

  115. Когда пора менять стратегию?
    115
    ➢ https://github.com/logstash/logstash-logback-encoder/tree/logstash-logback-encoder-5.2#async-appenders
    Размер буфера
    по умолчанию

    View Slide

  116. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  117. Single-File Source-Code Programs
    a.k.a. Java Script A Script in Java

    View Slide

  118. Новый режим запуска программ в Java 11
    As of JDK 10, the java launcher
    operates in three modes …
    Here we add a new, fourth mode:
    launching a class declared in a source file
    https://openjdk.java.net/jeps/330
    118

    View Slide

  119. Java 11 умеет вот так:
    ➢ Под капотом используется javac
    ➢ Класс компилируется в память (не на диск)
    ➢ Custom class loader → application class loader *
    * Классы библиотек не видят стартовый класс
    Single-File Source-Code Java Programs
    119
    Java 11+
    JEP-330

    View Slide

  120. Shebang Files
    А еще Java 11 умеет вот так:
    120

    View Slide

  121. ➢ Файл должен быть исполняемым ( )
    ➢ Номера строк в ошибках остаются корректными
    ➢ Имя скрипта не обязано совпадать с именем класса
    Особенности Shebang Files
    121

    View Slide

  122. 122
    – Вот же круто!..
    А зачем?

    View Slide

  123. ➢ Может расширяться при помощи плагинов
    ➢ Плагин – любой исполняемый файл
    ➢ Традиционно плагины писались
    на Go, Shell, Python, Groovy, …
    ➢ Теперь можно писать еще и на Java
    Helm – пакетный менеджер для Kubernetes
    123

    View Slide

  124. Преимущества плагина на Java
    124
    ≈100%
    переносимость
    Не нужен отдельный
    runtime
    Проще поддержка
    (меньше языков)

    View Slide

  125. Пример подключения Java-плагина к Helm
    125
    Файл – обычный Java класс
    с методом и без shebang line.

    View Slide

  126. ➢ Нет поддержки shebang line в IDE
    https://youtrack.jetbrains.com/issue/IDEA-205455
    ➢ Нельзя указать кодировку скрипта
    ➢ Запуску подлежит только один файл
    Поправки на реальность
    126

    View Slide

  127. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  128. ➢ Разные экземпляры JVM загружают
    одни и те же классы JDK
    ➢ На это тратится время CPU и пространство RAM
    ➢ Идея 1: загрузить эти классы в архив и расшарить
    его между экземплярами JVM
    ➢ Идея 2: сделать то же самое для классов
    приложения и сторонних библиотек
    Суть [App]CDS в одном слайде
    128
    CDS
    AppCDS

    View Slide

  129. 1. Составить список разделяемых классов
    2. Упаковать все классы списка в архив
    3. Запустить приложение с использованием архива
    Актуальная инструкция по применению CDS
    129
    * но это не точно
    ** но это не обязательно
    *** но можно и не все
    **** но может не получиться
    *
    **
    ***
    ****

    View Slide

  130. ➢ Задача: разместить максимум классов в shared-архиве
    ➢ Объект: микросервис на Spring Boot & Cloud (Zuul)
    ➢ Режим: только запуск (локально, JDK 11)
    ➢ Инструменты: VisualVM, ,
    Условия эксперимента
    130

    View Slide

  131. AppCDS + Spring Boot: в чем сложность?
    CDS/AppCDS supports archiving
    classes from JAR* files only
    https://docs.oracle.com/en/java/javase/11/tools/java.html
    131
    * Но не “über” JAR!

    View Slide

  132. AppCDS: повод похудеть для “fat JAR”
    132
    В файле :
    ➢ – прикладной класс
    ➢ – содержимое
    В Ж У Х !
    *
    *

    View Slide

  133. Создание дампа классов для AppCDS
    133

    View Slide

  134. Анализируем
    134

    View Slide

  135. Распределение источников классов
    135
    0 2000 4000 6000 8000 10000
    AppCDS
    default CDS
    -Xshared:off
    jrt:/ file:/ shared

    View Slide

  136. Время запуска микросервиса
    136
    8
    9
    10
    11
    -Xshared:off default CDS AppCDS
    Длительность старта
    1 instance
    sec
    Снижение ≈18%

    View Slide

  137. Потребление памяти (RSS)
    137
    1250
    1300
    1350
    1400
    1450
    1500
    -Xshared:off default CDS AppCDS
    Resident Set Size
    5 instances
    MB
    Прирост ≈13%

    View Slide

  138. Теперь, благодаря AppCDS,
    Java сможет отжирать
    больше памяти
    за меньшее время!
    Или нет?..
    138

    View Slide

  139. Поправка на реальность
    … the memory footprint of a process …
    might appear to increase,
    because more pages are mapped
    to the process’s address space
    https://docs.oracle.com/en/java/javase/11/vm/class-data-sharing.html
    139

    View Slide

  140. Потребление памяти (PSS)
    140
    1000
    1050
    1100
    1150
    1200
    -Xshared:off default CDS AppCDS
    Proportional Shared Size
    5 instances
    MB
    Снижение ≈15%

    View Slide

  141. 141
    Профит в том, что
    та же память достанется
    другим JVM процессам

    View Slide

  142. – Требует много ручных действий
    + Улучшает и время старта, и потребление памяти
    + Легко применим для основных классов JDK
    + Активно развивается и обрастает практиками
    [App]CDS: текущий расклад дел
    142

    View Slide

  143. А если хочется деталей…
    143
    https://2018.jbreak.ru/talks/76so01njvm2a0eqgagysm

    View Slide

  144. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  145. Мы часто пишем
    наброски кода
    для проверки гипотез
    и создания прототипов

    View Slide

  146. Прототипы можно писать в:
    ➢ JUnit тестах
    ➢ IDEA Scratches
    ➢ методах main() в прикладных классах
    ➢ (свой вариант)
    ➢ JShell (не путать с “JS hell”)
    JEP-222, Java 9
    146
    _______________________________________________________________
    (не надо так делать)
    А зачем!?

    View Slide

  147. View Slide

  148. Дано:
    ➢ Библиотека Spring Cloud Commons
    ➢ Метод
    ➢ Возвращает «внешний» сетевой адрес машины
    Найти:
    ➢ Что вернет метод при вызове изнутри Docker-контейнера?
    Пример применения
    148

    View Slide

  149. Предсказуемо,
    не правда ли?
    149

    View Slide

  150. Поправка на реальность: Spring Boot
    ➢ JShell нужны классы приложения и библиотек
    ➢ Классы запакованы в über JAR/WAR
    ➢ JShell не умеет работать с такими архивами
    150

    View Slide

  151. Вариант решения
    1. Распаковать über JAR/WAR
    2. Составить значение опции для JShell
    3. Запустить JShell с этой опцией
    4. Упахаться, повторяя это каждый раз
    Автоматизировать шаги 1-3
    151
    jshellw – обертка над JShell для запуска
    с classpath’ом из Spring Boot Jar/War
    https://github.com/toparvion/springboot-jshell-adapter

    View Slide

  152. Запуск JShell через обертку
    152
    jshellw – обертка над JShell для запуска
    с classpath’ом из Spring Boot Jar/War
    https://github.com/toparvion/springboot-jshell-adapter

    View Slide

  153. Проверка корректности classpath
    153
    jshellw – обертка над JShell для запуска
    с classpath’ом из Spring Boot Jar/War
    https://github.com/toparvion/springboot-jshell-adapter

    View Slide

  154. Запуск прототипа в JShell
    154
    jshellw – обертка над JShell для запуска
    с classpath’ом из Spring Boot Jar/War
    https://github.com/toparvion/springboot-jshell-adapter

    View Slide

  155. Другие применения JShell в контейнерах
    155
    Отладка
    операций
    с файлами
    Работа со
    свойствами
    окружения
    Тестирование
    специфичных
    библиотек (API)

    View Slide

  156. 1. Погружение
    2. Особенности перехода
    ➢ Сборка проекта
    ➢ Обновление Spring
    ➢ Deployment
    3. Новшества платформы
    ➢ Single-File Programs
    ➢ Class Data Sharing
    ➢ JShell
    4. Всплытие

    View Slide

  157. Обновлять Java –
    как делать ремонт:
    не обязательно,
    сложно, но полезно

    View Slide

  158. ➢ Сборка:
    ➢ Maven 3.5
    ➢ Gradle 5.1
    ➢ Spring:
    ➢ Boot 2.1
    ➢ Framework 5.1
    ➢ Cloud Greenwich
    ➢ Lombok 1.18
    Версии инструментов с поддержкой Java 11
    158

    View Slide

  159. 159
    Java 8 (пока) никуда не уходит ☺

    View Slide

  160. Когда ждать следующей мажорной версии?
    160
    There are no “major releases” per se any more …
    Instead there is a steady stream
    of “feature releases.”
    https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence

    View Slide

  161. ➢ «На каждый чих»
    По мере появления фиксов
    ➢ При выходе feature releases
    2 раза в год (март, сентябрь)
    ➢ При выходе LTS releases
    1 раз в 3 года (2014, 2018, 2021)
    Режимы обновления на любой вкус
    161

    View Slide

  162. Диетологи советуют
    питаться часто,
    но по чуть-чуть

    View Slide

  163. Владимир Плизгá
    ЦФТ Q & A

    View Slide