Перейти к основному содержимому

Создание микросервиса с помощью Apache Meecrowave

· 4 мин. чтения

1. Обзор

В этом руководстве мы рассмотрим основные функциональные возможности среды Apache Meecrowave .

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

2. Зависимость от Maven

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

<dependency>
<groupId>org.apache.meecrowave</groupId>
<artifactId>meecrowave-core</artifactId>
<version>1.2.1</version>
</dependency>

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

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

Я приказываю запустить сервер Meecrowave, все, что нам нужно сделать, это написать основной метод, создать экземпляр Meecrowave и вызвать основной метод Bake () :

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.foreach.meecrowave");
builder.setJaxrsMapping("/api/*");
builder.setJsonpPrettify(true);

И используйте этот экземпляр компоновщика при запекании сервера:

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

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

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 для создания конечных точек REST . Подробнее о JAX-RS читайте здесь .

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

5. Тестирование

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

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

<dependency>
<groupId>org.apache.meecrowave</groupId>
<artifactId>meecrowave-junit</artifactId>
<version>1.2.1</version>
<scope>test</scope>
</dependency>

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

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

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>

Ознакомьтесь с последней версией здесь .

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

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

@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. Внедрение зависимостей

Чтобы внедрить зависимости в класс , нам нужно аннотировать эти классы в определенной области.

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

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

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

@Inject
ArticleService articleService;

7. Упаковка приложения

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

<build>
...
<plugins>
<plugin>
<groupId>org.apache.meecrowave</groupId>
<artifactId>meecrowave-maven-plugin</artifactId>
<version>1.2.1</version>
</plugin>
</plugins>
</build>

Как только у нас будет установлен плагин, давайте воспользуемся целью Maven meecrowave:bundle для упаковки приложения .

После упаковки он создаст 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 .