1. 概述
本教程將演示如何使用 MSF4J 框架進行微服務開發。
這是一個輕量級工具,提供了一種便捷的方式來構建各種高性能服務。
2. Maven 依賴項
為了構建基於 MSF4J 的微服務,我們需要比平時更多的 Maven 配置。該框架的簡潔性和強大性也伴隨着代價:基本上,我們需要定義一個父級 Artifact,以及主類:
<parent>
<groupId>org.wso2.msf4j</groupId>
<artifactId>msf4j-service</artifactId>
<version>2.6.0</version>
</parent>
<properties>
<microservice.mainClass>
com.baeldung.msf4j.Application
</microservice.mainClass>
</properties>最新版本的 msf4j-service 可在 Maven Central 上找到。
接下來,我們將展示三個不同的微服務場景。首先,一個極簡示例,然後是 RESTful API,最後是 Spring 集成示例。
3. 基本項目
3.1. 簡單 API
我們將發佈一個簡單的 Web 資源。
此服務使用一個類提供,該類使用了註解,每個方法處理一個請求。 通過這些註解,我們為每個請求設置了方法、路徑和所需參數。
返回的內容類型為純文本:
@Path("/")
public class SimpleService {
@GET
public String index() {
return "Default content";
}
@GET
@Path("/say/{name}")
public String say(@PathParam("name") String name) {
return "Hello " + name;
}
}請記住,所有使用的類和註解都只是標準的 JAX-RS 元素,我們已經在本文中已經涵蓋過。
3.2. 應用
我們可以使用該主類啓動微服務,該主類用於設置、部署和運行前面定義的服務:
public class Application {
public static void main(String[] args) {
new MicroservicesRunner()
.deploy(new SimpleService())
.start();
}
}如果需要,我們可以在這裏串聯deploy 調用,一次性運行多個服務:
new MicroservicesRunner()
.deploy(new SimpleService())
.deploy(new ComplexService())
.start()3.3. 運行微服務
要運行 MSF4J 微服務,我們有幾種選項:
- 在 IDE 中,將其作為 Java 應用程序運行
- 運行生成的 JAR 包
- 啓動後,您可以在 http://localhost:9090 處查看結果。
3.4 啓動配置
我們可以通過在啓動代碼中添加條款,以多種方式調整配置。
例如,我們可以為請求添加任何類型的攔截器:
new MicroservicesRunner()
.addInterceptor(new MetricsInterceptor())
.deploy(new SimpleService())
.start();或者,我們可以添加全局攔截器,例如用於身份驗證的攔截器:
new MicroservicesRunner()
.addGlobalRequestInterceptor(newUsernamePasswordSecurityInterceptor())
.deploy(new SimpleService())
.start();或者,如果我們需要會話管理,我們可以設置一個會話管理器:
new MicroservicesRunner()
.deploy(new SimpleService())
.setSessionManager(new PersistentSessionManager())
.start();要了解有關這些場景的更多詳細信息,並查看一些可運行的示例,請查看 MSF4J 的官方 GitHub 倉庫:https://github.com/wso2/msf4j/tree/master/samples。
4. 構建 API 微服務
我們已經展示了最簡單的示例。現在我們將轉向一個更現實的項目。
這次,我們將演示如何構建一個包含所有典型 CRUD 操作的 API,用於管理一份食譜倉庫。
4.1. 模型
模型只是一個簡單的POJO,代表着一份餐點:
public class Meal {
private String name;
private Float price;
// getters and setters
}4.2. API
我們構建 API 作為 Web 控制器。通過使用標準註解,我們為每個函數設置以下內容:
- URL 路徑
- HTTP 方法:GET, POST 等
- 輸入 (@Consumes) 內容類型
- 輸出 (@Produces) 內容類型
因此,讓我們為每個標準 CRUD 操作創建一個方法:
@Path("/menu")
public class MenuService {
private List<Meal> meals = new ArrayList<Meal>();
@GET
@Path("/")
@Produces({ "application/json" })
public Response index() {
return Response.ok()
.entity(meals)
.build();
}
@GET
@Path("/{id}")
@Produces({ "application/json" })
public Response meal(@PathParam("id") int id) {
return Response.ok()
.entity(meals.get(id))
.build();
}
@POST
@Path("/")
@Consumes("application/json")
@Produces({ "application/json" })
public Response create(Meal meal) {
meals.add(meal);
return Response.ok()
.entity(meal)
.build();
}
// ... other CRUD operations
}4.3. 數據轉換功能
MSF4J 支持多種數據轉換庫,例如 GSON(默認自帶)和 Jackson(通過 msf4j-feature 依賴項) 。例如,我們可以顯式地使用 GSON:
@GET
@Path("/{id}")
@Produces({ "application/json" })
public String meal(@PathParam("id") int id) {
Gson gson = new Gson();
return gson.toJson(meals.get(id));
}順便説明的是,我們在 @Consumes 和 @Produces 註解中都使用了花括號,以便可以設置多個 MIME 類型。
4.4. 運行 API 微服務
我們通過一個 Application 類來運行微服務,該類發佈 MenuService。
啓動後,您可以在 http://localhost:9090/menu 處查看結果。
5. MSF4J 與 Spring
我們也可以將 Spring 應用到基於 MSF4J 的微服務中,從而獲得其依賴注入功能。
5.1. Maven 依賴
我們需要將適當的依賴項添加到之前的 Maven 配置中,以添加 Spring 和 Mustache 支持:
<dependencies>
<dependency>
<groupId>org.wso2.msf4j</groupId>
<artifactId>msf4j-spring</artifactId>
<version>2.8.11</version>
</dependency>
<dependency>
<groupId>org.wso2.msf4j</groupId>
<artifactId>msf4j-mustache-template</artifactId>
<version>2.8.11</version>
</dependency>
</dependencies>最新版本的 msf4j-spring 和 msf4j-mustache-template 可在 Maven Central 上找到。
5.2. 膳食 API
本 API 只是一個簡單的服務,使用一個模擬的膳食倉庫。請注意我們如何使用 Spring 註解進行自動裝配,並將該類定義為 Spring 服務組件。
@Service
public class MealService {
@Autowired
private MealRepository mealRepository;
public Meal find(int id) {
return mealRepository.find(id);
}
public List<Meal> findAll() {
return mealRepository.findAll();
}
public void create(Meal meal) {
mealRepository.create(meal);
}
}5.3. 控制器
我們聲明控制器為一個組件,Spring 通過自動注入提供服務。第一個方法展示瞭如何服務 Mustache 模板,第二個展示了 JSON 資源:
@Component
@Path("/meal")
public class MealResource {
@Autowired
private MealService mealService;
@GET
@Path("/")
public Response all() {
Map map = Collections.singletonMap("meals", mealService.findAll());
String html = MustacheTemplateEngine.instance()
.render("meals.mustache", map);
return Response.ok()
.type(MediaType.TEXT_HTML)
.entity(html)
.build();
}
@GET
@Path("/{id}")
@Produces({ "application/json" })
public Response meal(@PathParam("id") int id) {
return Response.ok()
.entity(mealService.find(id))
.build();
}
}5.4. 主程序
在 Spring 場景中,啓動微服務的方式如下:
public class Application {
public static void main(String[] args) {
MSF4JSpringApplication.run(Application.class, args);
}
}一旦啓動,結果可以在 http://localhost:8080/meals/ 中查看。 Spring 項目的默認端口可能不同,但我們可以將其設置為我們想要的任何端口。
5.5. 配置 Bean
為了啓用特定的設置,包括攔截器和會話管理,我們可以添加配置 Bean。
例如,這個 Bean 會更改微服務的默認端口:
@Configuration
public class PortConfiguration {
@Bean
public HTTPTransportConfig http() {
return new HTTPTransportConfig(9090);
}
}6. 結論
在本文中,我們介紹了 MSF4J 框架,通過構建不同的場景來構建基於 Java 的微服務。
關於這個概念,目前討論很多,但已有相關的理論基礎(如 Martin Fowler 的微服務文章),MSF4J 提供了一種便捷且標準化的方式來應用這種模式。
此外,如果您想進一步閲讀,可以參考使用 Eclipse Microprofile 構建微服務,當然還有我們關於 Spring Boot 和 Spring Cloud 中 Spring 微服務的指南。