天天看點

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    我們最後介紹一個新的微服務架構,它建構在支援分層且可靠的<code>JavaEE</code>技術棧上(使用JBoss WildFly 應用伺服器),WildFly Swarm是一個完全相容WildFly應用伺服器,它基于可重用的元件,這裡稱為元件(fractions)來組成微服務應用。組裝這些元件和你使用maven或者gradle去添加依賴一樣簡單,你隻需要聲明元件,WildFly Swarm将會幫助你完成後續的工作。

    應用伺服器和<code>JavaEE</code>在企業級Java應用的領域耕耘了快20年了,WildFly(以前叫JBoss Application Server)作為一個開源的Java應用伺服器在市場上出現,企業在<code>JavaEE</code>技術棧上的投入非常巨大(不論是開源還是專有的供應商),包括教育訓練、工具開發、管理等方面。<code>JavaEE</code>通常都是能夠幫助開發人員建構分層的應用,因為它提供了諸如:<code>servlets/JSP</code>、<code>transactions</code>、元件模型、消息以及持久化等技術。<code>JavaEE</code>應用在部署時,将會打包成為EARs(包括了WARs或者JARs以及配置),一旦你完成了打包,你就需要找到一個應用伺服器,然後安裝。你可以利用應用伺服器的高階特性,比如:動态部署或者重複部署(雖然這些在生産環境上用的比較少,但是在開發态比較有用),同時你的包也利用了應用伺服器的特性,隻會包含必要的jar包,變得非常輕,一般隻會包含所需要的業務邏輯。雖然應用的包變小了,但是應用伺服器卻變得很臃腫,因為它不得不包含應用所有可能需要的依賴。應用伺服器中的每個<code>JavaEE</code>元件都會極力優化自己的依賴,同時它們之間也會互相隔離。

    應用伺服器在一個執行個體中提供了管理、部署以及配置多個應用的唯一入口,一般情況下為了提高可用性,會在不同的節點上部署多個執行個體。當越來越多的應用部署到一個應用伺服器執行個體上後,問題開始出現,一個程序,一個JVM,很容易出問題。如果遇到多個團隊開發的不同應用,都部署在一個應用伺服器上,不同的應用類型、應用開發周期的不同、不同應用對于性能和SLA的要求,将會讓情況變得更糟。相比微服務架構所提供的快速響應變化、創新以及自治,<code>JavaEE</code>應用這種将所有應用部署在單點、共享的方式就顯得過于笨拙,不僅僅如此,考慮在一個單點去管理和監控多個應用就顯得非常複雜。單個JVM好管理,可是在一個JVM裡面放置多個應用就不那麼好管理了,當我們在這個單點上使用昂貴的工具進行檢測和調試找問題的時候,你就會更加感受這種痛苦了。一個解決方式就是在一個應用伺服器中隻部署一個應用。

    雖然微服務不屑于<code>JavaEE</code>環境下的開發,但是不代表元件模型、APIs以及<code>JavaEE</code>技術沒有價值。我們仍舊能夠使用持久化、事務、安全以及依賴注入等特性,我們如何将<code>JavaEE</code>這些技術帶入到微服務中呢?WildFly Swarm就是用來做這個的。

    WildFly Swarm會根據你的<code>pom.xml</code>或者<code>gradle file</code>計算決定你需要何種<code>JavaEE</code>依賴,比如:<code>CDI、新消息或者servlet</code>,然後會将應用打包為一個統一的jar(就像Spring Boot和Dropwizard一樣),這樣打包的應用就包含了最小化的<code>JavaEE</code>環境。這個過程叫拼裝剛好夠用的<code>JavaEE</code>環境,它能讓你繼續使用<code>JavaEE</code>的API,而自由的選擇使用微服務的方式運作,或者部署到傳統的應用伺服器中。你甚至可以将一個已經存在的WAR工程,通過WildFly Swarm将其建構成為包含了元件的微服務,而這種強大的能力使得你可以迅速的将一個已有的項目轉化成為一個微服務部署模式的應用。

    如果你有一個已經存在的Java工程,你可以通過修改一下<code>pom.xml</code>來讓其變為一個WildFly Swarm,首先添加一個WildFly Swarm插件。

    如果項目想使用<code>JavaEE</code>的依賴,可以選擇依賴WildFly DOM(bill of materials),在<code>&lt;dependencyManagement&gt;</code>元素下增加以下内容:

    現在你可以添加其他的<code>JavaEE</code>元件(或者你可以進行使用自己的依賴,讓WildFly Swarm自己偵測依賴),接下來讓我們看看<code>jboss-forge</code>如何建構工程。

筆者嘗試将<code>hola-backend</code>按照如上方式改成WildFly Swarm,但是結果并不如意 嘗試改造已有的web工程,結果也不好,可以看到這種方式隻是一種點綴

    一旦你安裝了<code>jboss-forge</code>,你可以在指令行下通過鍵入:<code>forge</code>,啟動它。

在mac下使用Homebrew可以安裝它,運作:brew install jboss-forge就可以了

    進入<code>jboss-forge</code>後,可以使用<code>project-new</code>來進行項目的建立。接下來我們建立一個WildFly Swarm項目:<code>hola-wildflyswarm</code>,并且為這個應用添加REST以及WildFly Swarm的支援。

可以通過<code>wildfly-swarm-run</code>來啟動項目,但是退出項目遇到點小問題

    我們将工程導入到IDE中,可以看到一個應用的骨架,如果我們打開<code>pom.xml</code>,會看到相關的<code>JavaEE</code>APIs以及WildFly Swarm插件。

    記住,WildFly Swarm隻會打包你需要的<code>JavaEE</code>架構,在這個例子中,我們首先添加了JAX-RS(<code>rest-setup</code>),是以WildFly Swarm會自動包含JAX-RS以及servlet元件,并将它們打包到你的應用中。

在WildFly Swarm中,有三個類型的類加載器,首先是啟動它的SystemClassLoader,第二個是應用的類加載器,也就是用來執行使用者代碼的地方,最後一個是WildFly,有理由相信,WildFly Swarm利用了JBoss子產品化技術,而這個技術的運用,使得應用代碼隻需要依賴标準的API,而具體的<code>JavaEE</code>實作和自己已經隔離開來

    現在在<code>jboss-forge</code>下,使用<code>rest-new-endpoint</code>添加一個JAX-RS端點。

進入到<code>hola-wildflyswarm</code>目錄下,執行forge

    在IDE中,可以看到已經建立了一個類<code>HolaResource</code>:

    我們可以通過在<code>jboss-forge</code>中運作<code>wildfly-swarm-run</code>将應用啟動起來,打開浏覽器通路:<code>http://localhost:8080/api/holaV1</code>,會看到如下頁面。

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    是不是很快,我們做了些什麼?我們使用<code>jboss-forge</code>建構了一個JAX-RS的web應用,它使用原生的<code>JavaEE</code>技術,能夠以微服務的形式運作。

Apache DeltaSpike Configuration是一個2014年的Duke選擇獎獲得者,也非常不錯

    Apache DeltaSpike Configuration是一個CDI擴充的集合,用來簡化諸如:配置、資料擷取以及安全等方面,接下來就需要使用CDI擴充來将配置注入到代碼中,而配置的來源能夠是指令行、屬性檔案、JNDI或者環境變量。首先添加CDI的依賴。

    由于使用了Apache DeltaSpike Configuration,使用它需要建立<code>META-INF/apache-deltaspike.properties</code>,在這個配置中放置我們需要的配置。

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    這樣針對變量<code>WF_SWARM_SAYING</code>,就可以注入這個值了,下面建立<code>HolaResource2</code>。

    可以看到如果沒有<code>WF_SWARM_SAYING</code>配置,将會預設使用Hola,接着我們打包運作。

    打開浏覽器,通路:<code>http://localhost:8080/api/holaV2</code>,可以看到以下内容。

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    我們停止應用,然後導出一個環境變量,然後再啟動應用。

    打開浏覽器,再次通路:<code>http://localhost:8080/api/holaV2</code>,可以看到内容已經變化。

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    暴露應用的Metrics十分簡單,隻需要添加一個依賴一個maven坐标即可,添加坐标:

    它将啟動WildFly管理以及監控功能,從監控的角度看,WildFly Swarm暴露了一些基本的Metrics:

/node

目前部署節點的資訊

/heap

堆資訊

/threads

Java的線程資訊

    在微服務環境下,服務之間是會進行互相調用的,如果我們想使用之前的服務,就需要使用JAX-RS用戶端,就像之前在Spring Boot微服務下調用books接口一樣。

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    接下來建立一個類型<code>GreeterResource</code>,使用JAX-RS用戶端通路<code>hola-backend</code>,由于使用了JAX-RS,是以與<code>hola-dropwizard</code>的代碼有些類似。

    在<code>hola-wildflyswarm</code>目錄下,執行<code>mvn clean package</code>,完成應用的打包。在運作應用前,需要指定<code>hola-backend</code>服務端的位置,我們可以通過環境變量指定。

    打開浏覽器通路:<code>http://localhost:8080/api/greeting/1</code>,可以看到如下展示。

Java微服務開發指南 -- 使用WildFly Swarm建構微服務使用WildFly Swarm建構微服務

    通過本章内容,介紹了WildFly Swarm的基本使用方式,以及同Dropwizard和Spring Boot的對比,了解到如何暴露REST端點、配置、Metrics以及調用外部服務。快速的介紹WildFly Swarm不能面面俱到,下面是深入了解它的一些資源。

由于使用了jboss-module子產品化系統啟動應用,WildFly Swarm啟動的速度慢于Spring Boot和Dropwizard,但是其隔離的展現,使得應用的jar包非常簡單,舊有的<code>JavaEE</code>遷移會有優勢,官方更新速度很快,但是小問題也很多

<a href="http://wildfly-swarm.io">WildFly Swarm</a>

<a href="http://wildfly-swarm.io/documentation">WildFly Swarm documentation</a>

<a href="https://github.com/wildfly-swarm/wildfly-swarm-examples">WildFly Swarm examples on GitHub</a>

<a href="https://github.com/wildfly-swarm/wildfly-swarm">WildFly Swarm Core examples on GitHub</a>

<a href="http://wildfly-swarm.io/posts/">WildFly Swarm blog</a>

<a href="http://wildfly-swarm.io/community/">WildFly Swarm Community</a>