黑馬商城項目(三)微服務

一、單體架構

?測試高并發軟件

二、微服務

?三、SpringCloud

四、微服務拆分

黑馬商城模塊:

服務拆分原則:

拆分服務:

獨立project:

maven聚合:

拆分案例:

遠程調用:

package com.hmall.cart.config;import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@org.springframework.context.annotation.Configuration
public class Configuration {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
@Service
@RequiredArgsConstructor  //自動生成必備參數的構造函數
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {/*private final IItemService itemService;*/// @Autowired  Spring不建議使用@Autowiredprivate final RestTemplate restTemplate;/*Spring建議使用構造函數注入*/
/*    public CartServiceImpl(RestTemplate restTemplate){this.restTemplate=restTemplate;}*/
}
 private void handleCartItems(List<CartVO> vos) {// 1.獲取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查詢商品//List<ItemDTO> items = itemService.queryItemByIds(itemIds);//2.1 利用RestTemplate發送http請求,得到http響應ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {}, //利用反射拿到這個對象上的泛型Map.of("ids", CollUtil.join(itemIds, ",")));//2.2解析響應if(!response.getStatusCode().is2xxSuccessful()){//查詢失敗 直接結束return;}List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.轉為 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.寫入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}}

邏輯:

五、服務治理

上文提到的遠程調用帶來的問題:

注冊中心:

Nacos注冊中心:

docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

服務注冊:

多實例部署:

服務發現:

六、OpenFeign

快速入門:

———————————————————————————————————————————

———————————————————————————————————————————

請求路徑參數通過SpringMVC注解@GetMapping以及@RequestParam完成替代

請求參數通過調用該接口方法時傳遞的參數完成替代

返回值類型通過該接口定義的抽象方法的返回值類型完成替代

從而實現整體替代,簡化代碼

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.Collection;
import java.util.List;@FeignClient("item-service")
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
    private final ItemClient itemClient;    //自動注入private void handleCartItems(List<CartVO> vos) {// 1.獲取商品idSet<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查詢商品//2.1 根據服務名稱獲取服務的實例列表/*   List<ServiceInstance> instances = discoveryClient.getInstances("item-service");if(CollUtil.isEmpty(instances)){//判斷為空 直接結束return;}//2.2 手寫負載均衡,從實例列表中挑選一個實例ServiceInstance instance = instances.get(RandomUtil.randomInt(0, instances.size()));URI uri = instance.getUri(); //主機地址 http://localhost:8081//List<ItemDTO> items = itemService.queryItemByIds(itemIds);//2.3 利用RestTemplate發送http請求,得到http響應ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(uri+"/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {}, //利用反射拿到這個對象上的泛型Map.of("ids", CollUtil.join(itemIds, ",")));//2.4解析響應if(!response.getStatusCode().is2xxSuccessful()){//查詢失敗 直接結束return;}List<ItemDTO> items = response.getBody();*/List<ItemDTO> items = itemClient.queryItemByIds(itemIds);if (CollUtils.isEmpty(items)) {return;}// 3.轉為 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.寫入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}}

底層原理:

代碼中通過?itemClient?對象來調用接口方法時,實際上它是一個動態代理對象。

動態代理對象底層邏輯都是由 InvocationHandler 實現

這里的?FeignInvocationHandler? ReflectiveFeign 的一個內部類,實現了 InvocationHandler 接口,? ?InvocationHandler 接口中的 invoke 方法就是起到了代理的作用 : 所有的被代理對象中的所有業務(方法) 都會通過?invoke?方法實現代理,除了一些基本方法(比如 equals, hashCode ,toString

InvocationHandler?接口的實現類 FeignInvocationHandler?中重寫對應 invoke? 從而實現代理的方法如下:

最后調用對應的方法發送請求(Client

?

連接池:

OpenFeign底層發送請求使用的是?Client

OpenFeign整合并使用連接池步驟:

最佳實踐:

拆分的最佳方式:

方法一:

方法二:?

按照第二種方法實踐:

日志輸出:

七、服務拆分作業

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

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

相關文章

PyTorch:學習 CIFAR-10 分類

&#x1f50d; 開始你的圖像分類之旅&#xff1a;一步一步學習 CIFAR-10 分類 圖像分類是計算機視覺中最基礎的任務之一&#xff0c;如果你是初學者&#xff0c;那么以 CIFAR-10 為訓練場是一個不錯的選擇。本文一步一步帶你從零開始&#xff0c;學習如何用深度學習模型實現圖…

3.學習筆記--Spring-AOP總結(p39)-Spring事務簡介(P40)-Spring事務角色(P41)-Spring事務屬性(P42)

1.AOP總結&#xff1a;面向切面編程&#xff0c;在不驚動原始基礎上為方法進行功能增強。 2.AOP核心概念&#xff1a; &#xff08;1&#xff09;代理&#xff1a;SpringAOP的核心是采用代理模式 &#xff08;2&#xff09;連接點&#xff1a;在SpringAOP中&#xff0c;理解為任…

數據庫-day06

一、實驗名稱和性質 分類查詢 驗證 綜合 設計 二、實驗目的 1&#xff0e;掌握數據查詢的Group by &#xff1b; 2&#xff0e; 掌握聚集函數的使用方法。 三、實驗的軟硬件環境要求 硬件環境要求&#xff1a; PC機(單機) 使用的軟件名稱、版本號以及模塊&#xff1a; …

看門狗定時器(WDT)超時

一、問題 Arduino 程序使用<Ticker.h>包時&#xff0c;使用不當情況下&#xff0c;會導致“看門狗WDT超時” 1.1問題控制臺報錯 在串口監視器顯示 --------------- CUT HERE FOR EXCEPTION DECODER ---------------Soft WDT resetException (4): epc10x402077cb epc2…

AI在多Agent協同領域的核心概念、技術方法、應用場景及挑戰 的詳細解析

以下是 AI在多Agent協同領域的核心概念、技術方法、應用場景及挑戰 的詳細解析&#xff1a; 1. 多Agent協同的定義與核心目標 多Agent系統&#xff08;MAS, Multi-Agent System&#xff09;&#xff1a; 由多個獨立或協作的智能體&#xff08;Agent&#xff09;組成&#xff…

Wireshark TS | 異常 ACK 數據包處理

問題背景 來自于學習群里群友討論的一個數據包跟蹤文件&#xff0c;在其中涉及到兩處數據包異常現象&#xff0c;而產生這些現象的實際原因是數據包亂序。由于這兩處數據包異常&#xff0c;都有點特別&#xff0c;本篇也就其中一個異常現象單獨展開說明。 問題信息 數據包跟…

【React】項目的搭建

create-react-app 搭建vite 搭建相關下載 在Vue中搭建項目的步驟&#xff1a;1.首先安裝腳手架的環境&#xff0c;2.通過腳手架的指令創建項目 在React中有兩種方式去搭建項目&#xff1a;1.和Vue一樣&#xff0c;先安裝腳手架然后通過腳手架指令搭建&#xff1b;2.npx create-…

深入淺出 NVIDIA CUDA 架構與并行計算技術

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、CUDA為何重要&#xff1a;并行計算的時代 2、NVIDIA在…

pytorch學習02

自動微分 自動微分模塊torch.autograd負責自動計算張量操作的梯度&#xff0c;具有自動求導功能。自動微分模塊是構成神經網絡訓練的必要模塊&#xff0c;可以實現網絡權重參數的更新&#xff0c;使得反向傳播算法的實現變得簡單而高效。 1. 基礎概念 張量 Torch中一切皆為張…

Java虛擬機(JVM)平臺無關?相關?

計算機的概念模型 計算機實際上就是實現了一個圖靈機模型。即&#xff0c;輸入參數&#xff0c;根據程序計算&#xff0c;輸出結果。圖靈機模型如圖。 Tape是輸入數據&#xff0c;Program是針對這些數據進行計算的程序&#xff0c;中間橫著的方塊表示的是機器的狀態。 目前使…

satoken的奇奇怪怪的錯誤

發了 /user/getBrowseDetail和/user/getResponDetail&#xff0c;但為什么進入handle里面有三次&#xff1f;且第一次的handle類型是AbstractHandleMapping$PreFlightHttpRequestHandlerxxx,這一次進來的時候flag為false&#xff0c;StpUtils.checkLogin拋出了異常 第二次進來的…

【KWDB 創作者計劃】_上位機知識篇---SDK

文章目錄 前言一、SDK的核心組成API(應用程序接口)庫文件(Libraries)開發工具文檔與示例依賴項與環境配置二、SDK的作用簡化開發流程確保兼容性與穩定性加速產品迭代功能擴展與定制三、SDK的典型應用場景硬件設備開發操作系統與平臺云服務與API集成游戲與圖形開發四、SDK與…

golang處理時間的包time一次性全面了解

本文旨在對官方time包有個全面學習了解。不鉆摳細節&#xff0c;但又有全面了解&#xff0c;重點介紹常用的內容&#xff0c;一些低頻的可能這輩子可能都用不上。主打一個花最少時間辦最大事。 Duration對象: 兩個time實例經過的時間,以長度為int64的納秒來計數。 常見的durati…

PyCharm Flask 使用 Tailwind CSS 配置

使用 Tailwind CSS 步驟 1&#xff1a;初始化項目 在 PyCharm 終端運行&#xff1a;npm init -y安裝 Tailwind CSS&#xff1a;npm install -D tailwindcss postcss autoprefixer初始化 Tailwind 配置文件&#xff1a;npx tailwindcss init這會生成 tailwind.config.js。 步…

【英語語法】基本句型

目錄 前言一&#xff1a;主謂二&#xff1a;主謂賓三&#xff1a;主系表四&#xff1a;主謂雙賓五&#xff1a;主謂賓補 前言 英語基本句型是語法體系的基石&#xff0c;以下是英語五大基本句型。 一&#xff1a;主謂 結構&#xff1a;主語 不及物動詞 例句&#xff1a; T…

隔離DCDC輔助電源解決方案與產品應用科普

**“隔離”與“非隔離的區別** 隔離&#xff1a; 1、AC-DC&#xff0c;也叫“一次電源”&#xff0c;人可能會碰到的應用場合&#xff0c;起安全保護作用&#xff1b; 2、為了抗干擾&#xff0c;通過隔離能有效隔絕干擾信號傳輸。 非隔離&#xff1a; 1、“安全特低電壓&#…

DS-SLAM 運動一致性檢測的源碼解讀

運動一致性檢測是Frame.cc的Frame::ProcessMovingObject(const cv::Mat &imgray)函數。 對應DS-SLAM流程圖Moving consistency check的部分 把這個函數單獨摘出來&#xff0c;寫了一下對兩幀檢測&#xff0c;查看效果的程序&#xff1a; #include <opencv2/opencv.hpp…

安全測試的全面知識體系及實現路徑

以下是安全測試的全面知識體系及實現路徑,結合最新工具和技術趨勢(截至2025年): 一、安全測試核心類型與工具 1. 靜態應用安全測試(SAST) 知識點: 通過分析源代碼、字節碼或二進制文件識別漏洞(如SQL注入、緩沖區溢出)支持早期漏洞發現,減少修復成本,適合白盒測試場…

GPT-4o Image Generation Capabilities: An Empirical Study

GPT-4o 圖像生成能力:一項實證研究 目錄 介紹研究背景方法論文本到圖像生成圖像到圖像轉換圖像到 3D 能力主要優勢局限性與挑戰對比性能影響與未來方向結論介紹 近年來,圖像生成領域發生了巨大的變化,從生成對抗網絡 (GAN) 發展到擴散模型,再到可以處理多種模態的統一生成架…

Redis之全局唯一ID

全局ID生成器 文章目錄 全局ID生成器一、全局ID生成器的定義定義核心作用 二、全局ID生成器需滿足的特征1. 唯一性&#xff08;Uniqueness&#xff09;?2. 高性能&#xff08;High Performance&#xff09;?3. 可擴展性&#xff08;Scalability&#xff09;?4. 有序性&#…