天天看點

SpringCloud之服務拆分和實作遠端調用案例

服務拆分

對單體架構項目來說:簡單友善,高度耦合,擴充性差,适合小型項目。

而對于分布式架構來說:低耦合,擴充性好,但架構複雜,難度大。

微服務就是一種良好的分布式架構方案:

①優點:拆分粒度更小、服務更獨立、耦合度更低

②缺點:架構非常複雜,運維、監控、部署難度提高

SpringCloud是微服務架構的一站式解決方案,內建了各種優秀微服務功能元件。

微服務拆分時的幾個原則:

不同微服務,不要重複開發相同業務

微服務資料獨立,不要通路其它微服務的資料庫

微服務可以将自己的業務暴露為接口,供其它微服務調用

拆分案列:

SpringCloud之服務拆分和實作遠端調用案例

cloud-demo是父工程,是用來管理依賴的。

order-service:訂單微服務,負責訂單相關業務

user-service:使用者微服務,負責使用者相關業務

要求:

  • 訂單微服務和使用者微服務都必須有各自的資料庫,互相獨立
  • 訂單服務和使用者服務都對外暴露Restful的接口
  • 訂單服務如果需要查詢使用者資訊,隻能調用使用者服務的Restful接口,不能查詢使用者資料庫

實作遠端調用

在order-service服務中,有一個根據id查詢訂單的接口,根據id查詢訂單,傳回值是Order對象,如圖,其中的user為null。

SpringCloud之服務拆分和實作遠端調用案例
SpringCloud之服務拆分和實作遠端調用案例

在user-service中有一個根據id查詢使用者的接口:

SpringCloud之服務拆分和實作遠端調用案例

查詢結果:

SpringCloud之服務拆分和實作遠端調用案例

現在通過實作遠端調用,在查詢訂單的同時,根據訂單中包含的userId查詢出使用者資訊,一起傳回。

SpringCloud之服務拆分和實作遠端調用案例

是以,我們需要在order-service中 向user-service發起一個http的請求,調用http://localhost:8081/user/{userId}這個接口。

大概的步驟是這樣的:

  • 注冊一個RestTemplate的執行個體到Spring容器
  • 修改order-service服務中的OrderService類中的queryOrderById方法,根據Order對象中的userId查詢User
  • 将查詢的User填充到Order對象,一起傳回

注冊RestTemplate

在order-service服務中的OrderApplication啟動類中,注冊RestTemplate執行個體:

SpringCloud之服務拆分和實作遠端調用案例

修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法:

SpringCloud之服務拆分和實作遠端調用案例

查詢結果:

SpringCloud之服務拆分和實作遠端調用案例
SpringCloud之服務拆分和實作遠端調用案例

假如我們的服務提供者user-service部署了多個執行個體,那麼

order-service在發起遠端調用的時候,該如何得知user-service執行個體的ip位址和端口?

有多個user-service執行個體位址,order-service調用時該如何選擇?

order-service如何得知某個user-service執行個體是否依然健康,是不是已經當機?

上述問題将在注冊中心中可以得到解決,接下來還會繼續介紹關于Eureka注冊中心和Nacos注冊中心。