足球资料库数据/孙祥/nba五佳球/足球直播哪个平台好 - cctv5今日现场直播

首頁 > 知識庫 > 正文

如何使用 Java 構建微服務?
2016-01-21 11:21:17   來源: mengyidan1988   評論:0 點擊:

【編者按】微服務背后的大理念是將大型、復雜且歷時長久的應用在架構上設計為內聚的服務,這些服務能夠隨著時間的流逝而演化。本文主要介紹了利用 Java 生態(tài)系統構建微服務的多種方法,并分析了每種方法的利弊。本文轉自OneAPM。 快速預覽 1 在 Java 生態(tài)系統中構建微服務的策略主要有:container-less, self-contained 和 in-container; 2 Contain
【編者按】微服務背后的大理念是將大型、復雜且歷時長久的應用在架構上設計為內聚的服務,這些服務能夠隨著時間的流逝而演化。本文主要介紹了利用 Java 生態(tài)系統構建微服務的多種方法,并分析了每種方法的利弊。本文轉自OneAPM

快速預覽

1.在 Java 生態(tài)系統中構建微服務的策略主要有:container-less, self-contained 和 in-container;
2.Container-less 微服務把應用程序及其所有依賴打包成單一的 jar 文件;
3.Self-contained 微服務也會將應用及其依賴打包成單一的Jar文件,但它還包含可能含有第三方庫的嵌入式框架;
4.In-container 微服務會打包一個完整的 Java EE 容器,并且它的服務是在 Docker image 中實現。
基于微服務的架構設計是架構師和程序員們面臨的一項新挑戰(zhàn)。然而,隨著語言及工具的不斷更新,架構師們完全有能力征服這樣的挑戰(zhàn)。 Java 也不例外,本文探討了使用Java生態(tài)系統來構建微服務的幾種不同方式。

介紹
本文不會討論微服務的好與壞,也不會建議你提前為微服務設計應用程序,或當它們出現在你龐大的應用中時,是否應該剝離這些微服務。

本文介紹的方法并不是唯一的,但應該可以達到拋磚引玉的效果。盡管本文的重點是使用 Java 生態(tài)系統來構建微服務,但這些概念同樣可以轉移到其它語言和技術中。

筆者把本文用到的方法命名為 container-less、self-contained 和 in-containe。這些名稱或許不是非常正式,但足以區(qū)分相互間的差別。接下來,筆者會詳細描述每種方法。

Container-less
在此方法中,開發(fā)者會將 JVM 之上的任何事物視為應用程序的一部分。

container-less 方法會啟用所謂的單 jar 部署(也可稱作“fat jar部署”),這也就意味著,應用程序及其所有依賴都會被打包成單一的jar文件,并且作為獨立的Java進程運行。



$ java -jar myservice.jar

該方法的第一個優(yōu)點就是當對應用的規(guī)模進行伸縮時,服務很容易按需求快速啟動和停止;另一優(yōu)點是方便部署,你只需要傳遞一個 jar 文件即可。

該方法的缺點就是庫的兼容性。對于事務支持這類問題,你需要自己來實現,或必須引入第三方庫才能實現。而后,如果你需要更多支持,例如持續(xù)性問題的支持,你就需要解決第三方庫之間的兼容性問題。

Self-contained
另一種單 jar 部署就是使用一個嵌入式框架來構建服務。在此方法中,框架提供了所需服務的實現方法,開發(fā)者可以選擇在項目中包括哪些服務。

你可能會認為這個方法與 container-less 完全一樣,但筆者認為,兩者的區(qū)別在于,self-contained 方法會提供一套相互兼容的第三方庫。所以,該方法不存在庫兼容性問題。



該方法可能涉及 Spring Boot、Wildfly Swarm 之類的工具。

Spring Boot
在Java中,Spring BootSpring Cloud Netflix項目對構建微服務提供了很好的支持。 Spring Boot 允許你選擇各種 Spring 工具和其它流行的工具,然后把它們和你的應用打包成一個 jar 文件。Spring Initializr 提供了一個簡單的復選框列表來完成上面這些事。一個簡單的Hello World服務示例如下: Gist Snippet

Wildfly Swarm
在 Java EE 中,和 Spring Boot 相對應是Wildfly Swarm。它允許你根據自己的需求挑選 Java EE 規(guī)范,然后把它們和你的應用程序打包成一個 jar 文件。這里有一個簡單的 Hello World 示例:Gist Snippet

self-contained 方法的優(yōu)點是你可以自主選擇用于服務運行的項目。

這種方法的缺點是配置更加復雜,由于它在實際的服務中構建所需的容器功能,由此產生的jar文件也會稍大一些。

In-container
雖然在 Java EE 容器中部署微服務的開銷似乎很大,然而,一些開發(fā)者認為,微服務中的“微”并不表示該服務的小或者簡單。



在這些案例中,將 Java EE 容器作為所需平臺似乎是合適的。因此,你唯一需要的依賴就是 Java EE API 。注意,由于該依賴的實現是由容器提供的,因此該依賴項已經滿足了,這也就意味著所產生的 war 文件是非常精簡的,該服務的實現與上面 Wildfly Swarm 的例子是一樣的:Gist Snippet

該方法的優(yōu)點是,容器通過標準 API 提供了經過測試和驗證的標準功能的實現。因此,開發(fā)者可以完全聚焦于業(yè)務功能,并在應用代碼之外維護底層代碼。

另一個優(yōu)點是,應用程序代碼不依賴 Java EE 應用服務器,無論該應用部署到 GlassFishWildFlyWebLogicWebSphere還是任何與 Java EE 兼容的其他實現系統。

該方法的缺點是你需要把服務部署到容器中,這樣就增加了部署的復雜性。

Docker
現在來談談Docker 。通過把Java EE容器和服務實現打包到Docker鏡像,你可以得到與單一 jar 部署相似的結果。唯一的不同是服務打包在 Docker 鏡像中,而不是在 jar 文件中。
Dockerfile  FROM jboss/wildfly:9.0.1.Final  ADD myservice.war /opt/jboss/wildfly/standalone/deployments  

在Docker引擎中啟動Docker鏡像可以喚醒服務:
$ docker run -it -p 8081:8080 myorganization/myservice

Snoop
細心的讀者可能已經在先前的 Spring Boot 代碼段中注意到了 @EnableEurekaClient 注解。該注解在Eureka中注冊服務,使其能夠被服務消費者發(fā)現。 Eureka 是 Spring Cloud Netflix 包的一部分,并且是一個極易使用和配置服務發(fā)現的解決方案。

Java EE 在外部并沒有提供這樣的功能,但是有一些開源解決方案可以使用,其中一個就是Snoop它的功能與Eureka相似。要使 Java EE 微服務支持任務查找,唯一要做的是使用 @EnableSnoopClient 注解,如本例所示:Gist Snippet

總結
在構建微服務時, Java 是一個非常好的選擇。本文中介紹的任何一種方法都可以實現微服務。當然,最好的方法還是根據服務需求而定。對于簡單的服務, container-less 或者 self-contained 服務就是不錯的選擇。不過,借助 in-container ,開發(fā)者可以更快更簡單地實現更高級的服務。無論針對哪種服務,Java 生態(tài)系統都能提供行之有效的實現方法。

原文:[urlhttps://dzone.com/articles/building-microservices-with-java]https://dzone.com/articles/building-microservices-with-java[/url]
譯文地址:http://news.oneapm.com/building-microservices-with-java/

相關熱詞搜索:java spring 微服務 language 編程語言

上一篇:Save our Scrum作者訪談
下一篇:.NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0簡介

分享到: 收藏