使用 Java 構建微服務

jopen 9年前發布 | 24K 次閱讀 Java

快速瀏覽

  1. 在Java生態中,構建微服務的策略包括Container-less,Self-contained,以及In-container等。

    </li>

  2. Container-less微服務將應用及其依賴打包成一個單一的jar文件。

    </li>

  3. Self-contained微服務也是打包成一個單一的Jar文件,但它還包括一個嵌入式框架,這個框架含有可選的第三方lib,當然這些lib是兼容的。

    </li>

  4. In-container微服務打包成一個完整的Java EE容器,該服務在Docker鏡像中實現。 基于微服務的架構給架構師和開發者帶來了新的挑戰,然而,隨著語言的升級和工具數量的增加,開發者和架構師完全有能力應對這樣的挑戰。Java也不例外,本文探討了在Java生態系統內構建微服務的不同方法。

    </li> </ol>

    介紹

    本文不會探討微服務是好還是壞,也不會建議你應該事先使用微服務設計你的app,或者當他們在monolith應用出現時,就應該提取這些服務。

    這里所描述的方法并不是唯一的,但它可以讓你對這些可能性有一個良好的縱覽。即使Java生態是本文所關注的領域,但這些理念也可傳遞到其他語言和技術中。

    在文中,我將這幾種方法分別稱為Container-less,Self-contained,以及In-container。這些術語可能尚未被完全確立,但在這里,它們可以達到區分這幾種方法的目的。我會在接下來的幾個部分中闡述它們的意義。

    container-less

    在Container-less方法中,開發者要將所有位于JVM頂層的一切事物作為應用的一部分。

    Container-less方法使得所謂的單一JAR部署成為可能(也稱作“fat JAR”部署),這意味著,應用及其依賴可以打包在一個單一的JAR文件,并作為一個獨立的Java程序運行。

    container-less.png

    $ java -jar myservice.jar


    這種方法的優點是:當應用在進行擴展和收縮時,服務的啟動和停止是極其輕松的。另一個優點是部署簡單,你只需傳遞一個JAR文件。

    該方法的缺點是lib庫的兼容性,你需要自己獨立解決一些像事務處理之類的事情,或者需要引入第三方lib庫為方案提供支持。隨后,如果你需要像持久性之類的支持,你可能需要面對lib庫兼容性的問題。

    Self-contained

    另一個單一JAR部署的變形是使用嵌入式框架構建微服務。在該方法中,框架提供了所需服務的實現,同時,開發者可以選擇哪一些東西要包含在該服務中。

    你可能認為這與Container-less的解決方案一樣,但我在這里要區分一下它們,因為self-cotained方法允許你使用第三方lib庫,并且你知道這些lib庫是兼容的。

    self-contained.png

    該方法涉及到像Spring Boot和Wild Swarm之類的工具。

    Spring Boot

    Spring BootSpring Cloud Netflix 項目對使用Java構建微服務有著很好的支持。Spring Boot允許你挑選各種Spring生態系統中的工具,以及流行的第三方工具,并將這些工具和你的應用打包在一起。Spring Initializr使得你可以使用簡單復選框列表的方式完全這一工作,這里有一個簡單的Hello  World服務的例子,Gist Sinppet

    Wildfly Swarm

    在Java EE中,與Spring Boot相對應的就是Wildfly Swarm。它允許你挑選所需的部分Java EE規范,并將其和應用以JAR文件的形式打包在一起。Hello World的例子,Gist Snippet

    Self-contained方法的優點是你可以只挑選足以讓服務運行的組件。

    該方法的缺點是配置有點復雜,以及由此產生JAR文件有點大,因為它的構建是為了實際服務中所需的容器功能。

    In-container

    雖然要求一個完整的Java EE容器能夠部署一個微服務,似乎需要很大的開銷,但是,需要記住的是:一些開發者主張微服務的“微”不意味著這個服務要微小或簡單。

    in-container.png

    在這些案例中,將Java EE容器視為所需平臺似乎是合適的,因為你所需的唯一依賴是Java EE API。注意:由于其實現是由容器提供,因此該依賴項已經滿足了。這意味著由此產生的WAR文件是極其精實的,該服務的實現和上述Wildfly Swarm的例子一樣,參考這里,Gist Snippet

    這種方法的優點是該容器通過標準APIs提供了測試和驗證標準功能的實現,因此,作為一名開發者,你可以完全集中于業務功能,并且在應用代碼之外維護底層代碼。

    該方法的另一個優點是實際應用程序代碼并不依賴于部署該代碼的Java EE應用服務器,無論是GlassFishWildFlyWeblogicWebSphere,或其他Java EE兼容性實現。

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

    Docker

    Docker從這里開始。通過將Java EE容器和服務實現打包進Docker鏡像,你可以或多或少地取得和單一JAR開發同樣效果。不同的是服務現在位于容器內,而不是JAR文件中。

    Dockerfile
    FROM jboss/wildfly:9.0.0.1.final
    ADD myservice.war /opt/jboss/wildfly/standalone/deployments


    通過啟動Docker引擎中的Docker鏡像,喚醒該服務。

    docker run -it -p 8081:8080 myorganization/myservice

    Snoop

    細心的讀者可能之前注意到Spring Boot代碼段中的@EnableErekaClient注解,該注解在Eureka中進行服務注冊,使得它可以被服務請求者所發現。Eureka是 Spring Cloud Netflix包中的一部分,它是一種極其容易使用和配置的服務發現解決方案。

    Java EE沒有在外部提供這樣的機能,但這里有幾種開源方案。其中一種就是Snoop,其功能與Eureka類似。為了使一個Java EE微服務可以用于服務查找,唯一需要做的是使用@EnableSnoopClient注解,如本例所示:Gist Snippet

    總結

    在構建微服務時,Java是一個很好的選擇。這里所描述的方法都可以很好地完成任務。至于你個人的特殊情況,最佳方法取決于其服務 需求。對于簡單的服務,一個container-less或者self-contained服務是最佳選擇,但借助于in-container的實現,開 發者可以更快,更簡單地實現高級服務。總之,對于微服務的實現,Java是一種行之有效的生態系統。

    更多關于微服務的見解,JVM語言,以及在Java中的趨勢,可以在 DZone Guide to the Java Ecosystem!獲取到。

    原文鏈接: Building Microservices With Java(翻譯:洪國安)

    本文轉載自: http://dockone.io/article/804

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!