知識庫 / Spring RSS 訂閱

Java 微服務入門:使用 MSF4J

REST,Spring
HongKong
5
03:53 AM · Dec 06 ,2025

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-springmsf4j-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 微服務的指南。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.