springCloud -- 微服務01

目錄

一、認識微服務

1.單體架構

2.微服務

3.SpringCloud?

二、微服務拆分

1.服務拆分原則

2.服務調用

3. RestTemplate

三、服務注冊和發現

1. 注冊中心原理

2. 服務發現

2.1 服務注冊

2.2 服務發現

四、OpenFeign


一、認識微服務

1.單體架構

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

當項目規模較小時,單體架構上手簡單、部署、運維都很方便。但是一旦項目規模變大,例如淘寶那樣的,單體架構就遠遠不夠了。

2.微服務

微服務架構就是將單體架構中的功能模塊從單體架構中拆分出來,獨立部署為多個服務。同時滿足以下要求:

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

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

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

例如上面的商城項目就可以拆分為多個模塊,然后獨立部署。

3.SpringCloud?

微服務拆分以后碰到的各種問題都有對應的解決方案和微服務組件,而SpringCloud框架可以說是目前Java領域最全面的微服務組件的集合了。

SpringCloud依托于SpringBoot的自動裝配能力,大大降低了其項目搭建、組件使用的成本。

在選擇SpringCloud版本的時候,一定要選擇與SpringBoot相對應的版本。

二、微服務拆分

1.服務拆分原則

拆分微服務時,要保證高內聚、低耦合的原則。即對一個微服務進行修改,不會對另一個微服務產生影響。

服務拆分方式有兩種:縱向拆分和橫向拆分。

所謂縱向拆分,就是按照項目的功能模塊來拆分。例如商城項目中,就有用戶管理功能、訂單管理功能、購物車功能、商品管理功能、支付功能等。那么按照功能模塊將他們拆分為一個個服務,就屬于縱向拆分。這種拆分模式可以盡可能提高服務的內聚性。

橫向拆分,是看各個功能模塊之間有沒有公共的業務部分,如果有將其抽取出來作為通用服務。例如用戶登錄是需要發送消息通知,記錄風控數據,下單時也要發送短信,記錄風控數據。因此消息發送、風控數據記錄就是通用的業務功能,因此可以將他們分別抽取為公共服務:消息中心服務、風控管理服務。這樣可以提高業務的復用性,避免重復開發。同時通用業務一般接口穩定性較強,也不會使服務之間過分耦合。

2.服務調用

因為上述的商城項目使用的是單體架構,一個功能可以隨意調用另一個功能的方法。但是再拆分之后,兩個模塊之間沒有任何聯系。如果購物車業務中需要查詢商品信息,此時就需要去訪問商品模塊,流程如下:

代碼中需要變化的是這一步:

3. RestTemplate

Spring給我們提供了一個RestTemplate的API,可以方便的實現Http請求的發送。常見的Get、Post、Put、Delete請求都支持,如果請求參數比較復雜,還可以使用exchange方法來構造請求。

首先,需要在請求服務的微服務模塊中定義一個配置類,將RestTemplate注冊為一個Bean:

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

之后,在調用服務的Service類中進行遠程調用:

此時,購物車模塊就可以查詢到商品的相關信息了。

在調用之前,要將RestTemplate這個Bean對象進行注入。

三、服務注冊和發現

如果上述商品的微服務模塊被調用的較多,為了應對更高的并發,進行了多實例部署,如圖:

我們會發現,每一個實例的端口都是不一樣的(實際上可能ip地址也不相同)。但是在上述代碼中我們將ip地址寫死了,導致不管部署多少個實例,都只會調用同一個實例。為了解決該問題,就需要引入注冊中心的概念。

1. 注冊中心原理

在微服務的遠程調用過程中,包括兩個角色:

  • 服務提供者:提供接口供其它微服務訪問,比如item-service

  • 服務消費者:調用其它微服務提供的接口,比如cart-service

在大型微服務項目中,服務提供者的數量會非常多,為了管理這些服務就引入了注冊中心的概念。注冊中心、服務提供者、服務消費者三者間關系如下:

注冊中心會知道服務提供者有多少個實例,然后告知服務調用者,服務調用者會采取某一個負載均衡算法來選擇一個實例進行訪問。如果服務提供者中有某一個實例宕機了,注冊中心就會實時更新,告知服務調用者這個示例不可使用,防止白白訪問,浪費資源。

2. 服務發現

2.1 服務注冊

目前開源的注冊中心框架有很多,這里使用阿里巴巴公司出品的Nacos。首先把item-service注冊到Nacos(其實可能每一個微服務項目都需要注冊,因為可能將來會被調用)。

注冊步驟分為兩步,添加依賴,進行配置

item-servicepom.xml中添加依賴:

<!--nacos 服務注冊發現-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

item-serviceapplication.yml中添加nacos地址配置,nocos地址改為自己的ip地址。

spring:application:name: item-service # 服務名稱cloud:nacos:server-addr: 192.168.150.101:8848 # nacos地址

完成上述兩步之后,就相當于已經注冊好了。?

2.2 服務發現

在服務調用者的模塊中也要進行上述兩步配置。

然后,服務調用者cart-service就可以去訂閱item-service服務了。

服務發現需要用到一個工具,DiscoveryClient,SpringCloud已經幫我們自動裝配,我們可以直接注入使用:

然后對原來的遠程調用進行修改,將寫死的ip和端口改為方法調用來獲取:

四、OpenFeign

我們發現修改之后的代碼,從一行變成了九行,使用RestTemplate實現服務的遠程調用增加了代碼的復雜度。為了簡化代碼,就需要用到OpenFeign組件了。

1.1 首先在購物車微服務模塊中引入OpenFeign的依賴和loadBalancer依賴:

  <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--負載均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

1.2 在購物車啟動類中上添加注解,啟動OpenFeign功能:

1.3 編寫OpenFeign客戶端:

在模塊中,定義一個新的接口,編寫Feign客戶端,這里是定義了一個商品模塊的客戶端。

package com.hmall.cart.client;import com.hmall.cart.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@FeignClient("item-service")
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

1.4?使用FeignClient:

首先在代碼中注入ItemClient,然后直接調用ItemClient中的方法。這里我理解的是購物車模塊通過客戶端調用該方法,就相當于在瀏覽器中直接訪問ip(這里不是通過瀏覽器,而是通過Nacos),然后商品模塊中的相應方法就會執行,查詢數據庫之后將結果進行返回。

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

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

相關文章

Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring 論文閱讀

用于動態場景去模糊的深度多尺度卷積神經網絡 摘要 針對一般動態場景的非均勻盲去模糊是一個具有挑戰性的計算機視覺問題&#xff0c;因為模糊不僅來源于多個物體運動&#xff0c;還來源于相機抖動和場景深度變化。為了去除這些復雜的運動模糊&#xff0c;傳統的基于能量優化的…

PDF 拆分合并PDFSam:開源免費 多文件合并 + 按頁碼拆分 本地處理

各位打工人和學生黨們&#xff0c;你知道嗎&#xff0c;處理PDF文件簡直是咱們的日常噩夢啊&#xff0c;尤其是遇到要合并好幾個文件&#xff0c;或者從中摳幾頁出來的時候&#xff0c;簡直頭大如斗&#xff01;今天給你們安利一個神仙工具&#xff0c;PDFSam&#xff0c;聽我的…

AI產品經理面試寶典第32天:AI+工業場景落地核心問題與應答策略

一、AI+工業落地價值怎么答? 面試官:AI在工業領域能創造哪些核心價值?請用具體案例說明 你的回答: AI在工業領域創造價值的底層邏輯是"數據閉環"。以阿里云ET工業大腦為例,通過采集生產線3000+傳感器數據,構建出影響良品率的60個關鍵變量模型。當數據流經AI…

【09】MFC入門到精通——MFC 屬性頁對話框的 CPropertyPage類 和 CPropertySheet 類

文章目錄九、屬性頁對話框的類CPropertyPage類 和 CPropertySheet 類。9.1 CPropertyPage 類&#xff08;1&#xff09;構造函數&#xff08;2&#xff09;CancelToClose()函數&#xff08;3&#xff09;SetModified()函數&#xff08;4&#xff09;可重載函數9.2 CPropertyShe…

Python學習筆記4

時間:2025.7.18學習內容&#xff1a;【語法基礎】if判斷、比較運算符與邏輯運算符一、if判斷if判斷基本格式&#xff1a;if要判斷的條件&#xff0c;條件成立時要做的事情注意&#xff1a;input內默認存儲的是字符串age17 if age<18:print(未成年不能上網) scoreinput(你的成…

20250718-2-Kubernetes 應用程序生命周期管理-Pod對象:基本概念(豌豆莢)_筆記

二、Kubernetes應用程序生命周期管理&#xfeff;1. 課程內容概述主要內容&#xff1a;Pod資源共享實現機制管理命令應用自修復&#xff08;重啟策略健康檢查&#xff09;環境變量Init container靜態Pod2. Pod對象介紹&#xfeff;1&#xff09;Pod基本概念&#xfeff;&#x…

為Notepad++插上JSON格式化的翅膀

文章目錄概要安裝步驟效果展示概要 JSMinNPP.dll 是一個 Notepad 插件&#xff0c;用于壓縮 JavaScript 代碼和格式化JSON字符床。以下是安裝和使用的詳細步驟&#xff1a; 安裝步驟 下載 JSMinNPP.dll 插件 https://pan.quark.cn/s/73dd0ac225be 放置 DLL 文件 打開 Notepa…

STM32-第七節-TIM定時器-3(輸入捕獲)

一、簡介&#xff1a;1.名稱&#xff1a;IC&#xff0c;輸入捕獲2.電路&#xff1a;如圖為通用定時器框圖&#xff0c;下半部分的左半模塊&#xff0c;與輸出比較部分共用捕獲/比較寄存器與引腳。3.功能&#xff1a;當通道輸入引腳出現電平跳變時&#xff0c;當前CNT的值&#…

Console 納管 Elasticsearch 9(二):日志監控

前面介紹過 INFINI Console 納管 Elasticsearch 9&#xff08;一&#xff09;&#xff0c;進行指標監控、數據管理、DSL 語句執行&#xff0c;但日志監控功能需要結合 Agent 才能使用。現在來實現一下&#xff1a; Agent 需要和 ES 部署到同一機器上&#xff0c;這里是在我本地…

實訓十——路由器與TCP/IP模型

補充拓撲圖&#xff08;交換機串聯通信&#xff09;電腦A——交換機S1——交換機S2——電腦B問&#xff1a;A和B如何通信&#xff1f;首先A會將通信的數據封裝好&#xff0c;將源端口、目標端口&#xff0c;源地址、目標地址&#xff0c;源MAC、目標MAC封裝起來&#xff0c;但是…

【Android】ViewBinding(視圖綁定)

一、什么是ViewBindingViewBinding是Android Studio 3.6推出的新特性&#xff0c;旨在替代findViewById(內部實現還是使用findViewById)。通過ViewBinding&#xff0c;可以更輕松地編寫可與視圖交互的代碼。在模塊中啟用ViewBinding之后&#xff0c;系統會為該模塊中的每個 XML…

泛型與類型安全深度解析及響應式API實戰

一、泛型通配符&#xff1a;靈活與安全的平衡術 在Java動物收容所系統中&#xff0c;我們常需要處理不同動物類型的集合。通過泛型通配符&#xff0c;可以構建更靈活的API&#xff1a; class Shelter<T extends Animal> {private List<T> animals new ArrayList&l…

Cookie 與 Session概述

在 Web 開發中&#xff0c;會話跟蹤是一個核心問題。HTTP 協議是無狀態的&#xff0c;這意味著服務器無法直接記住客戶端的狀態。而 Cookie 和 Session 技術的出現&#xff0c;正是為了解決這一難題。一、Cookie概述Cookie&#xff0c;翻譯成中文是小甜點、小餅干的意思。在 HT…

阿里云alicloud liunux3-安裝docker

你這個錯誤&#xff1a;Curl error (35): SSL connect error for https://download.docker.com/linux/centos/8/x86_64/stable/... Error: Failed to download metadata for repo docker-ce-stable: Yum repo downloading error說明你的機器訪問 download.docker.com 的 HTTPS …

【世紀龍科技】汽車故障診斷與排除仿真教學軟件

在汽車產業智能化、電動化轉型加速的今天&#xff0c;汽車維修行業對技術人才的要求已從傳統經驗型向“理論實踐數字化”復合型轉變。然而&#xff0c;實車實訓成本高、安全隱患大、教學場景受限等問題&#xff0c;始終制約著職業教育的高質量發展。江蘇世紀龍科技有限公司立足…

柴油機活塞cad【4張】三維圖+設計說明書

1015柴油機活塞結構設計及溫度場分析 摘 要 隨著科研的進步&#xff0c;內燃機技術得到了快速的發展&#xff0c;低排放高效率的內燃機的發展成為內燃機發展的主要趨勢&#xff0c;活塞作為內燃機的主要組成部件&#xff0c;在內燃機中扮演著至關重要的作用。活塞在內燃機中始終…

雪豹大模型驅動效率革命 華鼎冷鏈科技重構餐飲供應鏈神經網絡

當餐飲行業的開店率高達67.5%、閉店率達61.2%時&#xff0c;供應鏈該如何進行革新與升級&#xff1f; 在鄭州盛大啟幕的第三屆中國火鍋燒烤領潮峰會上&#xff0c;華鼎冷鏈科技CEO王君以“AI驅動智慧供應鏈賦能餐飲行業新升級”為主題分享時稱&#xff0c;當前餐飲行業高閉店率…

汽車功能安全 -- TC3xx外部看門狗

之前聊過TC3xx SMU關于內部看門狗&#xff08;CPU Watchdog 和Safety Watchdog&#xff09;Alarm的處理方法。 汽車功能安全--TC3xx SMU之看門狗alarm處理 在里面我們提到了這些Alarm關聯的功能安全機制&#xff1a; SM[HW]:SCU:ENDINIT_WATCHDOG SM[HW]:SCU:SAFETY_WATCHD…

如何為“地方升學導向型”語校建模?Prompt 框架下的宇都宮日建工科專門學校解析(7 / 500)

如何為“地方升學導向型”語校建模&#xff1f;Prompt 框架下的宇都宮日建工科專門學校解析&#xff08;7 / 500&#xff09; 系列說明 500 所日本語言學校結構化建模實戰&#xff0c;第 7 篇。每篇拆解 1 所學校在 Prompt-QA 系統中的建模策略&#xff0c;分享工程經驗&#x…

Flutter 入門指南:從基礎到實戰

介紹 Flutter Flutter 是 Google 開發的開源移動應用軟件開發工具包&#xff08;SDK&#xff09;&#xff0c;用于快速在 iOS 和 Android 上構建高質量的原生界面。Flutter 的一大特點是其跨平臺功能&#xff0c;讓開發者能夠使用同一套代碼基礎為兩個平臺構建應用。這一點通過…