SlideShare a Scribd company logo
1 of 41
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

More Related Content

What's hot

Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023Sam Brannen
 
Knative with .NET Core and Quarkus with GraalVM
Knative with .NET Core and Quarkus with GraalVMKnative with .NET Core and Quarkus with GraalVM
Knative with .NET Core and Quarkus with GraalVMMark Lechtermann
 
CI/CD Overview
CI/CD OverviewCI/CD Overview
CI/CD OverviewAn Nguyen
 
Kubernetes Introduction
Kubernetes IntroductionKubernetes Introduction
Kubernetes IntroductionPeng Xiao
 
Apache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals ExplainedApache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals Explainedconfluent
 
Distributed Tracing with Jaeger
Distributed Tracing with JaegerDistributed Tracing with Jaeger
Distributed Tracing with JaegerInho Kang
 
Designing a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsDesigning a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsJulian Mazzitelli
 
Kafka and Avro with Confluent Schema Registry
Kafka and Avro with Confluent Schema RegistryKafka and Avro with Confluent Schema Registry
Kafka and Avro with Confluent Schema RegistryJean-Paul Azar
 
Infrastructure-as-Code (IaC) using Terraform
Infrastructure-as-Code (IaC) using TerraformInfrastructure-as-Code (IaC) using Terraform
Infrastructure-as-Code (IaC) using TerraformAdin Ermie
 
Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...
Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...
Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...StreamNative
 
Working with Terraform on Azure
Working with Terraform on AzureWorking with Terraform on Azure
Working with Terraform on Azuretombuildsstuff
 
Discover Quarkus and GraalVM
Discover Quarkus and GraalVMDiscover Quarkus and GraalVM
Discover Quarkus and GraalVMRomain Schlick
 
VMware Tanzu Kubernetes Connect
VMware Tanzu Kubernetes ConnectVMware Tanzu Kubernetes Connect
VMware Tanzu Kubernetes ConnectVMware Tanzu
 

What's hot (20)

Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
 
Terraform
TerraformTerraform
Terraform
 
Knative with .NET Core and Quarkus with GraalVM
Knative with .NET Core and Quarkus with GraalVMKnative with .NET Core and Quarkus with GraalVM
Knative with .NET Core and Quarkus with GraalVM
 
CI/CD Overview
CI/CD OverviewCI/CD Overview
CI/CD Overview
 
Kubernetes Introduction
Kubernetes IntroductionKubernetes Introduction
Kubernetes Introduction
 
Apache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals ExplainedApache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals Explained
 
Distributed Tracing with Jaeger
Distributed Tracing with JaegerDistributed Tracing with Jaeger
Distributed Tracing with Jaeger
 
Quarkus k8s
Quarkus   k8sQuarkus   k8s
Quarkus k8s
 
Designing a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd productsDesigning a complete ci cd pipeline using argo events, workflow and cd products
Designing a complete ci cd pipeline using argo events, workflow and cd products
 
Springboot Microservices
Springboot MicroservicesSpringboot Microservices
Springboot Microservices
 
Kafka and Avro with Confluent Schema Registry
Kafka and Avro with Confluent Schema RegistryKafka and Avro with Confluent Schema Registry
Kafka and Avro with Confluent Schema Registry
 
Infrastructure-as-Code (IaC) using Terraform
Infrastructure-as-Code (IaC) using TerraformInfrastructure-as-Code (IaC) using Terraform
Infrastructure-as-Code (IaC) using Terraform
 
Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...
Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...
Tracking Apache Pulsar Messages with Apache SkyWalking - Pulsar Virtual Summi...
 
JVM++: The Graal VM
JVM++: The Graal VMJVM++: The Graal VM
JVM++: The Graal VM
 
GraalVM
GraalVMGraalVM
GraalVM
 
Working with Terraform on Azure
Working with Terraform on AzureWorking with Terraform on Azure
Working with Terraform on Azure
 
Discover Quarkus and GraalVM
Discover Quarkus and GraalVMDiscover Quarkus and GraalVM
Discover Quarkus and GraalVM
 
Infrastructure as Code (IaC)
Infrastructure as Code (IaC)Infrastructure as Code (IaC)
Infrastructure as Code (IaC)
 
VMware Tanzu Kubernetes Connect
VMware Tanzu Kubernetes ConnectVMware Tanzu Kubernetes Connect
VMware Tanzu Kubernetes Connect
 
GraalVm and Quarkus
GraalVm and QuarkusGraalVm and Quarkus
GraalVm and Quarkus
 

Similar to 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
 

Similar to 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
 

More from 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
 

More from 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
 

Recently uploaded

Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxRTS corp
 

Recently uploaded (20)

Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
 

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!

Editor's Notes

  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.