如何用Spring Boot和Cloud實現微服務

2020-12-27 51CTO

如何用Spring Boot和Cloud實現微服務

本文將向您介紹如何使用Spring Boot和Cloud來實現微服務的基本部署和相互通信。

作者:陳峻譯來源:51CTO|2020-06-30 07:58

【51CTO.com快譯】近年來,憑藉著其架構中的各項優勢,微服務體系架構已經成為了應用程式開發的首選項。但是不可否認的是,每一種架構都有自身的短板,微服務架構也不例外。例如:在微服務架構中,我們可以部署許多被獨立開發出來的服務,以提供在某些特定場景下的功能。不過,它們需要通過不同的API或事件,來實現彼此之間的通信。有時,它們甚至需要與某些外部系統進行通信,以實現完整的系統功能。

雖然我們在開發的過程中,需要最小化某個微服務對於其他微服務的直接依賴性。但是在某些情況下,這是不可避免的。因此,我們需要在開發和部署微服務時,全面考慮並管理好諸如:服務發現(Service Discovery)、斷路器(Circuit Breaker)、分布式跟蹤(Distributed Tracing)、路由、連接器(Connector),配置(Configurations)等關係。

首先,我為您準備了如下關係圖。它向您展示了如何使用Spring Boot去構建微服務,以及如何使用Spring Cloud去部署和管理微服務。

如上圖所示,我用到了Spring Cloud所提供的各種產品。下面我將解釋每個組件能夠解決的實際問題。

  • Spring Cloud Gateway — 如下圖所示,那些所有來自網際網路(Web或OpenAPI)的、對於微服務的調用,都應當經由Gateway,以處理路由和交互(Cross-Cutting)之類的問題,其中包括:安全性、監控、以及魯棒性等方面。有關如何使用Spring Cloud來構建Gateway的內容,請訪問https://spring.io/projects/spring-cloud-gateway。

  • 配置伺服器(Config Server) – 如下圖所示,微服務往往自帶有許多配置,而這些配置對於系統整合測試(System Integrate Test,SIT)、用戶驗收測試(User Acceptance Test,UAT)、以及生產環境(PROD)都有所不同。因此,無論是在應用的外部,還是在其內部中心位置,這些配置都應該可以被直接管理和維護。此外,如果配置中有任何需要更改的地方,其應用代碼也不應被迫做相應的修改。Spring Cloud Config就能夠為分布式系統中的各種外部配置,提供伺服器端和客戶端的支持。使用Config Server,您可以在中心位置管理所有當前環境中應用程式的外部屬性。如果您想了解更多有關如何使用Spring Cloud,來輕鬆創建Config Server的詳細內容,請參見--https://spring.io/projects/spring-cloud-config。

  • 服務註冊表(Service Registry) - 各類用戶或服務需要使用不同類型的客戶端或伺服器端發現,來確定向它們發送請求的服務實例的具體位置。可是,問題在於:這些服務的客戶該如何知道那些對於每個環境都不盡相同的,可用的服務實例呢?業界常用的解決方案是實施Service Registry。它是針對各種可用服務、及其實例與位置的資料庫。畢竟各類服務實例在啟動的時候,都已經在服務註冊表中註冊過了。在此,Eureka Server能夠幫助我們創建對應的Service Registry伺服器,並將所有其他的服務都註冊上去。如果您想創建並啟用自己的註冊表伺服器,請使用spring-cloud-starter-netflix-eureka-server依賴項,以及@EnableEurekaServer。
  • Eureka Discovery Client – 不同的服務之間需要互相調用。如今,大多數微服務都是部署在虛擬機或容器化的環境之中,而且服務實例的數量、及其位置也是經常動態變化的。因此,我們需要實現一種機制,以使得服務客戶端能夠對那些動態更改的服務實例集發出請求。在此,Eureka Discovery Client正好派上用場。它可以幫助我們從Eureka服務註冊表中獲取已註冊的相關服務。據此,Spring Cloud能夠很容易地實現服務發現。如下圖所示,只要Spring Cloud Netflix和Eureka Core在類路徑(classpath)上,任何使用@EnableEurekaClient的Spring Boot應用,都會嘗試著用http://localhost:8761(其默認值為eureka.client.serviceUrl.defaultZone)與Eureka伺服器聯繫。

  • Zipkin Server - 在分布式系統中,僅了解一個實例的狀態是遠遠不夠的。我們往往需要匯總服務中所有實例的矩陣、日誌和跟蹤信息,以洞察到那些特定事務所採用的路徑。在此,我們需要用到分布式跟蹤(也稱為請求跟蹤,請參見--https://opensource.com/article/18/9/distributed-tracing-microservices-world)。它通過遵循一系列系統內部的整體操作,以查明發生故障的原因,以及性能欠佳的根源。作為一個分布式跟蹤系統,Zipkin(https://zipkin.io/)的功能主要包括數據的收集和查找。也就是說,它能夠協助收集服務架構中與延遲問題有關的各種時序數據(timing data)。因此,Spring Cloud在其整體方案中添加了zipkin,並據此推出了Spring Cloud Sleuth(https://spring.io/projects/spring-cloud-sleuth#overview),為分布式跟蹤提供了Spring Boot的自動化配置。
  • 斷路器(Circuit Breaker,Hystrix) — 在微服務架構中,如果某個服務不可用,那麼當另一個服務同步調用它時,就可能會花費過多時間去等到響應,同時讓會調用方消耗各種線程之類的資源。顯然,如果資源被耗盡,調用服務將無法處理其他類型的請求。因此,為了防止此類網絡或服務的故障,波及到其他服務,我們需要使用斷路器模式,來構建具有容錯和魯棒性的系統,以保證當關鍵服務不可用、或出現高延遲時,該系統仍可正常運行。在Spring Cloud體系中,我們可以通過Hystrix(https://spring.io/projects/spring-cloud-circuitbreaker)來實現該目的。如果您想具體了解如何在Spring boot應用中使用Hystrix,請參見教程--https://dzone.com/articles/microservices-part-4-spring-cloud-circuit-breaker。此外,Spring Cloud還提供了一個不錯的儀錶板,來監視Hystrix的各種命令狀態。您可以使用@EnableHystrixDashboard,這個主入口類,並通過Hystrix Dashboard Starter來創建一個Spring Boot應用程式。

Spring Feign Client - 在微服務架構中,服務與服務之間的通信可謂「家常便飯」,而您往往需要使用某種機制來調用(invoke)另一個服務。作為一種聲明性的Rest Client,Spring Feign Client能夠創建一個用JAX-RS或Spring MVC注釋所修飾的接口。如下圖所示,此類的動態實現非常容易被使用。

至此,想必您已經能夠通過上述介紹,了解了如何使用Spring Boot和Cloud來實現微服務的相關知識與流程。如果您感興趣的話,可以自己動手嘗試著編寫一套簡單的服務例子。

【原標題】Microservices Implementation using (Spring Boot and Cloud) (作者: Nitesh Gupta )

【51CTO譯稿,合作站點轉載請註明原文譯者和出處為51CTO.com】

【編輯推薦】

【責任編輯:

武曉燕

TEL:(010)68476606】

點讚 0

相關焦點

  • springcloud的微服務開發日記之五(zuul路由轉發)
    2018年的日程安排如下:記錄springcloud開發微服務的全過程記錄vue實現的知識圖譜服務記錄中醫理論在知識圖譜上的應用每天一個小目標,做比昨天更好的自己博客地址 i.drai.top有興趣的可以關注一下,共同進步另:關注後可點擊頭條號的「源碼」連結,有空閒時間我會不定期的上傳源碼以供參考
  • 微服務升級優點 - CSDN
    容錯性:在系統發生故障時,單一應用架構需要進行整個系統的修復,涉及到代碼的變更和應用的啟停,而微服務架構僅僅需要針對有問題的服務進行代碼的變更和服務的啟停。其他服務可通過重試、熔斷等機制實現應用層面的容錯。技術選型靈活:微服務架構下,每個微服務節點可以根據完成需求功能的不同,自由選擇最適合的技術棧,即使對單一的微服務節點進行重構,成本也非常低。
  • 基於SpringBoot Cloud構建的一個商城項目源碼分享
    基於springboot cloud構建的一個商城項目,包括前端,後端和h5應用,小程序,作為zscat應用實踐的模板項目。基於SpringBoot2.x、SpringCloud和SpringCloudAlibaba並採用前後端分離的企業級微服務敏捷開發系統架構。
  • Spring Cloud Alibaba到底坑不坑?
    所以你一用這玩意,其他的一些關鍵組件也得跟著全套的換,組件就不叫組件了!作者認為Spring Cloud的負載均衡和遠程調用必須使用Feign和Ribbon,這是Spring Cloud的默認實現。如果換成Dubbo,就是四不像了。說說我的想法:第一點:Dubbo在融入Spring Cloud的時候,真的就是四不像嗎?
  • Spring Boot與Shiro整合實現用戶認證
    實現用戶認證(登錄)操作1.4.1. 設計登錄頁面<!-- SpringBoot的Mybatis啟動器 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId
  • Spring Cloud 中 Zuul 網關到底有何牛逼之處?竟然這麼多人在用!
    Zuul是spring cloud中的微服務網關。網關:是一個網絡整體系統中的前置門戶入口。請求首先通過網關,進行路徑的路由,定位到具體的服務節點上。Zuul是一個微服務網關,首先是一個微服務。也是會在Eureka註冊中心中進行服務的註冊和發現。也是一個網關,請求應該通過Zuul來進行路由。Zuul網關不是必要的。是推薦使用的。
  • Spring 官方周報-2017/11/22
    本周我在洛杉磯和社區成員交談,然後在美國和家人朋友一起過感恩節。感恩節是一個表達我們感恩的機會。我敢肯定,當我說感謝你們的時候,Spring 和 Pivotal 的團隊也同樣希望表達他們對大家的感謝。感謝有你,這個令人驚嘆,興奮,充滿活力,和有趣的社區才能一直存在。
  • Spring Boot 節省95%內存佔用
    GraalVM[1] 是一種高性能的虛擬機,它可以顯著的提高程序的性能和運行效率,非常適合微服務。使用類似命令即可完成指定版本安裝和指定默認版本sdk install java 11.0.9.hs-adptsdk default java 11.0.9.hs-adpt不過安裝過程中需要從國外下載相關資源 ,筆者在嘗試後使用體驗並不是很好,所以建議大家下載指定版本 GraalVM 安裝即可(和 JDK 安裝方式一樣)。
  • Spring Cloud Gateway實現Token校驗
    校驗TokenGatewayFilter和GlobalFilter都可以,這裡用GlobalFilterpom.xml AuthorizeFilter.javaapplication.yml 這裡我還自定義了一個日誌收集過濾器用Postman訪問就能看到效果3.
  • Spring Boot 2.4 正式發布,重大調整!!!
    學不動也要學啊,不然就要被淘汰了,Java技術棧所有 Spring Boot 教程和示例源碼都上傳到 Github 了,歡迎 Star:https://github.com/javastacks/spring-boot-best-practice好吧,還是例行公事,接下來棧長帶大家來解讀下 Spring Boot 2.4.0 到底更新了什麼鬼
  • springboot+springsecurity實現前後端分離簡單實現!
    1、前言部分1.1、如何學習?看springsecurtiy原理圖的時候以為灑灑水,結果自己動手做的時候一竅不通,所以一定不要眼高手低,實踐出真知!代碼本身有bug,或者就沒有我想要實現的效果。 實在不行我又跑去github上找開源項目學習,github由於是外國網站,國內訪問速度有點慢!!那就用國內的gitee吧,gitee上的開源項目都是結合實戰項目的,代碼邏輯也比較複雜,我對項目的業務邏輯沒什麼了解,感覺不適合我。
  • zuihou-admin-cloud 1.8 發布,支持 Cloud Alibaba 2.2.0
    新增 zuihou-boot 模塊用於存放 SpringBoot 相關配置,並將 zuihou-core 模塊中 base 包下的代碼移動到 zuihou-boot。9. zuihou-openfeign-starter 重命名為 zuihou-cloud-stater 用於存放 SpringCloud 相關配置。10.
  • 再見了Netflix,SpringCloud 2020.0.0正式發布
    如何繼續發展?你品,你細品Spring團隊意識到了這的確是個問題,因此在今年3月份作出了改變。❝雖然有Zuul 2.x,Archaius 2.x,但它們均不能向下兼容,無法平滑升級,因此幾乎等於無法使用❞從2018年至今處於維護狀態的模塊有(包括其對應的starter,此處並未列出):spring-cloud-netflix-archaiusspring-cloud-netflix-hystrix-contractspring-cloud-netflix-hystrix-dashboardspring-cloud-netflix-hystrix-streamspring-cloud-netflix-hystrixspring-cloud-netflix-ribbonspring-cloud-netflix-turbine-streamspring-cloud-netflix-turbinespring-cloud-netflix-zuul1
  • Spring Boot集成validation用於優雅的校驗API參數的合法性
    validation主要是校驗用戶提交的數據的合法性,比如是否為空,密碼是否符合規則,郵箱格式是否正確等等,校驗框架比較多,用的比較多的是hibernate-validator, 也支持國際化,也可以自定義校驗類型的註解,這裡只是簡單的演示校驗框架在Spring Boot中的簡單集成
  • 微服務架構開發實戰:如何實現微服務的自動擴展?
    如何實現微服務的自動擴展 前面講了一些關於自動擴展的理論知識,但如何實現自動擴展,並不是三言兩語就能夠說得清楚的。特別是為了實現前面提到的那些自動擴展的模式及策略,在作業系統級別方面會需要大量的執行腳本。在自動擴展方面,SpringCloud框架也並沒有給出確切的答案。
  • Spring Boot 2.3.0 發布 - OSCHINA - 中文開源技術交流社區
    > Couchbase Client 3.0 Elasticsearch 7.6 Kafka 2.5 Micrometer 1.5 MongoDB 4.0 支持 Java 14spring
  • Spring Boot 示例的@RestController 和 @RequestMapping註解
    Spring 有多個類型的註解,例如在包 org.springframework.context.annotation 和 org.springframework.stereotype 的註解。不僅僅是 @Component,他的派生註解 @Service、@Controller、@RestController 和 @Repository都在這個包中,實際上它就是在告訴使用者這些註解提供 stereotype 的特性(或者稱為功能、作用)。Stereotype 特性最早出現在J2EE6 中,可以理解為圍繞著 「元數據」 功能而發展出來的一種設計模式。
  • 微服務優劣勢
    EureKa Server: 服務註冊中心和服務發現中心。 ▲Spring Cloud總體架構 點評:從整體架構上來看,二者模式接近,都需要需要服務提供方,註冊中心,服務消費方。 2、微服務架構核心要素 Dubbo只是實現了服務治理,而Spring Cloud子項目分別覆蓋了微服務架構下的眾多部件,而服務治理只是其中的一個方面。
  • 2020年Spring Cloud最後一個大版本發布!
    更多版本關係和文檔索引可見:springcloud.com.cn更新內容發布內容1.Spring Cloud Commons的Bootstrap被默認禁用。導入配置的新方法採用Spring Boot 2.4新出的spring.config.import功能。
  • springcloud如此簡單---Eureka註冊中心
    defaultZone: http://127.0.0.1:${server.port}/啟動服務,訪問http://127.0.0.1:10000/將user-service註冊到eureka添加springcloud依賴<!