Построение микросервиса с помощью 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.
**