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.15</version>
<classifier>jakarta</classifier>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
可在 Maven Central 查找最新版本。
3. 啓動一個簡單的服務器
為了啓動一個 Meecrowave 服務器,我們只需要編寫 main 方法,創建 Meecrowave 實例並調用 main 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.baeldung.meecrowave");
builder.setJaxrsMapping("/api/*");
builder.setJsonpPrettify(true);
並使用此 builder 實例來烘焙服務器:
try (Meecrowave meecrowave = new Meecrowave(builder)) {
meecrowave.bake().await();
}
更多可配置屬性可以在這裏找到:4. REST 端點
現在,當服務器準備就緒後,讓我們創建一些 REST 端點: 請注意,我們主要使用 JAX-RS 註解來創建 REST 端點。 更多關於 JAX-RS 的信息請參考這裏。 在下一部分,我們將看到如何測試這些端點。 使用 Meecrowave 編寫 REST API 的單元測試用例非常簡單,就像編寫帶有註釋的 JUnit 測試用例。 首先,我們需要將測試依賴添加到我們的 pom.xml: 要查看最新版本,請查看 Maven Central。 此外,讓我們將 OkHttp 作為測試的 HTTP 客户端添加到我們的項目中: 要查看最新版本,請查看 這裏。 現在依賴已添加到項目中,我們可以開始編寫測試: 在編寫測試用例時,請務必使用 MonoMeecrowave.Runner 類進行註釋,並注入配置,以獲取 Meecrowave 為測試服務器使用的隨機端口。 為了將依賴注入到類中,我們需要在特定作用域內註釋這些類。 以下是一個 ArticleService類的示例: 現在,我們使用 javax.inject.Inject註解將它注入到我們的 ArticleEndpoints實例中: 創建分發包變得非常簡單,藉助 Meecrowave Maven 插件: 一旦插件已配置,我們就可以使用 Maven 目標 meecrowave:bundle 來打包應用程序。 打包完成後,會在 target 目錄下創建一個 zip 文件: 這個 zip 文件包含用於部署應用程序所需的 Artifacts: 讓我們導航到 bin 目錄並啓動應用程序: 停止應用程序: 在本文中,我們學習瞭如何使用 Apache Meecrowave 創建微服務。此外,我們還研究了應用程序的基本配置以及準備分發包。@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();
}
}5. 測試
<dependency>
<groupId>org.apache.meecrowave</groupId>
<artifactId>meecrowave-junit</artifactId>
<version>1.2.15</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.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());
}
}6. 依賴注入
@ApplicationScoped
public class ArticleService {
public Article createArticle(Article article) {
return article;
}
}
@Inject
ArticleService articleService;
7. 應用程序打包
<build>
...
<plugins>
<plugin>
<groupId>org.apache.meecrowave</groupId>
<artifactId>meecrowave-maven-plugin</artifactId>
<version>1.2.1</version>
</plugin>
</plugins>
</build>meecrowave-meecrowave-distribution.zip|____meecrowave-distribution
| |____bin
| | |____meecrowave.sh
| |____logs
| | |____you_can_safely_delete.txt
| |____lib
| |____conf
| | |____log4j2.xml
| | |____meecrowave.properties./meecrowave.sh start./meecrowave.sh stop8. 結論