Построение микросервиса с помощью Apache Meecrowave

Построение микросервиса с помощью Apache Meecrowave

**

1. обзор

В этом руководстве мы исследуем основные функции фреймворка ApacheMeecrowave.

Meecrowave is a lightweight microservices framework from Apache, который очень хорошо работает с API CDI, JAX-RS и JSON. Его очень просто настроить и развернуть. Это также устраняет необходимость развертывания серверов тяжелых приложений, таких как Tomcat, Glassfish, Wildfly и т. Д.

2. Maven Dependency

Чтобы использовать Meecrowave, давайте определим зависимость вpom.xml:


    org.apache.meecrowave
    meecrowave-core
    1.2.1

Проверьте последнюю версию наMaven Central.

3. Запуск простого сервера

Я приказываю запустить сервер Meecrowave, все, что нам нужно сделать, это написать методmain ,create a Meecrowave instance and invoke the main bake() method:

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

Нам не нужен этот основной метод, если мы упаковываем приложение как дистрибутив; мы рассмотрим это в следующих разделах. Основной класс полезен при тестировании приложения из IDE.

В качестве преимущества при разработке в среде IDE, когда мы запускаем приложение с использованием основного класса, оно автоматически перезагружается с изменениями кода, что избавляет от необходимости перезапускать сервер снова и снова для тестирования.

Обратите внимание: если мы используем Java 9, не забудьте добавить в виртуальную машину модули javax.xml.bind:

--add-module javax.xml.bind

Создание сервера таким образом запустит его с настройками по умолчанию. Мы можем программно обновить конфигурации по умолчанию, используя классMeecrowave.Builder:

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

И используйте этотbuilder instance при запекании сервера:

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

Есть больше настраиваемых свойствhere.

4. Конечные точки REST

Теперь, когда сервер готов, давайте создадим несколько конечных точек 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();
    }
}

Обратите внимание, что мы в основном используемJAX-RS annotations to create the REST endpoints. Подробнее о JAX-RShttps://www.example.com/jax-rs-spec-and-implementations. [Здесь].

В следующем разделе мы увидим, как протестировать эти конечные точки.

5. Модульное тестирование

Написание модульных тестовых примеров с использованием REST API, написанного с помощью Meecrowave, просто, как написание аннотированных тестовых примеров JUnit.

Давайте добавим тестовые зависимости к нашемуpom.xml first:


    org.apache.meecrowave
    meecrowave-junit
    1.2.1
    test

Чтобы увидеть последнюю версию, посмотритеMaven Central.

Также давайте добавимOkHttp в качестве HTTP-клиента для наших тестов:


    com.squareup.okhttp3
    okhttp
    3.10.0

Проверьте последнюю версиюhere.

Теперь, когда есть зависимости, давайте продолжим и напишем тесты:

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

При написании тестовых примеров сделайте так, чтобы тестовый класс аннотировал классомMonoMeecrowave.Runner, а также внедрите конфигурацию, чтобы получить доступ к случайному порту, используемому Meecrowave для тестового сервера.

6. Внедрение зависимости

Дляinject dependencies into a class нам нужно аннотировать эти классы в определенной области.

Возьмем пример классаArticleService :

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

Теперь давайте вставим это в наш экземплярArticleEndpoints, используя аннотациюjavax.inject.Inject:

@Inject
ArticleService articleService;

7. Упаковка заявки

Создание дистрибутива становится очень простым с плагином Meecrowave Maven:


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

Как только у нас будет плагин, давайтеuse the Maven goal meecrowave:bundle to package the application.

После упаковки он создаст zip внутри целевого каталога:

meecrowave-meecrowave-distribution.zip

Этот zip-архив содержит необходимые артефакты для развертывания приложения:

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

Давайте перейдем в каталог bin и запустим приложение:

./meecrowave.sh start

Чтобы остановить приложение:

./meecrowave.sh stop

8. Заключение

В этой статье мы узнали об использовании Apache Meecrowave для создания микросервиса. Кроме того, мы рассмотрели некоторые основные настройки приложения и подготовили дистрибутив.

Как всегда, фрагменты кода можно найти вGithub Project.

**