您好,登錄后才能下訂單哦!
如何使用Java來構(gòu)建微服務(wù),很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
要構(gòu)建微服務(wù),Java是一個(gè)非常好的選擇。如何在容器中使用Java構(gòu)建微服務(wù)?為你講述了三種構(gòu)建方案,無論是哪種方案,要實(shí)現(xiàn)微服務(wù),使用Java生態(tài)圈的組件都是經(jīng)過業(yè)界驗(yàn)證的。
1. 在Java生態(tài)系統(tǒng)中構(gòu)建微服務(wù)的策略有三種,分別為:無容器、自成容器、外置容器。
2. 以無容器的方式提供微服務(wù),會把整個(gè)應(yīng)用打包,包含所有依賴,打進(jìn)一個(gè)fat JAR包中。
3. 自成容器的微服務(wù)同樣也是打成單個(gè)JAR包,JAR包中會包含帶有第三方類庫的嵌入式框架。
4. 外置容器的微服務(wù)方式,會把整個(gè)Java EE容器和服務(wù)的實(shí)現(xiàn)打包進(jìn)一個(gè)Docker容器。
基于微服務(wù)的架構(gòu)給架構(gòu)師和開發(fā)者帶來了新的挑戰(zhàn),不斷出現(xiàn)的新語言和開發(fā)工具使我們得以應(yīng)對這個(gè)挑戰(zhàn)。Java也不例外,本文將探索在Java生態(tài)系統(tǒng)中構(gòu)建微服務(wù)的新思路。
不討論微服務(wù)的好壞,也不討論你是否應(yīng)該一開始就以微服務(wù)架構(gòu)來設(shè)計(jì)應(yīng)用,或者是否應(yīng)該將已有的龐大應(yīng)用重構(gòu)成微服務(wù)架構(gòu)。
這里討論的方法并不是僅有的方法,但它們會為我們看到其他可能帶來啟發(fā)。雖然本文的重點(diǎn)是Java生態(tài)系統(tǒng),但其中的概念對其他語言和技術(shù)也通用。
我在本文命名了幾種方式為“無容器”、“自成容器”、“外置容器”。這些術(shù)語并未被廣泛使用,但是它們能足以區(qū)分每種方法的特點(diǎn),我會在以下小節(jié)中討論。
在無容器的方式中,開發(fā)者把JVM上的所有組件都看作應(yīng)用的一部分。
無容器的方式使用單個(gè)JAR包部署(所謂的"fat JAR部署"),意味著,這個(gè)應(yīng)用以及它所有的依賴,都被打包成一個(gè)JAR文件,這個(gè)JAR可被作為獨(dú)立的Java進(jìn)程啟動(dòng)。
```sh
$ java -jar myservice.jar
```
這方法其中一個(gè)優(yōu)點(diǎn)是,可以根據(jù)需要非常簡單地停啟服務(wù),以達(dá)到擴(kuò)容或縮容的目的;另一個(gè)優(yōu)勢是方便實(shí)現(xiàn)分布式部署,只需要同步一個(gè)JAR文件就可以了。
另一方面,它的缺點(diǎn)是類庫依賴的兼容性問題。例如你需要使應(yīng)用支持事務(wù)特性,你只能靠自己了,或者需要引入支持這個(gè)功能是第三方類庫。以后,每當(dāng)你需要支持其他特性,例如說,持久化,就很可能會遇到類庫之間的兼容性問題。
單JAR包的部署方式有一個(gè)變體,就是把你的服務(wù)基于一個(gè)內(nèi)置框架構(gòu)建。通過這種方法,框架可以提供服務(wù)所需要的特性,開發(fā)者可以自行選擇哪些特性被包含在服務(wù)內(nèi)。
你可能會爭論說這和"無容器"方案不是一模一樣嗎?但是,在這我想特地區(qū)分開它們,因?yàn)椤白猿扇萜鳌钡姆桨笇?shí)際上會提供一套具兼容性的第三方類庫。
這種情況下,把Java EE容器作為一個(gè)必要的基礎(chǔ)似乎是適當(dāng)?shù)?。因此,你唯一需要的是Jave EE的API。注意這些依賴已經(jīng)由容器提供好了,這意味著最終應(yīng)用的WAR文件會非常小。這種微服務(wù)的實(shí)現(xiàn)方式和上邊的Wildfly Swarm例子一樣:[Gist Snippet](https://gist.github.com/ivargrimstad/c368221fa079285856e7)
這種方式的優(yōu)點(diǎn)是,容器通過標(biāo)準(zhǔn)的API提供了已驗(yàn)證標(biāo)準(zhǔn)功能的實(shí)現(xiàn),因此,作為一個(gè)開發(fā)者,你可以不關(guān)心底層細(xì)節(jié),完全集中在業(yè)務(wù)功能上。
這個(gè)方案的另一個(gè)優(yōu)點(diǎn)是,應(yīng)用層的代碼并不依賴于它所部署的Jave EE應(yīng)用服務(wù)器,無論它是[GlassFish](https://glassfish.java.net/), [WildFly](http://wildfly.org/), [WebLogic](http://www.oracle.com/us/products/middleware/cloud-app-foundation/weblogic/overview/index.html), [WebSphere](http://www.ibm.com/software/websphere)或者任何其他Jave EE兼容的實(shí)現(xiàn)。
缺點(diǎn)是你需要把服務(wù)部署進(jìn)一個(gè)容器中,所以一定程度上增加了部署的復(fù)雜度。
Docker
[Docker](https://www.docker.com/)現(xiàn)在要出場了,通過把Java EE容器和服務(wù)的實(shí)現(xiàn)打包進(jìn)一個(gè)Docker鏡像,可以達(dá)到和單JAR包方式部署差不多的效果,不同之處是服務(wù)是打包進(jìn)一個(gè)Docker鏡像而不是一個(gè)JAR包了。
```sh
Dockerfile
FROM jboss/wildfly:9.0.1.Final
ADD myservice.war /opt/jboss/wildfly/standalone/deployments
```
通過啟動(dòng)Docker引擎中的鏡像來開啟這個(gè)服務(wù)。
```sh
$ docker run -it -p 8081:8080 myorganization/myservice
```
Snoop
細(xì)心的讀者可能注意到前邊Spring Boot示例中的<code>@EnableEurekaClient</code>注解,這個(gè)注解通過Eureka把服務(wù)注冊了,讓它能被服務(wù)的消費(fèi)者發(fā)現(xiàn)。[Eureka](https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance)是Spring Cloud Netflix工具集的一部分,能極度簡化服務(wù)發(fā)現(xiàn)的配置。
Java EE并沒有提供這個(gè)特性,但是相應(yīng)的有幾個(gè)開源的方案。其中一個(gè)是[Snoop](https://github.com/ivargrimstad/snoop),與Eureka有[類似的功能](https://github.com/ivargrimstad/snoop),要使Java EE微服務(wù)能被路由到,唯一要做的一件事是使用@EnableSnoopClient注釋,詳見示例:[Gist Snippet](https://gist.github.com/ivargrimstad/34bfe4b5368a35d30007)
要構(gòu)建微服務(wù),Java是一個(gè)非常好的選擇,文中提到的任何一個(gè)方案都可以實(shí)現(xiàn)。對于相對簡單的服務(wù)來說,“無容器”或”自成容器”是更好的選擇,但是使用外置容器的方式,能更快捷簡單地構(gòu)建更復(fù)雜的服務(wù)。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。