Contents

用Apache Meecrowave建立微服务

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 服务器,我们需要做的就是编写 main方法,**创建一个Meecrowave实例并调用 bake()方法

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

如果我们把应用打包成分发包,就不需要这个main方法;我们将在后面的部分中对此进行研究。在从 IDE 测试应用程序时,主类很有用。

作为一个优势,在 IDE 中开发时,一旦我们使用主类运行应用程序,它会随着代码更改自动重新加载,从而省去了一次又一次地重新启动服务器以进行测试的麻烦。

请注意,如果我们使用的是 Java 9,请不要忘记将 javax.xml.bind模块添加到 VM:

--add-module javax.xml.bind

以这种方式创建服务器将使用默认配置启动它。我们可以使用 Meecrowave.Builder类以编程方式更新默认配置:

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

并在烘焙服务器时使用此Builder实例:

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. 测试

使用 Meecrowave 编写的 REST API 编写单元测试用例就像编写带注释的 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;
    }
}

现在让我们使用javax.inject.Inject注释将其注入到我们的 ArticleEndpoints实例中 :

@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