使用Java 構建微服務 - OSCHINA - 中文開源技術交流社區

2021-01-10 開源中國
快速瀏覽

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

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

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

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

介紹

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

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

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

container-less

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

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

$ java -jar myservice.jar


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

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

Self-contained

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

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

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

Spring Boot

Spring Boot和Spring 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容器能夠部署一個微服務,似乎需要很大的開銷,但是,需要記住的是:一些開發者主張微服務的「微」不意味著這個服務要微小或簡單。

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

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

該方法的另一個優點是實際應用程式代碼並不依賴於部署該代碼的Java EE應用伺服器,無論是GlassFish,WildFly,Weblogic,WebSphere,或其他Java EE兼容性實現。

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

Docker

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

DockerfileFROM jboss/wildfly:9.0.0.1.finalADD 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(翻譯:洪國安)

相關焦點

  • 開放源碼是開源軟體嗎? - OSCHINA - 中文開源技術交流社區
    許可協議必須技術中立(License Must Be Technology-Neutral):意即許可協議不得限制為電子格式才有效,若是紙本的許可協議也應視為有效。所以,與此類似的,在中文裡,我們可以認為:「開放原始碼」是一個動詞+一個名詞。而「開源」則是一個特定的詞彙。作為動詞,我們說將某某軟體開源,是一種行為。作為形容詞,我們稱某某軟體是一個開源(的)軟體,不僅僅是指我們能夠獲取到他的原始碼。
  • Greenplum 一體機硬體配置正式開源 - OSCHINA - 中文開源技術交流...
    如今,DELL將Greenplum資料庫一體機的硬體配置也開放給了Greenplum社區。Greenplum成為了全球首個MPP數據倉庫的軟體和硬體同時開源的平臺。我們堅信開放是未來的趨勢。在過去的兩年中,Greenplum團隊持續地幫助客戶設計、測試高級通用硬體平臺。
  • Go 語言 2019 調查報告發布 - OSCHINA - 中文開源技術交流社區
    Go 的使用仍集中在技術公司,但它同時也被用于越來越多的行業,例如金融和媒體。 Go 最常見的用途仍然是編寫 API/RPC 服務和 CLI 工具。 模塊在 Go 生態系統中的使用率很高,與此同時,圍繞軟體包管理的一些問題仍然存在。 有待改進的重點領域包括 debug、模塊和雲服務的體驗。
  • 發力太空領域,IBM 開源兩個新項目 - OSCHINA - 中文開源技術交流...
    IBM 宣布了兩個新的開源項目,旨在解決日益嚴重的「太空垃圾」問題,並幫助初創企業構建衛星星座應用。
  • Taro 3 支持 React Native - OSCHINA - 中文開源技術交流社區
    同時,Taro 是一款優秀的跨端開發框架,在 58 眾多產品線中都有使用,例如二手房、新房等。Taro 3 發布後暫不支持 React-Native 平臺,於是我們向社區提交了一份實現草案,希望把 58 在 React-Native 上的技術積累分享到社區,同時也從社區對 Taro 的共建上獲益。
  • Zenoss 宣布支持 Ceph 存儲監控 - OSCHINA - 中文開源技術交流社區
    本文由 Ceph中國社區-孫琦 翻譯,Devin校稿 英文出處:Zenoss Inc 歡迎加入 翻譯小組業界領先的IT監控和分析軟體,Zenoss Inc.,3月7宣布了Zenoss 5平臺的新增功能,增加了對
  • JFinal 4.9 發布,持續精雕細琢 - OSCHINA - 中文開源技術交流社區
    JFinal 堅持極簡設計,迭代近 10 年,卻只有 3 萬行代碼,比傳統的同等功能組合類框架要少幾十倍的代碼量,這使得開發者可以完全掌控其原始碼,也成為學習 java 框架設計的絕佳資源。    經過這麼多年的迭代,JFinal 已經非常完善、成熟。
  • 小諾官方文檔再次增強 - OSCHINA - 中文開源技術交流社區
    開源版本Java腳手架(快速開發平臺)層出不窮,作為一塊項目利器+私活利器,開發途中難免會遇到一些問題,這時大部分小夥伴也會想到說是去看官方文檔。
  • JavaScript 開發者年度調查報告 - OSCHINA - 中文開源技術交流社區
    這是 Javascript 社區一個偉大的時刻,我對未來的事情感到無比激動。I didn’t anticipate such high interest, and next time I』ll make some improvements to the format.
  • JAVA開源軟體的技術選型—開源軟體誕生2
    技術準備--第2篇 用日誌記錄「開源軟體」的誕生 【碼雲】或【GitHub】搜索「赤龍ERP」點亮星標,感謝支持,與開發者交流 kzca2000 根據場景選擇技術 遇到技術選型,常見的做法往往是選擇最前沿的
  • Ubuntu 風雨歷程記 - OSCHINA - 中文開源技術交流社區
    對我來說,Ubuntu是我進入Linux和養成開源思考方式的大門。Ubuntu教會我:電腦並不僅僅是windows、蘋果系統,還有比你從前了解的更好的選擇。讓我們一起回憶下,看看Ubuntu這些年怎麼走過來的吧,一直到今天漂亮,友好,超棒Linux發行版本。
  • 逛了五年GitHub,終於整理出七大java開源技術項目文檔,趕緊收藏
    前言大家都知道 Github 是一個程式設計師福地,這裡有各種厲害的開源框架、軟體或者教程。這些東西對於我們學習和進步有著莫大的進步,所以將 Github 上非常棒的七大Java開源項目技術文檔整理下來供大家學習!!!
  • Deno 1.6 發布 - OSCHINA - 中文開源技術交流社區
    除了 FFmpeg,其他許多知名開源項目,諸如 TinyCC、QEMU、JSLinux 以及比較新的 QuickJS 均出自 Fabrice Bellard 之手,詳情查看 https://bellard.org/。 FFmpeg 單詞中...
  • Java編程領域你需要懂得技術名詞解釋與常用開源框架理解
    將這些對象放在一個存儲空間(beanMap)中使用getBean方法從存儲空間(beanMap)中取出指定的JavaBeanAOP實現的技術: JDK動態代理技術 和 CGLIB技術(動態字節碼增強技術) 。
  • Rust 語言風靡學術界 - OSCHINA - 中文開源技術交流社區
    用他自己的話來說,這是「一種符合人類使用習慣,同時又具備高性能的語言」。最終他選用的語言就是 Rust 。Rust 最初由 Mozilla 工程師 Graydon Hoare 於 2006 年創建。Rust 融合了 C++ 語言的性能與其他高級語言更友好的語法,對代碼安全性問題提供了額外的關注。
  • 歷史上最偉大的 12 位程式設計師 - OSCHINA - 中文開源技術交流社區
    1981年開發在Unix上運行的Emacs類編輯器Gosling Emacs(以C語言編寫,使用Mocklisp作為擴展語言)。1983年獲得了美國卡內基梅隆大學計算機科學博士學位,博士論文的題目是:"The Algebraic Manipulation of Constraints"。畢業後到IBM工作,設計IBM第一代工作站NeWS系統,但不受重視。後來轉至Sun公司。
  • 5 個開源的 Java IDE 工具
    無論如何,據TIOBE 指數,在當今使用的程式語言中 Java 一直排名前三,擁有著 700 萬到 1000 萬開發者的社區。 有這麼多用 Java 編寫的代碼,這意味著有一些很好的集成開發環境(IDE)可供選擇,可以為開發人員提供有效地編寫、整理、測試和運行 Java 應用程式所需的所有工具。
  • OSCHINA 公布 2019 年度最受歡迎中國開源軟體
    它具有體量輕、性能高、易使用的特點,完美對接 Hadoop 與 Spark 生態,適用於工業物聯網應用中海量時間序列數據高速寫入和複雜分析查詢的需求。 RocketMQ 是一款分布式消息系統,基於高可用分布式集群技術,提供低延時的、高可靠的消息發布與訂閱服務。
  • Blend4Web 17.04 發布,WebGL 框架 - OSCHINA - 中文開源技術交流...
    我們很高興地介紹一個新的Blend4Web版本,這是一個用於創建交互式在線3D體驗的商業級開源框架。
  • Kubernetes 1.20 發布:妙啊 - OSCHINA - 中文開源技術交流社區
    此外,這些 Kubernetes 快照基元充當基本構建塊,為 Kubernetes 增加開發高級企業級存儲管理功能的能力,包括應用程式或集群級備份解決方案。快照支持需要 Kubernetes 發行商捆綁 Snapshot 控制器、Snapshot CRD 和驗證 Webhook。還必須在群集上部署支持快照功能的 CSI 驅動程序。