【分布式微服務專題】從單體到分布式(一、SpringCloud項目初步升級)

目錄

  • 前言
  • 閱讀對象
  • 閱讀導航
  • 前置知識
  • 筆記正文
    • 一、單體服務介紹
    • 二、服務拆分
    • 三、分布式微服務升級前的思考
      • 3.1 關于SpringBoot/SpringCloud的思考【有點門檻】
    • 四、SpringCloud升級整合
      • 4.1 新建父子項目
  • 學習總結
  • 感謝

前言

從本節課開始,我將自己手寫一個基于SpringCloud框架的web服務集群,中間會引入常用的微服務中間件。如:配置中心、網關、鏈路追蹤、斷路器等等。
本節課只是簡單地從原有單體項目,然后升級成SpringCloud架構。

閱讀對象

  1. 需要有實際Springboot-web開發經驗

閱讀導航

系列上一篇文章:《【分布式微服務專題】微服務架構演進》
系列下一篇文章:《[【分布式微服務專題】【微服務專題】從單體到分布式(一、SpringCloud整合Nacos)(整理中…)]》

前置知識

筆記正文

一、單體服務介紹

為了升級演示效果,我寫了一個簡單的SpringBoot單體應用,架構如下:
在這里插入圖片描述

然后實現的功能也很簡單,直接list獲取庫里面所有的數據。主要如下:
1)會員管理模塊:提供一個/user/list接口,獲取數據庫里面所有用戶數據
2)錢包管理模塊:提供一個/wallet/list接口,獲取數據庫里面所有錢包數據
3)商品管理模塊:提供一個/product/list接口,獲取數據庫里面所有商品數據
在這里插入圖片描述
在這里插入圖片描述

整體代碼比較簡單,就不貼了。我們前面有說過單體服務的缺點和限制,這邊重申一下:
1)修改任意代碼,甚至是application.yml都要重新打包編譯部署,重啟服務
2)單體機器存在性能瓶頸
3)很多時候,不同的服務QPS可能不一樣,所以水平拓展的時候粒度不夠精細

第三點對沒有經驗的小白可能理解上有點困難。簡單說就是:在電商系統里面,正常來說訪問商品模塊的人,會比訪問會員模塊的人多。然后服務的性能瓶頸可能往往就是QPS最高的那個模塊引起的,此時需要水平拓展服務,但由于是單體,所以每次拓展,都是對整個系統的拓展。但最理想的效果應該是,只對QPS最高的商品模塊拓展

二、服務拆分

服務拆分之后,其實就可以理解為這就是所謂的【微服務】概念了。微服務簡單說:一個 springboot 就是一個 微服務,并且這個 springboot 做的事情遵循單一職責。 比如說,在這里,服務經過拆分之后架構圖成為了這樣:(我新拓展了一個【訂單服務】,雖然上面沒貼,但是不妨礙理解)
在這里插入圖片描述

甚至,經過水平拓展,也就是我們說的集群化之后,還可能是這樣:
在這里插入圖片描述
不過,隨著服務的拆分,有一些衍生問題,卻又無法避免。如下:

  1. 如何確定那些服務彼此之間的調用鏈路

比如上述架構圖,可能存在會員服務調用訂單服務的情況,那訂單服務有兩個服務,我怎么知道具體調用的是9081還是9082呢。甚至我的會員服務可能也有多臺機器,那勢必存在笛卡爾積的情況,他們之間的鏈路可能會更為復雜

  1. 同一組服務之間,甚至所有微服務之間,如何共享配置信息,配置如何自動刷新

比如說我多個微服務之間使用的是同一個數據庫,redis,mq,這些配置信息理論上是可以共享的,而不必在每一個應用的application.yml文件上都聲明

  1. 集群有新的服務上線,或者下線,如何處理

服務注冊與發現

  1. 微服務如何不暴露細節,以一個整體去提供服務

網關

  1. 分布式事務
  2. 等等…(有一些我自己也不清楚,學習中)

三、分布式微服務升級前的思考

3.1 關于SpringBoot/SpringCloud的思考【有點門檻】

不知道你們是否跟我一樣有同樣的疑問,即:

  1. 什么是SpringBoot,如何新建一個SpringBoot項目
  2. 什么是SpringCloud,如何新建一個SpringCloud項目
  3. SpringCloudAlibaba和SpringCloud有什么關系

說來屬實慚愧,我在此之前,真的沒有很清晰的認知。只記得他們分別是Spring腳手架、微服務腳手架。但是我在做項目升級的時候發現,如果我的認知還是停留在這樣片面的層次,會給我帶來些不小的阻礙。

問題1:什么是SpringBoot,如何新建一個SpringBoot項目
不知道你們是否也一樣,每次新建SpringBoot項目我都得重新百度一下如何新建,或者說,使用Idea的Spring Initializer來新建,不然對如何從空白項目新建一個SpringBoot沒啥概念。經過這兩天的學習之后,我終于是有點理解了。
簡而言之,創建一個SpringBoot項目大概有如下三種方式:

  1. 新建一個繼承自spring-boot-starter-parent的項目。如下:(這里分享一個相關知識點的傳送門:《理解spring-boot-starter-parent》,大家伙學習下)
    在這里插入圖片描述

spring-boot-starter-parent主要是為我們使用、構建SpringBoot項目,提供了一些默認的配置。包括:

  1. 定義了Java編譯版本為1.8。
  2. 使用UTF-8格式編碼。
  3. 繼承自spring-boot-dependencies,這個里邊定義了Java+Spring開發常用依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號
  4. 預定義了一些Maven執行打包操作的配置
  5. 自動化的資源過濾。
  6. 自動化的插件配置。
  7. 針對application.properties和application.yml的資源過濾,包括通過profile定義的不同環境的配置文件,例如applicationdev.properties和application-dev.yml。

    使用spring-boot-starter-parent作為父項目,子項目可以繼承父項目的依賴項、插件配置和默認設置,從而簡化子項目的配置和管理。子項目可以通過在其pom.xml文件中引用父項目來繼承這些配置,例如通過元素指定父項目的坐標。將相關的模塊組織成多模塊項目,可以提高代碼的可維護性、復用性和團隊協作效率。同時,使用父項目和子項目的結構,還可以方便地進行整體構建、測試和部署,保證模塊之間的一致性和協調性
  1. 新建一個項目,在<dependencyManagement>中添加spring-boot-dependencies的依賴
    在這里插入圖片描述

Spring Boot中的spring-boot-dependencies是一個特殊的依賴項,它提供了一組預定義的版本控制,用于管理Spring Boot及其相關庫的版本。
在Spring Boot項目中,spring-boot-dependencies依賴是一個非常重要的依賴項,它主要作用是統一管理Spring Boot及其相關庫的版本,避免版本沖突,簡化依賴項管理。通過引入spring-boot-dependencies,你可以確保所使用的Spring Boot及其相關庫的版本始終兼容,并能夠輕松地升級到新的版本。
具體來說,spring-boot-dependencies包含了一個BOM(Bill of Materials)文件,這是一個包含了一系列庫的清單,指定了這些庫的版本號。當你在Maven或Gradle構建工具中添加spring-boot-dependencies依賴時,它會自動引入這個BOM文件。你可以直接聲明其他Spring Boot相關的依賴項,并且這些依賴項會自動采用BOM中指定的版本。例如,你可以聲明spring-boot-starter-web依賴,并且該依賴會自動使用BOM中定義的Spring Boot版本。
使用spring-boot-dependencies可以帶來很多好處。首先,它可以統一管理所有的Spring Boot相關庫的版本,避免不同庫之間的版本沖突。其次,它可以簡化依賴項的管理,不需要在每個項目中手動指定每個庫的版本號。最后,它可以確保所使用的庫的版本兼容性和一致性,避免因版本不同導致的問題。
總之,spring-boot-dependencies是Spring Boot框架提供的一個版本控制機制,它可以簡化和統一項目中所使用的庫的版本管理,確保版本的兼容性和一致性。

  1. 新建一個空白項目,在<dependency>中添加SpringBoot的依賴

其實就是沒有使用上面1/2說的這兩個做法咯。在這種情況下,需要我們自行去管理、確定依賴包的版本,容易出現兼容性問題。

通常,我們通過Spring Initializer或者Ali在線云原生構建也好,生成出來的SpringBoot都是采用方案1、2。

不知道大家有沒有用心看我上面的介紹,我這邊最后再結合自己的理解,簡單的總結一下:

  1. 我們通常新建一個SpringBoot項目的時候,之所以在pom中繼承自spring-boot-starter-parent主要是為了簡化配置。這些簡化配置包括:默認的JDK版本、默認的項目編碼格式UTF-8、自動化的資源配置、插件配置。最重要的是,spring-boot-starter-parent繼承自spring-boot-dependencies
  2. 而在spring-boot-dependencies中,定義了一系列Spring開發中,常用的jar包依賴,根據我的發現,在里面主要是包含了國外知名廠商的jar包,比如org.apache的東西
  3. 因為在spring-boot-dependencies里面預包含了很多jar包依賴,所以我們在實際使用中,很多jar包的引用不需要再顯式地指定version。如下:
    在這里插入圖片描述

問題2:什么是SpringCloud,如何新建一個SpringCloud項目
我感覺在想通了問題1之后,對于這個問題我就沒多少疑惑了。盲猜SpringCloud就是提供了很多關于微服務開發常用的中間件jar包依賴。根據我的理解也確實是這樣

問題3:SpringCloudAlibaba和SpringCloud有什么關系
下面是我在【文心一言】看到的答案:

Spring Cloud Alibaba是Spring Cloud的子項目,符合Spring Cloud標準。它是一套完整的分布式解決方案,旨在推廣阿里的產品。如果使用了Spring Cloud Alibaba,最好使用alibaba整個體系產品。

因此,Spring Cloud Alibaba和Spring Cloud的關系是,前者是后者的一部分,符合后者的標準。

但其實我不是很贊同這個說法,我覺得多少有點不準確。通過查看spring-cloud-dependenciesspring-cloud-alibaba-dependencies會發現,他們只是繼承了同一個spring-cloud-dependencies-parent項目而已,所以文心一言說Spring Cloud Alibaba是Spring Cloud的子項目,符合Spring Cloud標準也沒錯。不過我個人認為:SpringCloud是SpringCloud公司給出的一個通用分布式微服務技術合集。而Spring Cloud Alibaba則是阿里給的一套,自己的解決方案,里面的微服務中間件都是阿里系的。說不定哪一天你就看到了Spring Cloud TencentSpring Cloud ByteDanceSpring Cloud HuaWei
在這里插入圖片描述

我在后面將使用Spring Cloud Alibaba,大家可以通過傳送門看看介紹:傳送門。根據官方介紹,我們想要使用Spring Cloud Alibaba,只需要在pom中引入下面的依賴:

<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${alibaba-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

附上一張,應該是Alibaba給出的分布式微服務生態圖:
在這里插入圖片描述

四、SpringCloud升級整合

4.1 新建父子項目

使用IDEA新建一個父子項目,具體過程我就不貼了,如果你理解了【三、分布式微服務升級前的思考】的內容,最后發現也沒那么難。當然,有時候需要一點Maven相關知識,我這邊建議直接花半個小時看看【菜鳥教程Maven系列】,個人認為比較需要了解的是:Maven構建生命周期、Maven POM
在這里插入圖片描述
在這里插入圖片描述
新建出來之后就是一個父子項目咯,然后每個項目有自己的@SpringBootApplication啟動類。
但顯然,這不是我們想要的結果,我們在【二、服務拆分】中提到的問題依然還沒有解決。如:

  1. 服務注冊與發現(微服務最重要的一個點)
  2. 分布式配置管理
  3. 服務限流降級
  4. 鏈路追蹤
  5. 分布式事務
  6. 等等

所以,接下來才是真正的重頭戲啊。后面我會逐步整合,下一篇則是整合Nacos配置中心到項目中。

學習總結

  1. 理解了SpringBoot跟SpringCloud項目的具體含義
  2. 對如何新建一個SpringBoot項目有個較為清晰的認知

感謝

感謝簡書大佬【作者:】的文章《理解spring-boot-starter-parent》

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

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

相關文章

如何輕松恢復 Windows 中刪除的文件夾

我們都曾經歷過這樣的事&#xff0c;而且我們中的大多數人可能很快就會再次這樣做。我們討論的是在 Windows 中按“Delete”或“ShiftDelete”鍵意外刪除重要文件夾的情況。 如果您剛剛按下刪除鍵且未超過 30 天&#xff0c;或者尚未清空回收站&#xff0c;則可以恢復文件夾。…

操作系統學習筆記---內存管理

目錄 概念 功能 內存空間的分配和回收 地址轉換 邏輯地址&#xff08;相對地址&#xff09; 物理地址&#xff08;絕對地址&#xff09; 內存空間的擴充 內存共享 存儲保護 方式 源程序變為可執行程序步驟 鏈接方式 裝入方式 覆蓋 交換 連續分配管理方式 單一連…

python安裝與工具PyCharm

摘要&#xff1a; 周末閑來無事學習一下python&#xff01;不是你菜雞&#xff0c;只不過是對手太強了&#xff01;所以你要不斷努力&#xff0c;去追求更高的未來&#xff01;下面先了解python與環境的安裝與工具的配置&#xff01; python安裝&#xff1a; 官網 進入官網下載…

lua腳本串口收發與CRC16校驗及使用方法

lua腳本CRC16校驗 --calculate CRC16校驗 --data : t, data to be verified --n : number of verified --return : check result function add_crc16(start, n, data)local carry_flag, a 0local result 0xfffflocal i startwhile(true)doresult result ~ data[i]for j…

git 關于分支、merge、commit提交

最近開始用git終端提交代碼&#xff0c;梳理了一些知識點 一 關于分支 關于分支&#xff0c;git的分支分為本地分支遠程分支兩種分支&#xff0c;在上傳代碼時&#xff0c;我們要確保當前本地分支連接了一個遠程分支。 我們可以通過下面代碼查看當前的本地分支&#xff1a; g…

迅為3588開發板 sudo: 無法解析主機:/DNS配置

環境申明 RK3588 ubuntu 22.04 jammy 迅為開發板 hostname 看是否有Host .&#xff0c;如果沒有&#xff0c; sudo vim /etc/hostname在里面加一行&#xff0c;我這就這一個 iTOP-RK3588hosts 修改本地hosts sudo vim /etc/hosts127.0.0.1 localhost localhost iTOP-RK3…

2.postman環境變量及接口關聯

一、環境變量以及全局變量 操作流程 1.點擊environment 2.點擊environment右側號&#xff0c;新增環境變量 3.在變量中輸入變量名以及變量值 4.回到collection頁面&#xff0c;修改變量環境 5.在collection中通過{{變量名}}調用變量 變量定義 環境變量&#xff1a;環境變量…

vue 限制在指定容器內可拖拽的div

<template><div class"container" id"container"><div class"drag-box center" v-drag v-if"isShowDrag"><div>無法拖拽出容器的div浮窗</div></div></div> </template><script&g…

P11 Linux進程編程exec族函數

前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《Linux C應用編程&#xff08;概念類&#xff09;_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《C_ChenPi的博客-CSDN博客》??? &#x1f6f8;推薦專欄3: ??????《鏈表_C…

Java 簡易版 UDP 多人聊天室

服務端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

算法通關村第五關—LRU的設計與實現(黃金)

LRU的設計與實現 一、理解LRU的原理 LeetCode146:運用你所掌握的數據結構&#xff0c;設計和實現一個LRU(最近最少使用)緩存機制 實現LRUCache類&#xff1a; LRUCache(int capacity) 以正整數作為容量capacity初始化 LRU 緩存 int get(int key) 如果關鍵字key存在于緩存中&a…

數據可視化|jupyter notebook運行pyecharts,無法正常顯示“可視化圖形”,怎么解決?

前言 本文是該專欄的第39篇,后面會持續分享python數據分析的干貨知識,記得關注。 相信有些同學在本地使用jupyter notebook運行pyecharts的時候,在代碼沒有任何異常的情況下,無論是html還是notebook區域,都無法顯示“可視化圖形”,界面區域只有空白一片。遇到這種情況,…

SQL(COALESCE)

zstarling 非空值查找及替換COALESCE 非空值查找及替換COALESCE 新語法SQL COALESCE(staff_no,staff_no1,)詳解 在SQL中&#xff0c;COALESCE函數用于返回一組表達式中的第一個非NULL值。它接受兩個或多個參數&#xff0c;并按參數順序依次判斷每個參數是否為NULL&#xff0c…

如何才能保證績效考核的有效性呢?

績效管理是現代人力資源管理的核心&#xff0c;做好績效考核是做好績效管理的重要手段。但企業績效考核的設計往往缺乏針對性和科學性&#xff0c;績效考核工作也常常停留在形式上&#xff0c;最終沒能為提高組織效率提供幫助&#xff0c;還消耗員工與管理者的時間、精力。于是…

Nginx服務優化以及防盜鏈

1. 隱藏版本號 以在 CentOS 中使用命令 curl -I http://192.168.66.10 顯示響應報文首部信息。 查看版本號 curl -I http://192.168.66.10 1. 修改配置文件 vim /usr/local/nginx/conf/nginx.conf http {include mime.types;default_type application/octet-stream;…

京東數據運營(京東API接口):10月投影儀店鋪數據分析

鯨參謀監測的京東平臺10月份投影儀市場銷售數據已出爐&#xff01; 10月份&#xff0c;環同比來看&#xff0c;投影儀市場銷售均上漲。鯨參謀數據顯示&#xff0c;今年10月&#xff0c;京東平臺投影儀的銷量為16萬&#xff0c;環比增長約22%&#xff0c;同比增長約8%&#xff1…

鴻蒙應用開發ArkTS基礎組件的使用

語雀知識庫地址&#xff1a;語雀HarmonyOS知識庫 飛書知識庫地址&#xff1a;飛書HarmonyOS知識庫 本文示例代碼地址&#xff1a;Gitee 倉庫地址 嗨&#xff0c;各位好呀&#xff0c;我是小白 上一篇文章我為大家介紹了如何使用 ArkTS 開發鴻蒙應用&#xff0c;對 HarmonyOS 項…

大文件分割,合并------C++ ------fstream

將一個大文件(這里測試文件為5.2G)切分為指定大小的文件,然后在把分割后的文件拼接合并為分割前的源文件 #include <boost/timer.hpp> // 計時函數#include <filesystem> #include <fstream> #include <vector> // 分隔后文件夾的格式, 原文件名_chun…

探索開源游戲的樂趣與無限可能 | 開源專題 No.47

CleverRaven/Cataclysm-DDA Stars: 9.0k License: NOASSERTION Cataclysm&#xff1a;Dark Days Ahead 是一個回合制的生存游戲&#xff0c;設定在一個后啟示錄世界中。盡管有些人將其描述為 “僵尸游戲”&#xff0c;但 Cataclysm 遠不止于此。在這個殘酷、持久、程序生成的世…

【原創】【一類問題的通法】【真題+李6卷6+李4卷4(+李6卷5)分析】合同矩陣A B有PTAP=B,求可逆陣P的策略

【鋪墊】二次型做的變換與相應二次型矩陣的對應&#xff1a;二次型f&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;xTAx&#xff0c;g&#xff08;y1&#xff0c;y2&#xff0c;y3&#xff09;yTBy ①若f在可逆變換xPy下化為g&#xff0c;即P為可逆陣&#xff0c;有P…