SpringCloud | 單體商城項目拆分(微服務)

為什么要進行微服務拆分?

在平常的商城項目中,我們一般的項目結構模塊都是將各種業務放在同一個項目文件夾,比如像:

用戶,購物車,商品,訂單,支付等業務都是放在一起,這樣很容易一個文件改動造成多個文件也要變動,而且在團隊項目中也不容易維護,所以可以進行微服務拆分,來解決這個問題。

怎么拆分?

從拆分目標來說,要做到:

  • 高內聚:每個微服務的職責要盡量單一,包含的業務相互關聯度高、完整度高。
  • 低耦合:每個微服務的功能要相對獨立,盡量減少對其它微服務的依賴。

從拆分方式來說,一般包含兩種方式:

  • 縱向拆分:按照業務模塊來拆分
  • 橫向拆分:抽取公共服務,提高復用性

對于hmall商城項目,它分為5大模塊:

  1. 用戶模塊
  2. 商品模塊
  3. 購物車模塊
  4. 訂單模塊
  5. 支付模塊

我這里采用的是橫向拆分,把它們公共的服務提取出來放在hm-api里面

比如在購物車模塊里面,它使用到了商品模塊里面的服務,

那么就可以把購物車模塊里面用到的商品模塊里面的服務抽取出來。

實現微服務拆分

前提:

IDEA(2021以上版本),JDK11,VMware Workstation Pro,MobaXterm

會使用docker,涉及到服務的遠程調用(這里使用的是nacos注冊中心)

項目架構:

hm-api:抽取出來的公共服務

用戶業務

新建項目:

從原本的單體商城項目中,把用戶模塊的內容復制過來,如圖:

這里還有很重要的是配置yaml文件

application.yaml

application-dev.yaml

application-local.yaml

在運行前,先配置一下UserApplication

連接上虛擬機,開啟MySQL和nacos

一些命令:

# 設置開機自啟systemctl enable docker#查看docker ps#啟動數據庫docker start mysql#訪問nacosdocker log -f nacos

運行成功:

同理,剩下的4個業務也是這樣拆分,其實公共服務就是把各個業務交織的部分,抽取出來,這樣就只需要在hm-api里面去調用就可以,

并且pom.xml里面要引入這個公共服務api

<!--        hm-api--><dependency><groupId>com.heima</groupId><artifactId>hm-api</artifactId><version>1.0.0</version></dependency>

hm-api

項目結構:

client:

package com.hmall.api.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;
import java.util.Set;@FeignClient("cart-service")
public interface CartClient {@DeleteMapping("/carts")void deleteCartItemByIds(@RequestParam("ids") Set<Long> ids);
}
package com.hmall.api.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;
import java.util.Set;@FeignClient("cart-service")
public interface CartClient {@DeleteMapping("/carts")void deleteCartItemByIds(@RequestParam("ids") Set<Long> ids);
}
package com.hmall.api.client;import io.swagger.annotations.ApiImplicitParam;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
@FeignClient("trade-service")
public interface TradeClient {@ApiImplicitParam(name = "orderId", value = "訂單id", paramType = "path")@PutMapping("/orders/{orderId}")void markOrderPaySuccess(@PathVariable("orderId") Long orderId);
}
package com.hmall.api.client;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient("user-service")
public interface UserClient {@PutMapping("/users/money/deduct")public void deductMoney(@RequestParam("pw") String pw, @RequestParam("amount") Integer amount);
}

總結:

微服務架構,首先是服務化,就是將單體架構中的功能模塊從單體應用中拆分出來,獨立部署為多個服務。同時要滿足下面的一些特點:

  • 單一職責:一個微服務負責一部分業務功能,并且其核心數據不依賴于其它模塊。

  • 團隊自治:每個微服務都有自己獨立的開發、測試、發布、運維人員,團隊人員規模不超過10人

  • 服務自治:每個微服務都獨立打包部署,訪問自己獨立的數據庫。并且要做好服務隔離,避免對其它服務產生影響

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45675.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

thinkphp:數據庫多條件查詢

一、使用if條件限制查詢條件 $query Db::table(wip_operation_plan)->alias(d)->join([wip_jobs_all > a], a.wip_entity_name d.wip_entity_name)->join([sf_item_no > c], a.primary_itemc.item_no)->field(d.*,c.item_no as item_no,c.item_name as i…

線上觀看 3 萬+!「智能運維MeetUp」精彩回顧,探討智能體構建新方向

龍蜥社區“走進系列”第 11 期走進中興通訊-智能可觀測運維技術 MeetUp 于成都圓滿結束&#xff0c;由中興通訊聯合龍蜥社區系統運維聯盟&#xff08;SOMA&#xff09;&#xff08;以下簡稱“聯盟”&#xff09;共同舉辦。本次活動現場匯聚了阿里云、諧云科技、乘云數字、中興通…

MySQL數據庫day7.11

一&#xff0c;SQL概述 1.1 SQL語句語法 MySQL 數據庫的 SQL 語句不區分大小寫&#xff0c;關鍵字建議使用大寫&#xff0c; 以分號結尾。例如&#xff1a; SELECT * FROM user; 使用 /**/ 、 -- 、 # 的方式完成注釋 /* 多行注釋 */ -- 單行注釋 # 單行注釋 SELECT * FRO…

vue2 ant-design select組件自定義下拉框, dropdownRender 使用,以及遇到的坑

業務需求&#xff1a;下拉框需要滿足用戶可輸入篩選 和 點擊右側 字符按鈕 #A-Z進行用戶選擇 1、基礎頁面代碼 <div><a-selectstyle"width: 100%"placeholder"請選擇客戶"allow-clearshow-search:filter-option"false":not-found-con…

計算機硬件---如何更新自己電腦的BLOS

1找官網 例如“我使用的是HP&#xff08;惠普&#xff09;品牌的電腦”我只需要在瀏覽器上搜索“惠普官網”或“惠普-blos更新” 就可以看到&#xff0c;來自官網中更新blos的信息 2.有些品牌要查序列號該怎么辦呢&#xff1f; 有許多方法可以查詢&#xff0c;例如&#xf…

android13 frameworks里面常用的保存信息或者版本判斷的方法

總綱 android13 rom 開發總綱說明 目錄 1.前言 2. 數據庫 2.1 代碼讀取用法參考 3.prop 屬性配置 3.1 property的key值有哪些特點 4.區別 5. 其他數據存儲 6.彩蛋 1.前言 frameworks 不像我們一般開發app那樣,很多應用保存的方法都無法使用。這里記錄我們系統rom開…

Java性能優化-if-else簡化技巧

場景 Java性能優化-switch-case和if-else速度性能對比&#xff0c;到底誰快&#xff1f;&#xff1a; Java性能優化-switch-case和if-else速度性能對比&#xff0c;到底誰快&#xff1f;-CSDN博客 如果單純是做情景選擇&#xff0c;建議使用switch&#xff0c;如果必須使用i…

關于java的反射

???反射是啥呀相信許多學java的同學非常困惑在學的時候&#xff0c;總是感覺懂了卻又沒懂或者直接忽略過去了&#xff0c;那么本文就帶大家探討一下什么是反射在java中以及它的機制和運用。 ??什么是反射&#xff1a; 首先我們知道一些知識&#xff1a; 維基百科的解釋 …

武漢市集成電路領域重點產業鏈研究咨詢服務機構申報條件、時間

武漢市集成電路領域重點產業鏈研究咨詢服務機構公開遴選有關內容如下&#xff0c;武漢市的企業單位可以了解一下 一、采購內容 &#xff08;一&#xff09;項目名稱 武漢市集成電路領域重點產業鏈研究咨詢服務項目。 &#xff08;二&#xff09;項目內容 為進一步推動我市…

springboot項目 導入 maven坐標 錯誤 Could not transfer artifact XXX

1.報錯原因 當時導入的是 redis坐標 &#xff0c;導入jar 包報錯&#xff08;當時是網速太慢了&#xff0c;一直卡著不動 就關了 idea 重新下載&#xff09;結果報錯 之前的redis 項目都可以的&#xff0c;網上找了一下 都沒解決 2.解決辦法 既然說不能傳輸&#xff0c; 就說…

有用的工具

一、appuploader Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate這是一款p12證書查看的工具&#xff0c; 需要建立一個apple ID專用密碼&#xff1a;Manage your Apple ID

redis其他類型和配置文件

很多博客只講了五大基本類型&#xff0c;確實&#xff0c;是最常用的&#xff0c;而且百分之九十的程序員對于Redis只限于了解String這種最常用的。但是我個人認為&#xff0c;既然Redis官方提供了其他的數據類型&#xff0c;肯定是有相應的考量的&#xff0c;在某些特殊的業務…

C++相關概念和易錯語法(22)(final、純虛函數、繼承多態難點)

1.final final在繼承和多態中都可以使用&#xff0c;在繼承中是指不想將自己被繼承&#xff0c;在多態中是指不想該函數被重寫&#xff0c;比較簡單&#xff0c;下面是一些使用例子。 2.純虛函數 當我們需要抽象一個類的時候&#xff0c;我們就需要用到純虛函數。所謂抽象的類…

C# 4.0 等待線程結束

在C#中&#xff0c;如果你正在使用多線程編程&#xff0c;并且想要等待一個或多個線程完成它們的工作再繼續執行&#xff0c;有幾種方式可以實現。從C# 4.0開始&#xff0c;雖然直接用于等待線程結束的特性&#xff08;如Thread.Join()&#xff09;在之前的版本中也已經存在&am…

升級版凱撒密碼加密解密器

目錄 開頭程序程序的流程圖程序加密與解密的效果例1加密的過程加密之后的文本 例2解密之后的文本解密之后的文本 例3加密之后的文本加密之后的文本 結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們來看一下我用C語言編譯的升級版凱撒密碼加密解密器和與之相關…

小程序 - - - - - 實現漸隱漸顯(監聽滾動距離版)

代碼如下&#xff1a; <!-- fixed-left --> <view class"fixed-box" animation"{{animationData}}">這里是漸隱漸顯的標簽 </view>.fixed-box {position: fixed;left: 0;top: 0;z-index: 999;background-color: #ccc;/* background-colo…

如何設計統計量及相關假設檢驗

一、如何設置H0和H1假設 誰做H0&#xff0c;誰做H1&#xff0c;在統計學的假設檢驗里是有約定俗成的規定的。即&#xff1a;status quo&#xff08;默認/現狀&#xff09;是H0&#xff0c;而新觀點或試圖challenge現狀的是H1。H1也叫research hypothesis&#xff0c;所以我們做…

【多個Python版本存在,使用pip+不同版本安裝庫時,windows彈出打開方式窗口的解決方法】

問題描述 電腦上存在python3.9&#xff0c;3.10&#xff0c;3.11&#xff0c;安裝順序也是先安裝3.9&#xff0c;然后3.10&#xff0c;最后3.11&#xff0c;那么直接使用pip安裝&#xff0c;會裝在3.11的位置&#xff0c;經過搜索可以通過pip版本&#xff0c;比如pip3.9 insta…

1.3- Zygote

第三節 Zygote 在Android系統中&#xff0c;Zygote是一個非常核心的組件&#xff0c;它扮演著孵化新應用程序進程的角色。Zygote是Android啟動過程中創建的第一個Java虛擬機&#xff08;JVM&#xff09;實例&#xff08;在Android中稱為Dalvik或ART虛擬機&#xff0c;取決于An…

如何在勒索軟件攻擊中幸存下來:最佳備份實踐、勒索攔截方案

無論身處什么業務或行業&#xff0c;數據都是您業務的關鍵資產。沒有針對數據進行安全可靠的備份保護&#xff0c;您將會受到許多“可能性”的威脅&#xff0c;無論數據丟失是由于在鍵盤上灑了飲料還是遭受到了勒索軟件的攻擊。 為了確保業務不被中斷&#xff0c;企業數據不會…