Construire un microservice avec Apache Meecrowave

Construire un microservice avec Apache Meecrowave

**

1. Vue d'ensemble

Dans ce didacticiel, nous allons explorer les fonctionnalités de base du framework ApacheMeecrowave.

Meecrowave is a lightweight microservices framework from Apache, qui fonctionne très bien avec les API CDI, JAX-RS et JSON. C'est très simple à configurer et à déployer. Il évite également le déploiement de serveurs d'applications lourds tels que Tomcat, Glassfish, Wildfly, etc.

2. Dépendance Maven

Pour utiliser Meecrowave, définissons la dépendance enpom.xml:


    org.apache.meecrowave
    meecrowave-core
    1.2.1

Recherchez la dernière version surMaven Central.

3. Démarrer un serveur simple

Je commande pour démarrer un serveur Meecrowave, tout ce que nous avons à faire est d'écrire la méthodemain ,create a Meecrowave instance and invoke the main bake() method:

public static void main(String[] args) {
    try (Meecrowave meecrowave = new Meecrowave()) {
        meecrowave.bake().await();
    }
}

Nous n'avons pas besoin de cette méthode principale si nous conditionnons l'application en tant que package de distribution; nous examinerons cela dans les sections suivantes. La classe principale est utile lors du test de l'application à partir d'un IDE.

En tant qu’avantage, lors du développement dans un environnement de développement intégré (IDE), une fois que nous exécutons l’application à l’aide de la classe principale, celle-ci se recharge automatiquement avec les modifications de code.

Notez que, si nous utilisons Java 9, n'oubliez pas d'ajouter les modules javax.xml.bind à la VM:

--add-module javax.xml.bind

La création du serveur de cette façon le lancera avec la configuration par défaut. Nous pouvons mettre à jour par programmation les configurations par défaut en utilisant la classeMeecrowave.Builder:

Meecrowave.Builder builder = new Meecrowave.Builder();
builder.setHttpPort(8080);
builder.setScanningPackageIncludes("com.example.meecrowave");
builder.setJaxrsMapping("/api/*");
builder.setJsonpPrettify(true);

Et utilisez cette instancebuilder lors de la cuisson du serveur:

try (Meecrowave meecrowave = new Meecrowave(builder)) {
    meecrowave.bake().await();
}

Il y a plus de propriétés configurableshere.

4. Points de terminaison REST

Maintenant, une fois que le serveur est prêt, créons des points de terminaison REST:

@RequestScoped
@Path("article")
public class ArticleEndpoints {

    @GET
    public Response getArticle() {
        return Response.ok().entity(new Article("name", "author")).build();
    }

    @POST
    public Response createArticle(Article article) {
        return Response.status(Status.CREATED).entity(article).build();
    }
}

Notez que nous utilisons principalementJAX-RS annotations to create the REST endpoints. En savoir plus sur JAX-RShttps://www.example.com/jax-rs-spec-and-implementations. [Ici].

Dans la section suivante, nous verrons comment tester ces points de terminaison.

5. Tests unitaires

Ecrire des cas de test unitaires avec les API REST écrites avec Meecrowave est simple comme écrire des cas de test JUnit annotés.

Ajoutons d'abord les dépendances de test à notrepom.xml :


    org.apache.meecrowave
    meecrowave-junit
    1.2.1
    test

Pour voir la dernière version, consultezMaven Central.

Ajoutons égalementOkHttp comme client HTTP pour nos tests:


    com.squareup.okhttp3
    okhttp
    3.10.0

Découvrez la dernière versionhere.

Maintenant, avec les dépendances en place, allons de l'avant et écrivons les tests:

@RunWith(MonoMeecrowave.Runner.class)
public class ArticleEndpointsTest {

    @ConfigurationInject
    private Meecrowave.Builder config;
    private static OkHttpClient client;

    @BeforeClass
    public static void setup() {
        client = new OkHttpClient();
    }

    @Test
    public void whenRetunedArticle_thenCorrect() {
        String base = "http://localhost:" + config.getHttpPort();

        Request request = new Request.Builder()
          .url(base + "/article")
          .build();
        Response response = client.newCall(request).execute();
        assertEquals(200, response.code());
    }
}

Lors de l'écriture des cas de test, faites pour annoter la classe de test avec la classeMonoMeecrowave.Runner, injectez également la configuration, pour accéder au port aléatoire utilisé par Meecrowave pour le serveur de test

6. Injection de dépendance

Pourinject dependencies into a class, nous devons annoter ces classes dans une portée particulière.

Prenons l'exemple d'une classeArticleService :

@ApplicationScoped
public class ArticleService {
    public Article createArticle(Article article) {
        return article;
    }
}

Maintenant, injectons ceci dans notre instanceArticleEndpoints en utilisant l'annotationjavax.inject.Inject:

@Inject
ArticleService articleService;

7. Emballage de l'application

Créer un paquet de distribution devient très simple, avec le plugin Meecrowave Maven:


    ...
    
        
            org.apache.meecrowave
            meecrowave-maven-plugin
            1.2.1
        
    

Une fois le plugin en place, nous allonsuse the Maven goal meecrowave:bundle to package the application.

Une fois empaqueté, il créera un zip dans le répertoire cible:

meecrowave-meecrowave-distribution.zip

Ce zip contient les artefacts requis pour déployer l'application:

|____meecrowave-distribution
| |____bin
| | |____meecrowave.sh
| |____logs
| | |____you_can_safely_delete.txt
| |____lib
| |____conf
| | |____log4j2.xml
| | |____meecrowave.properties

Accompagnons le répertoire bin et démarrons l'application:

./meecrowave.sh start

Pour arrêter l'application:

./meecrowave.sh stop

8. Conclusion

Dans cet article, nous avons appris à utiliser Apache Meecrowave pour créer un microservice. Nous avons également examiné certaines configurations de base de l’application et préparé un package de distribution.

Comme toujours, les extraits de code peuvent être trouvés dans lesGithub Project.

**