Spring Boot與Eclipse MicroProfile比較
到目前為止,您可能已經聽說過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 ... } |
逐行解釋:
- JAX-RS端點類應該註釋@Path。此註釋也是為端點提供任何字首的位置。
- @Produces如果我們想要指定響應的內容型別,則必須使用單獨的註釋。它有一個名為的對應項,@Consumes用於指定接受的請求實體型別
- 處理請求的方法@GET,@POST,@DELETE,@PUT,或者@HEAD,取決於他們是為了處理HTTP方法。
- 我們的端點使用查詢引數。為了使它工作,我們在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客戶端。
相關文章
- Spring Boot與Micronaut比較Spring Boot
- TomEE、Spring Boot與Quarkus比較 - BaptistaSpring BootAPT
- Node.js與Spring Boot比較? - Ryan GleasonNode.jsSpring Boot
- 什麼是Eclipse MicroProfile?Eclipse
- Spring Boot Native vs Go:效能比較 – Ignacio SuaySpring BootGo
- JAX-RS與Spring Boot對比Spring Boot
- spring boot外掛下載地址(eclipse4.6.3)Spring BootEclipse
- Laravel 和 Spring Boot 兩個框架比較創業篇(二:人工成本)LaravelSpring Boot框架創業
- Laravel 和 Spring Boot 兩個框架比較創業篇(一:開發效率)LaravelSpring Boot框架創業
- ==與equals比較
- Spring Boot系列 Eclipse 離線安裝外掛STSSpring BootEclipse
- Spring Boot虛擬執行緒與Webflux在JWT驗證和MySQL查詢上的效能比較Spring Boot執行緒WebUXJWTMySql
- HTTP方法之@RequestMapping與Spring組合註解比較 - RahulHTTPAPPSpring
- Hibernate與mybatis比較MyBatis
- yarn 與 npm 比較YarnNPM
- Vue與React比較VueReact
- Vuex與Redux比較VueRedux
- RecyclerView與ListView比較View
- React與Vue模板使用比較(一、vue模板與React JSX比較)ReactVueJS
- Spring和SpringBoot比較,解惑區別Spring Boot
- 微服務2.0時代:Spring Cloud Netflix與 Kubernetes&Istio比較微服務SpringCloud
- 關於Spring的JDBC連線mysql(與傳統jdbc比較)SpringJDBCMySql
- 10個用於開發Spring Boot的最佳Eclipse外掛Spring BootEclipse
- ElasticSearch與Spring Boot整合ElasticsearchSpring Boot
- Spring Boot與日誌Spring Boot
- SOA 、MSA與CNA比較
- Python與Excel VBA比較PythonExcel
- volatile與Atomic的比較
- Kanban與Scrum比較 - modernanalystScrumNaN
- Flutter 與 iOS 功能比較FlutteriOS
- Goland與vscode比較 - redditGoLandVSCode
- Flutter與Swift比較 - evroneFlutterSwiftVR
- Spring Boot學習之---Spring Boot與檢索 下(十六)Spring Boot
- _004_SpringBoot_使用eclipse工具搭建一個簡單的Spring bootSpring BootEclipse
- Spring Boot中兩個資料庫遷移工具Liquibase和Flyway的比較 - 4lexSpring Boot資料庫UI
- Web Socket 效能對比——Spring Boot vs TomWebSpring Boot
- Solr與Spring Boot整合 - ViithiisysSolrSpring Boot
- initialize方法與load方法比較