Construindo um microsserviço com o Apache Meecrowave

Construindo um microsserviço com o Apache Meecrowave

**

1. Visão geral

Neste tutorial, vamos explorar a funcionalidade básica da estrutura do ApacheMeecrowave.

Meecrowave is a lightweight microservices framework from Apache, que funciona muito bem com CDI, JAX-RS e APIs JSON. É muito simples de configurar e implantar. Também elimina o incômodo de implantar servidores de aplicativos pesados ​​como Tomcat, Glassfish, Wildfly, etc.

2. Dependência do Maven

Para usar o Meecrowave, vamos definir a dependência empom.xml:


    org.apache.meecrowave
    meecrowave-core
    1.2.1

Verifique a versão mais recente emMaven Central.

3. Iniciando um Servidor Simples

Para iniciar um servidor Meecrowave, tudo o que precisamos fazer é escrever o métodomain ,create a Meecrowave instance and invoke the main bake() method:

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

Não precisamos desse método principal se empacotarmos o aplicativo como um pacote de distribuição; veremos isso nas seções posteriores. A classe principal é útil ao testar o aplicativo a partir de um IDE.

Como vantagem, durante o desenvolvimento de um IDE, uma vez que executamos o aplicativo usando a classe principal, ele é recarregado automaticamente com alterações de código, economizando o trabalho de reiniciar o servidor repetidamente para testar.

Observe que, se estivermos usando Java 9, não se esqueça de adicionar módulos javax.xml.bind à VM:

--add-module javax.xml.bind

Criar o servidor dessa maneira o iniciará com a configuração padrão. Podemos atualizar programaticamente as configurações padrão usando a classeMeecrowave.Builder:

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

E use estabuilder instance enquanto assa o servidor:

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

Existem mais propriedades configuráveishere.

4. Endpoints REST

Agora, quando o servidor estiver pronto, vamos criar alguns endpoints 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();
    }
}

Observe que estamos usando principalmenteJAX-RS annotations to create the REST endpoints. Leia mais sobre JAX-RShttps://www.example.com/jax-rs-spec-and-implementations. [Aqui].

Na próxima seção, veremos como testar esses terminais.

5. Teste de Unidade

Escrever casos de teste de unidade com a API REST escrita com Meecrowave é tão simples quanto escrever casos de teste JUnit anotados.

Vamos adicionar as dependências de teste ao nossopom.xml  primeiro:


    org.apache.meecrowave
    meecrowave-junit
    1.2.1
    test

Para ver a versão mais recente, verifiqueMaven Central.

Além disso, vamos adicionarOkHttp como cliente HTTP para nossos testes:


    com.squareup.okhttp3
    okhttp
    3.10.0

Verifique a versão mais recentehere.

Agora, com as dependências implementadas, vamos em frente e escreva os testes:

@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());
    }
}

Ao escrever os casos de teste, faça anotações na classe de teste com a classeMonoMeecrowave.Runner, injete também a configuração, para obter acesso à porta aleatória usada pelo Meecrowave para o servidor de teste

6. Injeção de dependência

Parainject dependencies into a class, precisamos anotar essas classes dentro de um escopo particular.

Vamos pegar o exemplo de um sclassArticleService :

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

Agora vamos injetar isso em nossa instânciaArticleEndpoints usando a anotaçãojavax.inject.Inject:

@Inject
ArticleService articleService;

7. Empacotando o aplicativo

Criar um pacote de distribuição se torna muito simples, com o plugin Meecrowave Maven:


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

Assim que tivermos o plugin instalado, vamosuse the Maven goal meecrowave:bundle to package the application.

Uma vez empacotado, ele criará um zip dentro do diretório de destino:

meecrowave-meecrowave-distribution.zip

Esse zip contém os artefatos necessários para implementar o aplicativo:

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

Vamos navegar até o diretório bin e iniciar o aplicativo:

./meecrowave.sh start

Para parar o aplicativo:

./meecrowave.sh stop

8. Conclusão

Neste artigo, aprendemos sobre o uso do Apache Meecrowave para criar um microsserviço. Além disso, analisamos algumas configurações básicas sobre o aplicativo e preparamos um pacote de distribuição.

Como sempre, os trechos de código podem ser encontrados emGithub Project.

**