微服務的認識與拆分

微服務架構通過將應用分解為一組小的、獨立的服務來實現,每個服務圍繞特定業務功能構建,并能獨立部署與擴展。這種架構增強了開發靈活性、提高了系統的可維護性和擴展性,使得團隊可以更快地響應變化和市場需求。

目錄

認識微服務

單體架構

微服務架構

微服務拆分

服務拆分原則

拆分時機

拆分細則

微服務工程結構

服務拆分實現

服務調用


認識微服務

單體架構

單體架構:顧名思義,整個項目中所有功能模塊都在一個工程中開發;項目部署時需要對所有模塊一起編譯、打包;項目的架構設計、開發模式都非常簡單。

適用場景;當項目規模較小時,這種模式上手快,部署、運維也都很方便,因此早期很多小型項目都采用這種模式。

項目的業務規模越來越大,團隊開發人員也不斷增加,單體架構就呈現出越來越多的問題

  • 團隊協作成本高:試想一下,你們團隊數十個人同時協作開發同一個項目,由于所有模塊都在一個項目中,不同模塊的代碼之間物理邊界越來越模糊。最終要把功能合并到一個分支,你絕對會陷入到解決沖突的泥潭之中。

  • 系統發布效率低:任何模塊變更都需要發布整個系統,而系統發布過程中需要多個模塊之間制約較多,需要對比各種文件,任何一處出現問題都會導致發布失敗,發布耗時

  • 系統可用性差:單體架構各個功能模塊是作為一個服務部署,相互之間會互相影響,一些熱點功能會耗盡系統資源,導致其它服務低可用。

此時如果我們對系統做水平擴展,增加更多機器,資源還是會被這樣的熱點接口占用,從而影響到其它接口,并不能從根本上解決問題。這也就是單體架構的擴展性差的一個原因。

微服務架構

為了解決單體架構因為帶來的問題,于是微服務出現了。

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

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

  • 團隊自治:每個微服務都有自己獨立的開發、測試、發布、運維人員,團隊人員規模不超過10人(2張披薩能喂飽)

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

問題解決:

問題一:由于服務拆分,每個服務代碼量大大減少,參與開發的后臺人員在1~3名,協作成本大大降低

問題二:每個服務都是獨立部署,當有某個服務有代碼變更時,只需要打包部署該服務即可

問題三:每個服務獨立部署,并且做好服務隔離,使用自己的服務器資源,不會影響到其它服務

當然,對于Java領域開發者來說,SpringCloud框架可以說是目前最全面的微服務組件的集合。

微服務拆分

服務拆分原則

拆分時機

在項目初期,尤其是初創項目,通常優先考慮敏捷開發以快速產出可投入市場的最小可行產品(MVP),以便盡早驗證項目的可行性。此時,采用簡單的單體架構較為常見,因其開發成本低、部署快速,即便項目最終不被市場接受,損失也相對較小。隨著用戶量增長和業務復雜度提升,再逐步向微服務架構遷移,盡管這可能會導致后期因代碼耦合面臨拆分難題。

相反,對于從立項就目標明確的大型項目,考慮到長期發展和擴展性,初期即選擇復雜的微服務架構進行設計。這種方式雖然前期需要更多的資源投入,但有利于后續的維護與擴展,避免了日后服務拆分的困擾。簡而言之:

初創小項目:先用單體架構快速上線測試市場反應,之后視情況轉向微服務(前易后難)。

大型明確項目:直接采用微服務架構規劃長遠發展,減少后期重構麻煩(前難后易)。

拆分細則

拆分目標角度:

高內聚:每個微服務的職責要盡量單一,包含的業務相互關聯度高、完整度高。

耦合:每個微服務的功能要相對獨立,盡量減少對其它微服務的依賴,或者依賴接口的穩定性要強。

拆分方式角度:

縱向拆分:依據項目功能模塊進行拆分。例如,在一個電商應用中,可以將用戶管理、訂單管理、購物車、商品管理和支付等功能各自獨立為單獨的服務。這種方式提高了每個服務的內聚性,使得各服務專注于特定業務領域。

橫向拆分:識別并提取各個功能模塊中的共通業務邏輯作為通用服務。比如,無論是用戶登錄還是下單過程,都涉及到發送消息通知和記錄風控數據的操作。這些共用的功能可以被抽取出來,形成獨立的消息中心服務和風控管理服務。這樣做不僅提高了代碼復用性,減少了重復開發工作,而且由于接口相對穩定,不會造成服務間的過度耦合。

微服務工程結構

一般微服務項目有兩種不同的工程結構:

完全解耦

  • 描述:每個微服務是一個獨立工程,可使用不同語言開發。
  • 優點:服務間耦合度低。
  • 缺點:各自獨立倉庫,管理復雜。

Maven聚合

  • 描述:整個項目作為一個Project,各微服務為Module。
  • 優點:代碼集中,便于管理和運維。
  • 缺點:服務間存在耦合,編譯時間較長。

服務拆分實現

按照Maven聚合實現拆分對于小型項目更為合適。

針對于已經完成開發的項目,我們拆分一般按照以下步驟:

1.對于拆分服務的精確劃分,應盡量符合服務拆分原則

2.新建對于模塊,并且引入依賴,配置application.yaml等配置文件

3.正確引入實體類,controller,service,mapper等業務代碼

事實上,往往服務內都會需要進行,對于服務的調用,我們該如何跨服務調用?

服務調用

RestTemplate

Spring給我們提供了一個RestTemplate的API,可以方便的實現Http請求的發送。

先將RestTemplate注冊為一個Bean

@Configuration
public class RemoteCallConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

利用RestTemplate發送http請求

        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",// 請求URL,包含占位符{ids}HttpMethod.GET,// 使用GET方法null,// 不使用請求體或請求頭new ParameterizedTypeReference<List<ItemDTO>>() {}, // 指定響應類型為List<ItemDTO>Map.of("ids", CollUtil.join(itemIds, ","))// 替換URL中的{ids}為逗號分隔的itemIds字符串);// 2.2.解析響應if(!response.getStatusCode().is2xxSuccessful()){// 查詢失敗,直接結束return;}List<ItemDTO> items = response.getBody();

測試完畢:實現服務之間進行遠程調用

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

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

相關文章

高效編程指南:PyCharm與DeepSeek的完美結合

DeepSeek接入Pycharm 前幾天DeepSeek的充值窗口又悄悄的開放了&#xff0c;這也就意味著我們又可以絲滑的使用DeepSeek的API進行各種輔助性工作了。本文我們來聊聊如何在代碼編輯器中使用DeepSeek自動生成代碼。 注&#xff1a;本文適用于所有的JetBrains開發工具&#xff0c…

項目中同時使用Redis(lettuce)和Redisson的報錯

溫馨提示&#xff1a;圖片有點小&#xff0c;可以放大頁面進行查看... 問題1&#xff1a;版本沖突 直接上圖&#xff0c;這個錯表示依賴版本不匹配問題&#xff0c;我本地SpringBoot用的是2.7&#xff0c;但是Redisson版本用的3.32.5。 我們通過點擊 artifactId跟進去 發現它…

Jackson 詳解

目錄 前言 Jackson 是 Java 生態中最流行的 JSON 處理庫之一&#xff0c;廣泛應用于 RESTful API、數據存儲和傳輸等場景。它提供了高效、靈活的 JSON 序列化和反序列化功能&#xff0c;支持注解、模塊化設計和多種數據格式&#xff08;如 XML、YAML&#xff09;。本文將詳細介…

H.264,H.265,H.266標準技術改進

關于H.264,H.265,H.266相關資料鏈接&#xff1a; 標準及中文資料鏈接 視頻編碼中的主要技術 視頻編碼的目標是在保證視頻質量的前提下&#xff0c;盡可能減少數據量。以下是視頻編碼中的核心技術&#xff1a; 塊劃分&#xff08;Block Partitioning&#xff09; 將視頻幀劃分…

clickhouse安裝路徑

《ClickHouse安裝路徑指南》 大家好&#xff0c;今天我們將一起學習如何在電腦上找到和理解ClickHouse的安裝路徑。這將幫助學生、科研人員以及任何對數據庫技術感興趣的人更好地管理他們的數據查詢工作。 ClickHouse是一款列式存儲數據庫管理系統&#xff08;DBMS&#xff09…

時序數據庫 InfluxDB 3.0 版本性能實測報告:寫入吞吐量提升效果驗證

亮點總結&#xff1a; TSBS 測試表明&#xff0c;對于少于 100 萬臺設備的數據集&#xff0c;InfluxDB OSS 3.0 的數據寫入速度實際上比 InfluxDB OSS 1.8 更慢。 對于 100 萬臺及以上設備的數據集&#xff0c;InfluxDB OSS 3.0 的數據寫入性能才開始超過 InfluxDB OSS 1.8。…

AS32X601雙核鎖步MCU技術優勢分析

AS32X601是國科安芯公司研制的一系列基于32位RISC-V指令集車規級MCU處理器芯片。主頻高達180MHz&#xff0c;支持雙核鎖步架構&#xff0c;基于軟錯誤防護技術加持&#xff0c;顯著提高芯片安全性能。產品具有高安全、低失效、多IO、低成本、抗輻照等特點。 一、功能安全與可靠…

基于 LeNet 網絡的 MNIST 數據集圖像分類

1.LeNet的原始實驗數據集MNIST 名稱&#xff1a;MNIST手寫數字數據集 數據類型&#xff1a;灰度圖 &#xff08;一通道&#xff09; 圖像大小&#xff1a;28*28 類別數&#xff1a;10類&#xff08;數字0-9&#xff09; 1.通過torchvision.datasets.MNIST下載并保存到本地…

電池綜合測試儀:科技賦能,精準守護能源安全

在當今這個科技日新月異的時代&#xff0c;電池作為眾多電子設備的心臟&#xff0c;其性能的穩定與高效直接關系到設備的運行質量與使用安全。隨著電動汽車、可穿戴設備、儲能系統等領域的快速發展&#xff0c;對電池性能的檢測與評估提出了更高要求。在此背景下&#xff0c;電…

【Linux 22.4 ubuntu 安裝cuda12.1 完整方案】

下載cuda12.1 官網網址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已經安裝驅動&#xff0c;則不要選擇dirver那項 添加環境變量 vim ~/.b…

實戰案例分享:Android WLAN Hal層移植(MTK+QCA6696)

本文將詳細介紹基于MTK平臺&#xff0c;適配高通&#xff08;Qualcomm&#xff09;QCA6696芯片的Android WLAN HAL層的移植過程&#xff0c;包括HIDL接口定義、Wi-Fi驅動移植以及wpa_supplicant適配過程&#xff0c;涵蓋STA與AP模式的常見問題與解決方法。 1. HIDL接口簡介 HID…

Greenplum6.19集群搭建

一&#xff0c;安裝說明 1.1環境說明 1、首先確定部署的環境&#xff0c;確定下服務器的端口&#xff0c;一般默認是22的端口&#xff1b; 2、當前這份文檔是服務器處于10022端口下部署的&#xff08;現場生產環境要求&#xff0c;22端口在生產環境存在安全隱患&#xff09;&…

電商項目-秒殺系統(四)秒殺異步下單防止重復秒殺

一、 防止惡意刷單解決 在生產場景下&#xff0c;可能會有一些人會惡意訪問當前網站&#xff0c;來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂&#xff0c;出現臟數據&#xff0c;或者造成后端訪問壓力大等問題。 一般要解決這個問題的話&#xff0c;前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件&#xff1a; uniapp-v8-release.aar 2.提供uniapp調用的接口&#xff0c;新建類文件繼承UniModule&#xff0c; package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用戶相關

Android 多用戶相關 本文主要記錄下android 多用戶相關的adb 命令操作. 1: 獲取用戶列表 命令: adb shell pm list users 輸出如下: Users:UserInfo{0:機主:c13} running默認只有一個用戶, id為0 &#xff0c;用戶狀態為運行 2: 創建新用戶 命令&#xff1a; adb shell …

基于Spring Boot的高校就業招聘系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

前端安全面試題匯總及參考答案

目錄 簡述 XSS 攻擊的原理及三種常見類型(存儲型、反射型、DOM 型) 如何在前端防御 XSS 攻擊?列舉編碼、過濾、CSP 策略的具體實現方式 富文本編輯器場景下如何安全處理用戶輸入的 HTML 內容? 如何通過 HttpOnly 屬性增強 Cookie 安全性?它與 XSS 防御的關系是什么? …

Linux驅動開發(1.基礎創建)

序言&#xff1a;從高層邏輯到底層硬件的回歸 在當今的軟件開發中&#xff0c;我們習慣于用高級語言構建抽象層——通過框架、庫和云服務快速實現功能。這種“軟邏輯”的便利性讓開發效率倍增&#xff0c;卻也逐漸模糊了我們對計算機本質的認知&#xff1a;一切代碼終將落地為…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…

deepseek 本地部署

deepseek 本地部署 純新手教學&#xff0c;手把手5分鐘帶你在本地部署一個私有的deepseek&#xff0c;再也不用受網絡影響。流暢使用deepseek&#xff01;&#xff01;&#xff01; 如果不想看文章&#xff0c;指路&#xff1a;Deep seek R1本地部署 小白超詳細教程 &#xff0…