Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spring Boot VS Micronaut — Smallest Framework B...

Spring Boot VS Micronaut — Smallest Framework Battle #jokerconf

Вы занимаетесь энтерпрайз-разработкой и работаете с неповоротливыми серверами приложений? Вы каждый день реализуете все интерфейсы EJB 2.0 и упаковываете их в OSGI-бандл? Ваши друзья рассказывают вам про новые легковесные фреймворки, а у вас нет времени их попробовать?

Мы поможем вам найти ответ на вопрос, идти ли в дивный новый мир (но это не точно) или же остаться в уютном и тёплом углу со мхом. Вместе с вами мы попробуем разобраться, где же эталон меры «микро» у фреймворка и есть ли он. Начнём мы, конечно же, со Spring Boot. Злые языки скажут, что Spring Boot бы похудеть, но у нас есть ответ этим толстым микросервисам! И, чтобы не было так скучно, мы выбрали противника уже не такому хипстерскому SB2 — Micronaut. Хотя, может, и в семействе Spring Boot найдется кто-то маленький.

На деле, разрабатывая и тестируя, тестируя и разрабатывая, мы с вами посмотрим на компромиссы разработки на SB2 и Micronaut. Посмотрим, кто же самый-самый… Самый реактивный, самый удобный, самый «облачный». Да и вообще — годится ли «микро» для production?

https://jokerconf.com/2018/talks/1vzkputteosikmmakiqgci/

Kirill Tolkachev

October 20, 2018
Tweet

More Decks by Kirill Tolkachev

Other Decks in Technology

Transcript

  1. Как оценить «микроскопичность» ? Скорость Старта Работы Падения Память На

    старте Мусорят На запрос Простота Разработки Поддержки Обновления 16
  2. Как оценить «микроскопичность» ? Скорость Старта Работы Падения Память На

    старте Мусорят На запрос Простота Разработки Поддержки Обновления 17
  3. 35

  4. Условия - Intel Core I5 3.3 GHz - 16GB -

    OSX 10.13.6 - Java 8.0.181-oracle(build 1.8.0_181-b13) 39
  5. ➜ mn create-federation buster --services application,categories,mess... MN CLI умеет создавать

    федерации 46 http://buster.igg.biz/iwantbeer/{nickname}/{money}
  6. Micronaut federation RC1 | Generating Java project..... | Error Error

    occurred running Micronaut CLI: null java.lang.NullPointerException at io.mn.cli.pr.co.AbstractCreateCommand$_addDependentFeatures_closure17.doCall at io.mn.cli.pr.co.AbstractCreateCommand.addDependentFeatures(AbstractCreateCommand.groovy:571) at io.mn.cli.pr.co.AbstractCreateCommand.populateFeatures(AbstractCreateCommand.groovy:544) at io.mn.cli.pr.co.AbstractCreateCommand.evaluateFeatures(AbstractCreateCommand.groovy:477) at io.mn.cli.pr.co.AbstractCreateCommand.handle(AbstractCreateCommand.groovy:272) at io.mn.cli.pr.co.CreateFederationCommand.handle(CreateFederationCommand.groovy:92) at io.mn.cli.MicronautCli.executeCommand(MicronautCli.groovy:351) at io.mn.cli.MicronautCli.execute(MicronautCli.groovy:234) at io.mn.cli.MicronautCli.main(MicronautCli.groovy:175) | Error Error occurred running Micronaut CLI: null 48 MN CLI federation RC1 http://buster.igg.biz/iwantbeer/{nickname}/{money}
  7. Micronaut federation RC2 49 $ tree -L 1 . ├──

    bar-emulator ├── places-api └── beer-api
  8. Micronaut federation RC2 50 $ tree -L 1 . ├──

    bar-emulator ├── places-api └── beer-api Никак не связанные проекты
  9. Micronaut federation RC3 51 $ tree -L 1 . ├──

    bar-emulator ├── places-api ├── beer-api ├── gradle ├── gradlew ├── gradlew.bat └── settings.gradle Связанные на уровне сборки проекты
  10. Spring DI + AOP 62 Compile _$ java -jar build/libs/app.jar

    \ --server.port=8081 Run Scan Classpath java -jar javac
  11. Spring DI + AOP _$ java -jar build/libs/app.jar \ --server.port=8081

    INFO 28687 main: Refreshing... ... INFO 28687 nio-1: Started HttpServer on :808 ... 63 Compile Run Scan Classpath Create Definitions reflection java -jar javac
  12. Spring DI + AOP 64 Compile Run Scan Classpath Create

    Definitions Inject Beans _$ java -jar build/libs/app.jar \ --server.port=8081 INFO 28687 main: Refreshing... ... INFO 28687 main: BeanFactory id=... INFO 28687 main: f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring ... INFO 28687 nio-1: Started HttpServer on :808 Cglib, Proxy reflection java -jar javac
  13. Inject Beans Micronaut DI + AOP 68 Compile APT/AST Transform

    Pure Java Inject new instance java -jar javac/groovyc
  14. Что там генерит Micronaut? m.b.a.controller.$BeerControllerDefinition$$exec1 m.b.a.controller.$BeerControllerDefinitionClass m.b.a.service.$BarServiceDefinitionClass$$AnnotationMetadata m.b.a.Application m.b.a.service.$BarServiceDefinition m.b.a.controller.BeerController

    m.b.a.entity.Order m.b.a.controller.$BeerControllerDefinition m.b.a.controller.$BeerControllerDefinitionClass$$AnnotationMetadata m.b.a.service.$BarServiceDefinitionClass m.b.a.service.BarService m.b.a.controller.$BeerControllerDefinition$$exec1$$AnnotationMetadata 69
  15. public class $BarServiceDefinition extends AbstractBeanDefinition<BarService> implements BeanFactory<BarService> { @Override public

    BarService build(BeanResolutionContext beanResolutionContext, BeanContext beanContext, BeanDefinition<BarService> beanDefinition) { BarService barService = new BarService(); barService = (BarService)this.injectBean(beanResolutionContext, beanContext, barService); return barService; } … } Как работает статический Injection 71
  16. public class $BeerControllerDefinition extends AbstractBeanDefinition<BeerController> implements BeanFactory<BeerController> { @Override public

    BeerController build(BeanResolutionContext context, BeanContext beanContext, BeanDefinition<BeerController> beanDefinition) { BeerController beerController = new BeerController( (BarService)super.getBeanForConstructorArgument(context,beanContext, 0) ); beerController = (BeerController)this.injectBean(beanResolutionContext, beanContext, beerController); return beerController; } ... } Как работает статический Injection 72
  17. 78

  18. Табличка с результатами 81 название →__ условие →__ -Xmx/mb время

    старта/ms -Xmx=enough время старта/ms -Xmx=min mn 6 950 1113 mngroovy 7 950 1393 boot 11 2200 7093 spark 3 350 348 kofu 6 1500 2500 jafu 5 1041 5600
  19. Победители в номинациях Основной победитель в поединке – Micronaut 85

    Шустрый мелкий Старичок – Spark Я не толстый – Spring Boot
  20. Победители в номинациях Основной победитель в поединке – Micronaut 86

    Шустрый мелкий Старичок – Spark Я не толстый – Spring Boot Тёмная лошадка – Spring Fu
  21. Табличка с результатами 89 название →__ условие →__ -Xmx/mb время

    старта/ms -Xmx=enough время старта/ms -Xmx=min mn 6 950 1113 mngroovy 7 950 1393 boot 11 2200 7093 spark 3 350 348 kofu 6 1500 2500 jafu 5 1041 5600
  22. GraalVM - в погоне за скоростью - Собираем долго -

    Запускаем быстро - Работает – непонятно как 95
  23. $ native-image --no-server \ -H:Name=target/app -Dio.netty.noUnsafe=true \ -H:+ReportUnsupportedElementsAtRuntime \ -cp

    ".:$(echo target/BOOT-INF/lib/*.jar | tr ' ' ':')"\ :target/BOOT-INF/classes:target \ com.example.jafu.beer.api.Application В погоне за GraalVM - сборка 97
  24. $ native-image --no-server \ -H:Name=target/app -Dio.netty.noUnsafe=true \ -H:+ReportUnsupportedElementsAtRuntime \ -cp

    ".:$(echo target/BOOT-INF/lib/*.jar | tr ' ' ':')"\ :target/BOOT-INF/classes:target \ com.example.jafu.beer.api.Application В погоне за GraalVM - сборка 98 maven/gradle dependencies
  25. $ native-image --no-server \ -H:Name=target/app -Dio.netty.noUnsafe=true \ -H:+ReportUnsupportedElementsAtRuntime \ -cp

    ".:$(echo target/BOOT-INF/lib/*.jar | tr ' ' ':')"\ :target/BOOT-INF/classes:target \ com.example.jafu.beer.api.Application В погоне за GraalVM - сборка 99 Скомпилированный src/
  26. java.lang.InstantiationException: В погоне за GraalVM - сборка Reflection 100 Type

    `o.a.l.l.m.ReusableMessageFactory` can not be instantiated reflectively as it does not have a no-parameter constructor or the no-parameter constructor has not been added explicitly to the native image
  27. { "name": "org.s.b.a...$...FactoryBean", "allDeclaredConstructors": true }, { "name": "org.s.b.a.e.PropertiesPropertySourceLoader", "allDeclaredConstructors":

    true }, { "name": "org.s.b.a.e.YamlPropertySourceLoader", "allDeclaredConstructors": true }, { "name": "org.s.b.c.event.EventPublishingRunListener", "allDeclaredConstructors": true }, ... { "name": "org.s.b.logging.java.JavaLoggingSystem", "allDeclaredConstructors": true }, { "name": "org.s.b.a.thymeleaf.ThymeleafTemplate...", В погоне за GraalVM - сборка Reflection 102 1 2 3 4 5 6 7 8 N 201 202 203
  28. Пока все руками или из репозитория Dave Syer GraalVM Run

    - Micronaut Win 104 Сам генерит reflect.json
  29. Пока все руками или из репозитория Dave Syer GraalVM Run

    - Micronaut Win 105 Сам генерит reflect.json
  30. GraalVM Run - Micronaut Win!!! 107 i.m.r.Micronaut - Startup completed

    in 50 ms o.s.b.Spring - Started application in 120 ms
  31. Табличка с результатами 112 название →__ условие →__ -Xmx/mb min

    время старта/ms -Xmx=enough время старта/ms -Xmx=min mn 19 2400 6000 spring 15 3400 11000 spark 5 600 900
  32. Победители в номинациях Скрытая надежда – Spring построй счастье своими

    руками — Spark 116 Уже не торт, но еще вкусно – Micronaut
  33. CLI — реванш 121 • spring cli • micronaut cli

    → spring → mn → $ spring cloud eureka → $ -
  34. Табличка с результатами 123 название →__ условие →__ -Xmx/mb время

    старта -Xmx=enough/ms время старта -Xmx=min/ms mn 21 3000 7500 spring 22 5800 30000
  35. Кратко о работе с очередями 131 Пока удобнее – Spring

    Boot Погоди внедрять я доделаю – Micronaut
  36. Табличка с результатами 134 название →__ условие →__ -Xmx/mb время

    старта -Xmx=enough/ms время старта -Xmx=min/ms mn_cloud_db 21 3000 7500 mn_cloud_mq_cache 15 3000 3000 spring_cloud_mq_cache 24 8000 64000
  37. Табличка с результатами 135 название →__ условие →__ -Xmx/mb время

    старта -Xmx=enough/ms время старта -Xmx=min/ms mn 15 3000 3000 spring 24 8000 64000 Надо было с этого начинать
  38. 137 Выводы 1. MicroFramework = 10-6 × Framework 2. Область

    применимости узкая Нахуа?
  39. 138 Выводы 1. MicroFramework = 10-6 × Framework 2. Область

    применимости узкая 3. Разные внутри - одинаковые снаружи Нахуа?
  40. 139 Выводы 1. MicroFramework = 10-6 × Framework 2. Область

    применимости узкая 3. Разные внутри - одинаковые снаружи → Лучшее взято из Spring Нахуа?
  41. Интересные ресурсы Demo Source [Spring Blog] The Evolution Of Spring

    Fu Spring Fu Sample Sources [dsyer] Spring Init Experiments source [GraalVM Blog] Understanding Class Initialization in GraalVM Native Image Generation [GraalVM Blog] Netty Native Image Generation Micronaut docs 140
  42. Кто же пошел в бар и в какой { "type":

    "American Pale Ale", "bottles": 1603, "totalPrice": 223962, "place": { "name": "Relaxed-Beagle", "averagePrice": 978, "maxTableSize": 33 }, 141 "companions": [ "ivan", "pavel_ch", "kolemik", "sberkek", "yegor256", "vasya", "NPE", "baruh", "alexanzer", "ctap", "alexander.kochin", "andrew-q1", "Vitoss", "her_s_gory", "andrewserdyuk", "barnaulaltayka", "=)", "shurmeleva", "mgorelikov", "tolkv" ] }