Spring Boot與Eclipse MicroProfile比較

banq發表於2019-01-31

到目前為止,您可能已經聽說過Eclipse MicroProfile(MP)。它是一個社群驅動的計劃,用於定義企業Java 微服務的規範。MicroProfile僅用了兩年時間,但它已經提供了八項創新規範並且正在快速發展。它提供指標,API文件,執行狀況檢查,容錯,分散式跟蹤等。有了它,您可以充分利用尖端的雲原生技術,並以供應商中立的方式實現!
對於熟悉Spring Boot的開發人員,我們準備了本文,它將使用Spring Boot和MicroProfile開發應用程式的基礎知識進行了比較。我們寫了兩個應用程式,每個解決方案一個。在本文中,我們將介紹它們之間的差異。您可以在GitHub找到這兩個專案的原始碼。
對於MicroProfile應用程式,我們使用Thorntail(以前稱為Wildfly Swarm),但除了設定部分,Open Liberty,Payara,TomEE或任何其他實現看起來完全相同。
在本文中,我們假設您瞭解Spring Boot,並且我們專注於MicroProfile中的不同之處。

設定專案
我們使用Maven設定了兩個應用程式。
使用Thorntail,專案的設定與Spring Boot非常相似。第一個區別在於專案包裝。雖然我們使用jar(預設包裝)Spring Boot應用程式,但我們需要將其設定Thorntail應用程式的打包WAR。
我們的Spring Boot應用程式使用名為的BOM檔案spring-boot-dependencies。Thorntail也提供BOM檔案。我們選擇了bom,列出了所有穩定,經過良好測試的Thorntail元素。例如,如果您想進行實驗,可以使用  bom-all。
Spring Boot和Thorntail都使用Maven外掛將使用者的類,資源和所選解決方案的所有位打包成一個胖JAR。對於Thorntail,該外掛被呼叫thorntail-maven-plugin。下面的清單顯示了其宣告以及Thorntail BOM的宣告。

<project ...>
 ...
 <packaging>war</packaging>

<dependencyManagement>
 <dependencies>
   <dependency>
     <groupId>io.thorntail</groupId>
     <artifactId>bom</artifactId>
     <version>${version.thorntail}</version>
     <type>pom</type>
     <scope>import</scope>
   </dependency>
 </dependencies>
</dependencyManagement>
...
<build>
 <plugins>
   <plugin>
     <groupId>io.thorntail</groupId>
     <artifactId>thorntail-maven-plugin</artifactId>
     <version>${version.thorntail}</version>
     <executions>
       <execution>
         <goals>
           <goal>package</goal>
         </goals>
       </execution>
     </executions>
   </plugin>
 </plugins>
</build>


定義了基礎知識後,我們可以選擇我們需要的功能。
相對於我們選擇的Spring Boot spring-boot-starter-web,我們microprofile只是為Thorntail 新增一個依賴項。

<dependency>
 <groupId>io.thorntail</groupId>
 <artifactId>microprofile</artifactId>
</dependency>


您可以檢視GitHub專案中的最終pom.xml 檔案  。
設定專案還有一個不同之處:應該放置靜態資源的地方。我們的Spring Boot應用程式將靜態資源保留在  src/main/resources/static目錄中,而Thorntail應用程式則需要將它們放入src/main/webapp。

公開REST端點
從Spring應用程式公開REST API的最慣用方法是使用Spring MVC。MicroProfile是利用JAX-RS實現相同功能。
首先,對於JAX-RS,Application需要一個類。它擴充套件  javax.ws.rs.core.Application並可以為所有JAX-RS端點提供全域性路徑字首。在我們的例子中它是:

@ApplicationPath("/api")
public class ApplicationConfig extends Application {
}

那麼這只是翻譯資源類註釋的問題。
以下Spring MVC程式碼:

@RestController
@RequestMapping(value = "/api/greeting", produces = MediaType.APPLICATION_JSON_VALUE)
public class GreetingController {

   @GetMapping
   public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
      ...
   }


轉換為以下MicroProfile程式碼:

@Path("/greeting") // 1
@Produces(MediaType.APPLICATION_JSON) // 2
public class GreetingResource {

   @GET // 3
   public Response greeting(@QueryParam("name") @DefaultValue("World") String name) {  // 4
      ...
   }


逐行解釋:
  1. JAX-RS端點類應該註釋@Path。此註釋也是為端點提供任何字首的位置。
  2. @Produces如果我們想要指定響應的內容型別,則必須使用單獨的註釋。它有一個名為的對應項,@Consumes用於指定接受的請求實體型別
  3. 處理請求的方法@GET,@POST,@DELETE,@PUT,或者@HEAD,取決於他們是為了處理HTTP方法。
  4. 我們的端點使用查詢引數。為了使它工作,我們在Spring MVC中使用了一個註釋@RequestParam。對於MicroProfile,要使用的註釋是@QueryParam。為了提供預設值,我們新增了一個@DefaultValue註釋。

有關javax.ws.rs其他可用註釋,請參閱  包。
重要的是還要提到@Context註釋。有了它,您可以將HTTP標頭或安全上下文等值注入方法或端點。

依賴注入
Spring的核心是它的依賴注入。使用MicroProfile,您可以使用CDI。
這主要意味著使用@Inject註釋而不是Spring的@Autowired 註釋:

@Inject
   private GreetingGenerator generator;


與Spring類似,CDI有一個bean的概念,這些bean生活在一定的作用域內,@Scope是用於控制作用域的,為Spring的Bean概念將轉換為  @ApplicationScoped,@RequestScoped等等CDI註釋。
這裡是一個GreetingGenerator 類:

@ApplicationScoped
public class GreetingGenerator {
 …
}


檢視  javax.enterprise.context軟體包以獲取所有可用選項的列表。
轉換非常簡單。唯一的問題是預設作用域不同。在Spring中,預設範圍是單例,在CDI中它是@Dependent- 與Spring的原型相對應的作用域。

配置
在我們的Spring應用程式中,我們使用@Value註釋注入配置值。使用MicroProfile Config,我們可以實現:

@Inject
@ConfigProperty(name = "greeting.message")
private String message;


上面的message欄位的值將取自META-INF/microprofile-config.properties。它可以被環境變數或系統屬性覆蓋。MicroProfile Config還提供了一種簡單的機制來定義自定義ConfigSource配置值的附加源。

執行
要獲取程式碼,請克隆GitHub儲存庫:

git clone https://github.com/michalszynkiewicz/from-spring-to-microprofile/

儲存庫包含兩個獨立目錄中的兩個專案。要構建其中任何一個,請導航到相應的目錄並執行以下命令:

mvn clean package

Spring Boot和Thorntail都生成了一個超級JAR。要執行Thorntail,請進入目標目錄並執行以下命令:

java -jar microprofile-from-spring-1.0-SNAPSHOT-thorntail.jar

現在,當您在瀏覽器中訪問http:// localhost:8080時,應該會看到所選應用程式公開的網頁。您可以透過瀏覽器試用該應用程式,也可以直接在http:// localhost:8080 / api / greeting?name = put-your-name-here訪問REST API 。

MicroProfile特點
雖然兩個示例應用程式的程式碼非常相似,但MicroProfile具有更多功能。
根據配置,MicroProfile應用程式還會公開:

  • REST端點的OpenAPI文件,位於http:// localhost:8080 / openapi
  • 應用程式指標,包括http:// localhost:8080 / metrics上的執行緒計數,堆使用情況等
  • 可以在http:// localhost:8080 / healthcheck上使用Kubernetes進行健康檢查

此外,在不修改配置的情況下,它可以使用其他MicroProfile規範,例如Fault Tolerance或型別安全的REST客戶端。

相關文章