SlideShare une entreprise Scribd logo
1  sur  41
Télécharger pour lire hors ligne
MichelSchudel
What issues do Micronaut and Quarkus address?
• Lower memory footprint, faster startup
• Ahead-Of-Time (AOT) compilation
• Capability to build native images with GraalVM
• Designed from the ground up with
microservices in mind
• Built-in support for Fault Tolerance
• Monitoring / metrics
• Service discovery
• Cloud deployment
Project source
Website
Start/ Backed by
Github stars
#Contributors
Build tools
Languages
First Commit
github: micronaut-
project/micronaut-
core
micronaut.io
ObjectComputing
2.9K
163
Maven, Gradle
Java, Kotlin, Groovy
2017-03-16
github:
quarkusio/quarkus
quarkus.io
Red Hat
2.9K
175
Maven, Gradle
Java, Kotlin, Scala
2018-06-22
Round 1: Getting started
Round 2: Programming model
Round 3: Database persistency
Round 4: Test support
Round 5: Native images, startup and heap
The match
Conference application
Conference API
Conference Service
Conference RepositoryCountryClient
H2External country service
http(s)
GET /conferences
POST /conferences
{ “name”: “Devoxx”}
{ “name”: “Devoxx”}
{ “name”: “Devoxx”,
“countryName”: “Belgium”}
{ “countryName”: “Belgium”}/conf/{name}/country
GET /conferences-with-country
Let’s start the applications!
mvn compile quarkus:dev
mvn package exec:exec
(or start the main class)
8100
8101
REST Controller
@Path("/conferences")
public class ConferenceResource {
@Inject
ConferenceService conferenceService;
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Conference> getAll() {
return conferenceService.getAll();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void create(Conference conference) {
conferenceService.create(conference);
}
@Controller("/conferences")
public class ConferenceController {
@Inject
ConferenceService conferenceService;
@Get
@Produces(MediaType.APPLICATION_JSON)
public List<Conference> getAll() {
return conferenceService.getAll();
}
@Post
@Consumes(MediaType.APPLICATION_JSON)
public void create(Conference conference) {
conferenceService.create(conference);
}
Conference API
Conference Service
RepoCountryClient
Conference service
@Singleton
public class ConferenceService {
@Inject
private ConferenceRepository conferenceRepository;
@Inject
CountryClient countryClient;
public List<Conference> getAll() {
return conferenceRepository.findAll();
}
public void create(Conference conference) {
conferenceRepository.save(conference);
}
@Singleton
public class ConferenceService {
@Inject
private ConferenceRepository conferenceRepository;
@Inject
@RestClient
CountryClient countryClient;
public List<Conference> getAll() {
return conferenceRepository.findAll();
}
public void create(Conference conference) {
conferenceRepository.save(conference);
}
Conference API
Conference Service
RepoCountryClient
@Path("/")
@RegisterRestClient
@Retry(maxRetries = 3, delay = 2)
@CircuitBreaker(successThreshold = 1)
public interface CountryClient {
@GET
@Path("/conferences/{name}/country")
Country getCountry(@PathParam("name") String name);
@Client("${country.service.url}")
@Retryable(attempts = “3", delay = "1s")
@CircuitBreaker(reset = "20s")
public interface CountryClient {
@Get("/conferences/{name}/country")
Country getCountry(String name);
mypackage.CountryClient/mp-rest/url=http://localhost:9000/
mypackage.CountryClient/mp-rest/scope=javax.inject.Singleton
country.service.url=http://localhost:9000/
application.properties application.properties / yml
Conference API
Conference Service
RepoCountryClient
REST client
Configuration
app.helloMessage=Hi there! app.helloMessage=Hi there!
application.properties application.properties / application.yml
@ConfigProperty(name = "app.helloMessage",
defaultValue="hello default!")
String helloMessage;
@ConfigProperties(prefix = "app")
public class ConferenceConfiguration {
@Size(min= 5)
public String helloMessage;
}
@Value("${app.helloMessage:hello default!}")
String helloMessage;
@ConfigurationProperties("app")
public class ConferenceConfiguration {
@Size(min = 5)
public String helloMessage;
}
@Property("app.helloMessage")
String helloMessage;
Configuration profiles
app.hello-message=Hi there!
%dev.app.hello-message=Hi from dev!
%test.app.hello-message=Hi from test!
%custom.app.hello-message=Hi from custom!
app.hello-message=Hi there!
application.properties application.properties / application.yml
• dev – during quarkus:dev unless
overridden
• test- during tests
• prod – default profile
• custom
mvnw quarkus:dev –Dquarkus.profile=test
application-test.properties / application-test.yml
app.hello-message=Hi from test!
mvnw exec:exec -Dmicronaut.environments=test
Custom Configuration
Create service file
/META-
INF/services/org.eclipse.microprofile.config.spi.ConfigSour
ce
public class CustomConfigSource implements ConfigSource {
@Override
public Map<String, String> getProperties() {
//my own implementation
return null;
}
@Override
public String getValue(String s) {
//my own implementation
return null;
}
@Override
public String getName() {
return "CustomConfigSource";
}
}
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-discovery-client</artifactId>
</dependency>
spring:
cloud:
config:
enabled: true
uri: http://localhost:8888/
micronaut:
config-client:
enabled: true
• HashiCorp Consul & Vault Support
• AWS Parameter Store Support
• Spring Cloud config server Support
JP
@Singleton
public class ConferenceRepository {
@Inject
EntityManager entityManager;
@Transactional
public List<Conference> findAll() {
TypedQuery<Conference> query = entityManager
.createQuery("select c from Conference c",
Conference.class);
return query.getResultList();
}
@Transactional
public void save(final Conference conference) {
entityManager.persist(conference);
}
}
@Singleton
public class ConferenceRepository {
@Inject
EntityManager entityManager;
@Transactional
public List<Conference> findAll() {
TypedQuery<Conference> query = entityManager
.createQuery("select c from Conference c",
Conference.class);
return query.getResultList();
}
@Transactional
public void save(final Conference conference) {
entityManager.persist(conference);
}
}
JPA persistency Conference API
Conference Service
RepoCountryClient
Improved Quarkus persistency with Panache
@Entity
public class Conference extends PanacheEntity {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
@Singleton
public class ConferencePanacheRepository {
public List<Conference> findAll() {
return Conference.listAll();
}
@Transactional
public void save(final Conference conference) {
conference.persist();
}
}
Micronaut Data
@Repository
public interface ConferenceCrudRepository extends CrudRepository<Conference, Long> {
List<Conference> findByName(String name);
List<Conference> listOrderByName();
List<Conference> listOrderByNameDesc();
List<Conference> findTop3ByNameLike(String name);
}
@Repository
public interface ConferenceCrudRepository extends CrudRepository<Conference, Long> {
}
@JdbcRepository
public interface ConferenceCrudRepository extends CrudRepository<Conference, Long> {
List<Conference> findByName(String name);
List<Conference> listOrderByName();
List<Conference> listOrderByNameDesc();
List<Conference> findTop3ByNameLike(String name);
}
No more
JPA / Hibernate needed!
Integration testing
@MicronautTest(environments = { "test" })
public class ConferenceITTest {
@Inject
EmbeddedServer embeddedServer;
@Test
@Transactional
public void testConferences() {
Conference conference = new Conference();
conference.setName("Devoxx");
given().body(conference)
.port(embeddedServer.getPort())
.contentType("application/json")
.when()
.post("/conferences")
.then()
.statusCode(200);
given().port(embeddedServer.getPort())
.when()
.get("/conferences")
.then()
.extract()
.path("[0].name")
.equals(“Devoxx");
}
application-test.yml
micronaut:
server:
port: -1
@QuarkusTest
public class ConferenceIT {
@Test
@Transactional
public void testConferences() {
Conference conference = new Conference();
conference.setName("Devoxx");
given().body(conference)
.contentType("application/json")
.when()
.post("/conferences")
.then()
.statusCode(204);
given()
.when()
.get("/conferences")
.then()
.extract()
.path("[0].name")
.equals("Devoxx");
}
quarkus.http.test-port=0
application.properties
Integration testing with Quarkus
@QuarkusTest
public class ConferenceIT {
@Inject
ConferenceResource conferenceResource;
@Test
public void testConferenceInternal() {
conferenceResource.getAll();
}
}
Testing internally
@Mock
@ApplicationScoped
@RestClient
public class MockCountryClient implements CountryClient {
@Override
public Country getCountryOfConference(String name) {
Country country = new Country();
country.setName("Belgium");
return country;
}
}
Mocking
@MicronautTest(environments = { "test" })
public class ConferenceITTest {
@Inject
private ConferenceController conferenceController;
@Test
public void testConferencesInternal() {
conferenceController.getAll();
}
@MockBean(CountryClient.class)
CountryClient countryClient() {
final CountryClient mock = Mockito.mock(CountryClient.class);
Country country = new Country();
country.setName("Belgium");
when(mock.getCountryOfConference(isA(String.class)))
.thenReturn(country);
return mock;
}
Integration testing native images
@SubstrateTest
public class NativeConferenceResourceIT extends ConferenceIT {
// Execute the same tests but in native mode.
}
Building native images with GraalVM
./mvnw package –Pnative –Dnative-
image.docker-build=true
docker build -f
src/main/docker/Dockerfile.native –t
conference-service-quarkus .
./mvnw package
docker build . –t
conference-service-micronaut
Include feature native-imageNo additional actions needed
Let’s run the applications!
JVM: port 8100
Native: port 8200
JVM: port 8101
Native: port 8201
docker run -i --rm -p 8200:8080
conference-service-quarkus
docker run -i --rm -p 8201:8080
conference-service-quarkus-micronaut
https://medium.com/graalvm/lightweight-cloud-native-java-
applications-35d56bc45673
Research Oleg Šelajev (@shelajev)
https://medium.com/graalvm/lightweight-cloud-native-java-
applications-35d56bc45673
Research Oleg Šelajev (@shelajev)
Summary
• Small images, faster startup,
lowest mem usage
• Microprofile Programming
model
• Really fast release cycle
• Close to Spring’s programming model
• Feels little more mature
• Micronaut Data
• More extensive support for existing
cloud environments
• Could do with a nicer
persistency solution
• Few of out-of-the-box
monitoring
• I’d like an initializer site!
MichelSchudel
https://github.com/MichelSchudel/conference-service-quarkus
https://github.com/MichelSchudel/conference-service-micronaut

Contenu connexe

Tendances

DevOps with GitHub Actions
DevOps with GitHub ActionsDevOps with GitHub Actions
DevOps with GitHub ActionsNilesh Gule
 
Quarkus - a next-generation Kubernetes Native Java framework
Quarkus - a next-generation Kubernetes Native Java frameworkQuarkus - a next-generation Kubernetes Native Java framework
Quarkus - a next-generation Kubernetes Native Java frameworkSVDevOps
 
Asynchronous JavaScript Programming
Asynchronous JavaScript ProgrammingAsynchronous JavaScript Programming
Asynchronous JavaScript ProgrammingHaim Michael
 
CICD Pipeline Using Github Actions
CICD Pipeline Using Github ActionsCICD Pipeline Using Github Actions
CICD Pipeline Using Github ActionsKumar Shìvam
 
Introduction to Github Actions
Introduction to Github ActionsIntroduction to Github Actions
Introduction to Github ActionsKnoldus Inc.
 
Introduction to the Disruptor
Introduction to the DisruptorIntroduction to the Disruptor
Introduction to the DisruptorTrisha Gee
 
Git and Github slides.pdf
Git and Github slides.pdfGit and Github slides.pdf
Git and Github slides.pdfTilton2
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An IntroductionBehzad Altaf
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub ActionsBo-Yi Wu
 
How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...
How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...
How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...Lucas Jellema
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개Wonchang Song
 
Concurrent Programming Using the Disruptor
Concurrent Programming Using the DisruptorConcurrent Programming Using the Disruptor
Concurrent Programming Using the DisruptorTrisha Gee
 
Gradle - the Enterprise Automation Tool
Gradle  - the Enterprise Automation ToolGradle  - the Enterprise Automation Tool
Gradle - the Enterprise Automation ToolIzzet Mustafaiev
 
Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18CodeOps Technologies LLP
 

Tendances (20)

Github in Action
Github in ActionGithub in Action
Github in Action
 
DevOps with GitHub Actions
DevOps with GitHub ActionsDevOps with GitHub Actions
DevOps with GitHub Actions
 
Quarkus - a next-generation Kubernetes Native Java framework
Quarkus - a next-generation Kubernetes Native Java frameworkQuarkus - a next-generation Kubernetes Native Java framework
Quarkus - a next-generation Kubernetes Native Java framework
 
Asynchronous JavaScript Programming
Asynchronous JavaScript ProgrammingAsynchronous JavaScript Programming
Asynchronous JavaScript Programming
 
GraalVm and Quarkus
GraalVm and QuarkusGraalVm and Quarkus
GraalVm and Quarkus
 
CICD Pipeline Using Github Actions
CICD Pipeline Using Github ActionsCICD Pipeline Using Github Actions
CICD Pipeline Using Github Actions
 
Introduction to Github Actions
Introduction to Github ActionsIntroduction to Github Actions
Introduction to Github Actions
 
Introduction to the Disruptor
Introduction to the DisruptorIntroduction to the Disruptor
Introduction to the Disruptor
 
Git and Github slides.pdf
Git and Github slides.pdfGit and Github slides.pdf
Git and Github slides.pdf
 
GoLang Introduction
GoLang IntroductionGoLang Introduction
GoLang Introduction
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An Introduction
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
 
How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...
How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...
How and Why GraalVM is quickly becoming relevant for developers (ACEs@home - ...
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
 
Concurrent Programming Using the Disruptor
Concurrent Programming Using the DisruptorConcurrent Programming Using the Disruptor
Concurrent Programming Using the Disruptor
 
Git and github
Git and githubGit and github
Git and github
 
Rust
RustRust
Rust
 
Gitlab, GitOps & ArgoCD
Gitlab, GitOps & ArgoCDGitlab, GitOps & ArgoCD
Gitlab, GitOps & ArgoCD
 
Gradle - the Enterprise Automation Tool
Gradle  - the Enterprise Automation ToolGradle  - the Enterprise Automation Tool
Gradle - the Enterprise Automation Tool
 
Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18
 

Similaire à Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!

Ruby on Rails vs ASP.NET MVC
Ruby on Rails vs ASP.NET MVCRuby on Rails vs ASP.NET MVC
Ruby on Rails vs ASP.NET MVCSimone Chiaretta
 
May 2010 - RestEasy
May 2010 - RestEasyMay 2010 - RestEasy
May 2010 - RestEasyJBug Italy
 
MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016
MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016
MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016PROIDEA
 
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Andrew Rota
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusEmily Jiang
 
softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EEAlexis Hassler
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5Darren Craig
 
Spring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud FoundrySpring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud FoundryJoshua Long
 
Native REST Web Services with Oracle 11g
Native REST Web Services with Oracle 11gNative REST Web Services with Oracle 11g
Native REST Web Services with Oracle 11gMarcelo Ochoa
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020Emily Jiang
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020Emily Jiang
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Webnickmbailey
 
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...Neo4j
 
Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?” Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?” Dakiry
 

Similaire à Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! (20)

Hexagonal architecture in PHP
Hexagonal architecture in PHPHexagonal architecture in PHP
Hexagonal architecture in PHP
 
Ruby on Rails vs ASP.NET MVC
Ruby on Rails vs ASP.NET MVCRuby on Rails vs ASP.NET MVC
Ruby on Rails vs ASP.NET MVC
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Arquitecturas de microservicios - Medianet Software
Arquitecturas de microservicios   -  Medianet SoftwareArquitecturas de microservicios   -  Medianet Software
Arquitecturas de microservicios - Medianet Software
 
May 2010 - RestEasy
May 2010 - RestEasyMay 2010 - RestEasy
May 2010 - RestEasy
 
Mashups
MashupsMashups
Mashups
 
MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016
MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016
MCE^3 - Kyle Fuller - End-to-end Building Web Services in-swift-mce-2016
 
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
 
softshake 2014 - Java EE
softshake 2014 - Java EEsoftshake 2014 - Java EE
softshake 2014 - Java EE
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
Spring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud FoundrySpring in the Cloud - using Spring with Cloud Foundry
Spring in the Cloud - using Spring with Cloud Foundry
 
Native REST Web Services with Oracle 11g
Native REST Web Services with Oracle 11gNative REST Web Services with Oracle 11g
Native REST Web Services with Oracle 11g
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Web
 
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
 
Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?” Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?”
 
Vertx daitan
Vertx daitanVertx daitan
Vertx daitan
 
Vertx SouJava
Vertx SouJavaVertx SouJava
Vertx SouJava
 

Plus de Michel Schudel

Testing an onion architecture - done right
Testing an onion architecture - done rightTesting an onion architecture - done right
Testing an onion architecture - done rightMichel Schudel
 
What makes a high performance team tick?
What makes a high performance team tick?What makes a high performance team tick?
What makes a high performance team tick?Michel Schudel
 
Atonomy of-a-tls-handshake-mini-conferentie
Atonomy of-a-tls-handshake-mini-conferentieAtonomy of-a-tls-handshake-mini-conferentie
Atonomy of-a-tls-handshake-mini-conferentieMichel Schudel
 
Spring boot Under Da Hood
Spring boot Under Da HoodSpring boot Under Da Hood
Spring boot Under Da HoodMichel Schudel
 
Cryptography 101 for Java Developers - Devoxx 2019
Cryptography 101 for Java Developers - Devoxx 2019Cryptography 101 for Java Developers - Devoxx 2019
Cryptography 101 for Java Developers - Devoxx 2019Michel Schudel
 
Cryptography 101 for_java_developers, Fall 2019
Cryptography 101 for_java_developers, Fall 2019Cryptography 101 for_java_developers, Fall 2019
Cryptography 101 for_java_developers, Fall 2019Michel Schudel
 
Cryptography 101 for Java Developers - JavaZone2019
Cryptography 101 for Java Developers - JavaZone2019Cryptography 101 for Java Developers - JavaZone2019
Cryptography 101 for Java Developers - JavaZone2019Michel Schudel
 
Java n-plus-1-incl-demo-slides
Java n-plus-1-incl-demo-slidesJava n-plus-1-incl-demo-slides
Java n-plus-1-incl-demo-slidesMichel Schudel
 
Cryptography 101 for Java developers
Cryptography 101 for Java developersCryptography 101 for Java developers
Cryptography 101 for Java developersMichel Schudel
 
Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!Michel Schudel
 
Cryptography 101 for Java developers
Cryptography 101 for Java developersCryptography 101 for Java developers
Cryptography 101 for Java developersMichel Schudel
 
Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!Michel Schudel
 
Test your microservices with REST-Assured
Test your microservices with REST-AssuredTest your microservices with REST-Assured
Test your microservices with REST-AssuredMichel Schudel
 

Plus de Michel Schudel (16)

Testing an onion architecture - done right
Testing an onion architecture - done rightTesting an onion architecture - done right
Testing an onion architecture - done right
 
What makes a high performance team tick?
What makes a high performance team tick?What makes a high performance team tick?
What makes a high performance team tick?
 
Atonomy of-a-tls-handshake-mini-conferentie
Atonomy of-a-tls-handshake-mini-conferentieAtonomy of-a-tls-handshake-mini-conferentie
Atonomy of-a-tls-handshake-mini-conferentie
 
Spring boot Under Da Hood
Spring boot Under Da HoodSpring boot Under Da Hood
Spring boot Under Da Hood
 
Cryptography 101 for Java Developers - Devoxx 2019
Cryptography 101 for Java Developers - Devoxx 2019Cryptography 101 for Java Developers - Devoxx 2019
Cryptography 101 for Java Developers - Devoxx 2019
 
Cryptography 101 for_java_developers, Fall 2019
Cryptography 101 for_java_developers, Fall 2019Cryptography 101 for_java_developers, Fall 2019
Cryptography 101 for_java_developers, Fall 2019
 
Cryptography 101 for Java Developers - JavaZone2019
Cryptography 101 for Java Developers - JavaZone2019Cryptography 101 for Java Developers - JavaZone2019
Cryptography 101 for Java Developers - JavaZone2019
 
Micronaut brainbit
Micronaut brainbitMicronaut brainbit
Micronaut brainbit
 
Java n-plus-1-incl-demo-slides
Java n-plus-1-incl-demo-slidesJava n-plus-1-incl-demo-slides
Java n-plus-1-incl-demo-slides
 
Cryptography 101 for Java developers
Cryptography 101 for Java developersCryptography 101 for Java developers
Cryptography 101 for Java developers
 
Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!Let's build a blockchain.... in 40 minutes!
Let's build a blockchain.... in 40 minutes!
 
Cryptography 101 for Java developers
Cryptography 101 for Java developersCryptography 101 for Java developers
Cryptography 101 for Java developers
 
Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!Let's Build A Blockchain... in 40 minutes!
Let's Build A Blockchain... in 40 minutes!
 
What's new in Java 11
What's new in Java 11What's new in Java 11
What's new in Java 11
 
Java 9 overview
Java 9 overviewJava 9 overview
Java 9 overview
 
Test your microservices with REST-Assured
Test your microservices with REST-AssuredTest your microservices with REST-Assured
Test your microservices with REST-Assured
 

Dernier

Zer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdfZer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdfmaor17
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsJean Silva
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...OnePlan Solutions
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolsosttopstonverter
 
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jGraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jNeo4j
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfRTS corp
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...Bert Jan Schrijver
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesKrzysztofKkol1
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdfAndrey Devyatkin
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptxVinzoCenzo
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingOpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingShane Coughlan
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?Alexandre Beguel
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogueitservices996
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slidesvaideheekore1
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...OnePlan Solutions
 
Data modeling 101 - Basics - Software Domain
Data modeling 101 - Basics - Software DomainData modeling 101 - Basics - Software Domain
Data modeling 101 - Basics - Software DomainAbdul Ahad
 

Dernier (20)

Zer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdfZer0con 2024 final share short version.pdf
Zer0con 2024 final share short version.pdf
 
Strategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero resultsStrategies for using alternative queries to mitigate zero results
Strategies for using alternative queries to mitigate zero results
 
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
Tech Tuesday Slides - Introduction to Project Management with OnePlan's Work ...
 
eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration tools
 
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4jGraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
GraphSummit Madrid - Product Vision and Roadmap - Luis Salvador Neo4j
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
 
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
2024-04-09 - From Complexity to Clarity - AWS Summit AMS.pdf
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptx
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full RecordingOpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
OpenChain AI Study Group - Europe and Asia Recap - 2024-04-11 - Full Recording
 
SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?SAM Training Session - How to use EXCEL ?
SAM Training Session - How to use EXCEL ?
 
Ronisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited CatalogueRonisha Informatics Private Limited Catalogue
Ronisha Informatics Private Limited Catalogue
 
Introduction to Firebase Workshop Slides
Introduction to Firebase Workshop SlidesIntroduction to Firebase Workshop Slides
Introduction to Firebase Workshop Slides
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
 
Data modeling 101 - Basics - Software Domain
Data modeling 101 - Basics - Software DomainData modeling 101 - Basics - Software Domain
Data modeling 101 - Basics - Software Domain
 

Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!

  • 2.
  • 3. What issues do Micronaut and Quarkus address? • Lower memory footprint, faster startup • Ahead-Of-Time (AOT) compilation • Capability to build native images with GraalVM • Designed from the ground up with microservices in mind • Built-in support for Fault Tolerance • Monitoring / metrics • Service discovery • Cloud deployment
  • 4. Project source Website Start/ Backed by Github stars #Contributors Build tools Languages First Commit github: micronaut- project/micronaut- core micronaut.io ObjectComputing 2.9K 163 Maven, Gradle Java, Kotlin, Groovy 2017-03-16 github: quarkusio/quarkus quarkus.io Red Hat 2.9K 175 Maven, Gradle Java, Kotlin, Scala 2018-06-22
  • 5. Round 1: Getting started Round 2: Programming model Round 3: Database persistency Round 4: Test support Round 5: Native images, startup and heap The match
  • 6. Conference application Conference API Conference Service Conference RepositoryCountryClient H2External country service http(s) GET /conferences POST /conferences { “name”: “Devoxx”} { “name”: “Devoxx”} { “name”: “Devoxx”, “countryName”: “Belgium”} { “countryName”: “Belgium”}/conf/{name}/country GET /conferences-with-country
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. Let’s start the applications! mvn compile quarkus:dev mvn package exec:exec (or start the main class) 8100 8101
  • 12.
  • 13.
  • 14. REST Controller @Path("/conferences") public class ConferenceResource { @Inject ConferenceService conferenceService; @GET @Produces(MediaType.APPLICATION_JSON) public List<Conference> getAll() { return conferenceService.getAll(); } @POST @Consumes(MediaType.APPLICATION_JSON) public void create(Conference conference) { conferenceService.create(conference); } @Controller("/conferences") public class ConferenceController { @Inject ConferenceService conferenceService; @Get @Produces(MediaType.APPLICATION_JSON) public List<Conference> getAll() { return conferenceService.getAll(); } @Post @Consumes(MediaType.APPLICATION_JSON) public void create(Conference conference) { conferenceService.create(conference); } Conference API Conference Service RepoCountryClient
  • 15. Conference service @Singleton public class ConferenceService { @Inject private ConferenceRepository conferenceRepository; @Inject CountryClient countryClient; public List<Conference> getAll() { return conferenceRepository.findAll(); } public void create(Conference conference) { conferenceRepository.save(conference); } @Singleton public class ConferenceService { @Inject private ConferenceRepository conferenceRepository; @Inject @RestClient CountryClient countryClient; public List<Conference> getAll() { return conferenceRepository.findAll(); } public void create(Conference conference) { conferenceRepository.save(conference); } Conference API Conference Service RepoCountryClient
  • 16. @Path("/") @RegisterRestClient @Retry(maxRetries = 3, delay = 2) @CircuitBreaker(successThreshold = 1) public interface CountryClient { @GET @Path("/conferences/{name}/country") Country getCountry(@PathParam("name") String name); @Client("${country.service.url}") @Retryable(attempts = “3", delay = "1s") @CircuitBreaker(reset = "20s") public interface CountryClient { @Get("/conferences/{name}/country") Country getCountry(String name); mypackage.CountryClient/mp-rest/url=http://localhost:9000/ mypackage.CountryClient/mp-rest/scope=javax.inject.Singleton country.service.url=http://localhost:9000/ application.properties application.properties / yml Conference API Conference Service RepoCountryClient REST client
  • 17. Configuration app.helloMessage=Hi there! app.helloMessage=Hi there! application.properties application.properties / application.yml @ConfigProperty(name = "app.helloMessage", defaultValue="hello default!") String helloMessage; @ConfigProperties(prefix = "app") public class ConferenceConfiguration { @Size(min= 5) public String helloMessage; } @Value("${app.helloMessage:hello default!}") String helloMessage; @ConfigurationProperties("app") public class ConferenceConfiguration { @Size(min = 5) public String helloMessage; } @Property("app.helloMessage") String helloMessage;
  • 18. Configuration profiles app.hello-message=Hi there! %dev.app.hello-message=Hi from dev! %test.app.hello-message=Hi from test! %custom.app.hello-message=Hi from custom! app.hello-message=Hi there! application.properties application.properties / application.yml • dev – during quarkus:dev unless overridden • test- during tests • prod – default profile • custom mvnw quarkus:dev –Dquarkus.profile=test application-test.properties / application-test.yml app.hello-message=Hi from test! mvnw exec:exec -Dmicronaut.environments=test
  • 19. Custom Configuration Create service file /META- INF/services/org.eclipse.microprofile.config.spi.ConfigSour ce public class CustomConfigSource implements ConfigSource { @Override public Map<String, String> getProperties() { //my own implementation return null; } @Override public String getValue(String s) { //my own implementation return null; } @Override public String getName() { return "CustomConfigSource"; } } <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-discovery-client</artifactId> </dependency> spring: cloud: config: enabled: true uri: http://localhost:8888/ micronaut: config-client: enabled: true • HashiCorp Consul & Vault Support • AWS Parameter Store Support • Spring Cloud config server Support
  • 20.
  • 21.
  • 22. JP @Singleton public class ConferenceRepository { @Inject EntityManager entityManager; @Transactional public List<Conference> findAll() { TypedQuery<Conference> query = entityManager .createQuery("select c from Conference c", Conference.class); return query.getResultList(); } @Transactional public void save(final Conference conference) { entityManager.persist(conference); } } @Singleton public class ConferenceRepository { @Inject EntityManager entityManager; @Transactional public List<Conference> findAll() { TypedQuery<Conference> query = entityManager .createQuery("select c from Conference c", Conference.class); return query.getResultList(); } @Transactional public void save(final Conference conference) { entityManager.persist(conference); } } JPA persistency Conference API Conference Service RepoCountryClient
  • 23. Improved Quarkus persistency with Panache @Entity public class Conference extends PanacheEntity { private String name; public String getName() { return name; } public void setName(final String name) { this.name = name; } @Singleton public class ConferencePanacheRepository { public List<Conference> findAll() { return Conference.listAll(); } @Transactional public void save(final Conference conference) { conference.persist(); } }
  • 24. Micronaut Data @Repository public interface ConferenceCrudRepository extends CrudRepository<Conference, Long> { List<Conference> findByName(String name); List<Conference> listOrderByName(); List<Conference> listOrderByNameDesc(); List<Conference> findTop3ByNameLike(String name); } @Repository public interface ConferenceCrudRepository extends CrudRepository<Conference, Long> { } @JdbcRepository public interface ConferenceCrudRepository extends CrudRepository<Conference, Long> { List<Conference> findByName(String name); List<Conference> listOrderByName(); List<Conference> listOrderByNameDesc(); List<Conference> findTop3ByNameLike(String name); } No more JPA / Hibernate needed!
  • 25.
  • 26.
  • 27. Integration testing @MicronautTest(environments = { "test" }) public class ConferenceITTest { @Inject EmbeddedServer embeddedServer; @Test @Transactional public void testConferences() { Conference conference = new Conference(); conference.setName("Devoxx"); given().body(conference) .port(embeddedServer.getPort()) .contentType("application/json") .when() .post("/conferences") .then() .statusCode(200); given().port(embeddedServer.getPort()) .when() .get("/conferences") .then() .extract() .path("[0].name") .equals(“Devoxx"); } application-test.yml micronaut: server: port: -1 @QuarkusTest public class ConferenceIT { @Test @Transactional public void testConferences() { Conference conference = new Conference(); conference.setName("Devoxx"); given().body(conference) .contentType("application/json") .when() .post("/conferences") .then() .statusCode(204); given() .when() .get("/conferences") .then() .extract() .path("[0].name") .equals("Devoxx"); } quarkus.http.test-port=0 application.properties
  • 28. Integration testing with Quarkus @QuarkusTest public class ConferenceIT { @Inject ConferenceResource conferenceResource; @Test public void testConferenceInternal() { conferenceResource.getAll(); } } Testing internally @Mock @ApplicationScoped @RestClient public class MockCountryClient implements CountryClient { @Override public Country getCountryOfConference(String name) { Country country = new Country(); country.setName("Belgium"); return country; } } Mocking @MicronautTest(environments = { "test" }) public class ConferenceITTest { @Inject private ConferenceController conferenceController; @Test public void testConferencesInternal() { conferenceController.getAll(); } @MockBean(CountryClient.class) CountryClient countryClient() { final CountryClient mock = Mockito.mock(CountryClient.class); Country country = new Country(); country.setName("Belgium"); when(mock.getCountryOfConference(isA(String.class))) .thenReturn(country); return mock; }
  • 29. Integration testing native images @SubstrateTest public class NativeConferenceResourceIT extends ConferenceIT { // Execute the same tests but in native mode. }
  • 30.
  • 31.
  • 32. Building native images with GraalVM ./mvnw package –Pnative –Dnative- image.docker-build=true docker build -f src/main/docker/Dockerfile.native –t conference-service-quarkus . ./mvnw package docker build . –t conference-service-micronaut Include feature native-imageNo additional actions needed
  • 33. Let’s run the applications! JVM: port 8100 Native: port 8200 JVM: port 8101 Native: port 8201 docker run -i --rm -p 8200:8080 conference-service-quarkus docker run -i --rm -p 8201:8080 conference-service-quarkus-micronaut
  • 36.
  • 37.
  • 38.
  • 39.
  • 40. Summary • Small images, faster startup, lowest mem usage • Microprofile Programming model • Really fast release cycle • Close to Spring’s programming model • Feels little more mature • Micronaut Data • More extensive support for existing cloud environments • Could do with a nicer persistency solution • Few of out-of-the-box monitoring • I’d like an initializer site!

Notes de l'éditeur

  1. Quarkus uses @ConfigProperty from the microprofile specification. Properties are read from one application.properties file. Profiles are supported. There are three pofiles: dev, test and prod out-of-the-box, but you can specifiy more. Properties of all profiles have to be specified in either the application.properties (with % as prefix), or through jvm parameters (-D) Micronaut uses the @Value construction known from SpringBoot. Configuration profiles are supported and implemented by different property files like –T.yml. This seems a little more clear than with Quarkus. Moreso, micronaut supports integration with Spring Cloud Config server.
  2. Both quarkus and micronaut support Hibernate for database access, with automatic schema generation. Both frameworks support entity managers, no problem. But this feels a little... Well... Midlevel. Quarkus support Panache, which makes life a little bit easier. (show) Micronaut has Micronuat data (formerly predator), which is now on milestone 3. It has a programming model similair to Spring Data, where you can useto make declarative interfaces, as we will see now. Evenmore, you can use this so generate repos base don pure jdbc access, which is really cool. Definitely points to Micronaut here!
  3. Of course jdbc cannot do stuff like lazy loading, dirty checking, optimistic locking and stuff.
  4. Quarkus has the @QuarkusTest annotation which spins up a test version of the application. By default, it spins up on port 8081, so not a random port as we saw in Spring Boot, for example. Mock objects are supported for stubbing test clients. Micronaut has @MicronautTest annotation, same thing. Default is port 8081. Now, micronaut does not recieve the port binding automatically, so you have to set it yourself. Mocking is done through the @MockBean annotation, which you can use to specify any mock you want, for example with Mockito.
  5. You can start micronaut with a java –jar target\...jar command. Quarkus doesn’t build fat jars of the box, so if you want to do that, you need to specify the <uberJar> configuration in your maven-quarkus-plugin. If we start the application with java-jar, quarkus is notably quicker here then micronaut, but both are faster than SpringBoot. File size wise, there is not much difference. Quarkus fat jar is 42MB while Micronaut’s is 46MB, both definately smaller than any Spring Boot application that boast the same functionality. Mmemory usage: Quarkus: 425MB/176MB SpringBoot: 547MB/428MB Micronaut: 541MB/251MB Points go to Quarkus here.
  6. You can start micronaut with a java –jar target\...jar command. Quarkus doesn’t build fat jars of the box, so if you want to do that, you need to specify the <uberJar> configuration in your maven-quarkus-plugin. If we start the application with java-jar, quarkus is notably quicker here then micronaut, but both are faster than SpringBoot. File size wise, there is not much difference. Quarkus fat jar is 42MB while Micronaut’s is 46MB, both definately smaller than any Spring Boot application that boast the same functionality. Mmemory usage: Quarkus: 425MB/176MB SpringBoot: 547MB/428MB Micronaut: 541MB/251MB Points go to Quarkus here.
  7. You can start micronaut with a java –jar target\...jar command. Quarkus doesn’t build fat jars of the box, so if you want to do that, you need to specify the <uberJar> configuration in your maven-quarkus-plugin. If we start the application with java-jar, quarkus is notably quicker here then micronaut, but both are faster than SpringBoot. File size wise, there is not much difference. Quarkus fat jar is 42MB while Micronaut’s is 46MB, both definately smaller than any Spring Boot application that boast the same functionality. Mmemory usage: Quarkus: 425MB/176MB SpringBoot: 547MB/428MB Micronaut: 541MB/251MB Points go to Quarkus here.
  8. You can start micronaut with a java –jar target\...jar command. Quarkus doesn’t build fat jars of the box, so if you want to do that, you need to specify the <uberJar> configuration in your maven-quarkus-plugin. If we start the application with java-jar, quarkus is notably quicker here then micronaut, but both are faster than SpringBoot. File size wise, there is not much difference. Quarkus fat jar is 42MB while Micronaut’s is 46MB, both definately smaller than any Spring Boot application that boast the same functionality. Mmemory usage: Quarkus: 425MB/176MB SpringBoot: 547MB/428MB Micronaut: 541MB/251MB Points go to Quarkus here.