微服務 01

微服務是一種軟件架構風格,它是以專注于單一職責的很多小型項目為基礎,組合出復雜的大型應用。 (對應的是單體架構風格)

一、認識微服務

1、單體架構

單體架構:將業務的所有功能集中在一個項目中開發,打成一個包部署

優:架構簡單、部署成本低

缺:團隊協作成本高、系統發布效率低、系統可用性差

2、微服務

微服務架構:是服務化思想指導下的一套最佳實踐架構方案。服務化,就是把單體架構中的功能模塊拆分為多個獨立項目。?

3、SpringCloud

SpringCloud集成了各種微服務功能組件,并基于SpringBoot實現了這些組件的自動裝配,從而提供了良好的開箱即用體驗。

二、微服務拆分

1、服務拆分原則

什么時候拆分:

????????創業型項目:先采用單體架構,快速開發,快速試錯。隨著規模擴大,逐漸拆分。

????????確定的大型項目:資金充足,目標明確,可以直接選擇微服務架構,避免后續拆分的麻煩。

怎么拆分:

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

? ? ? ? 低耦合:每個微服務的功能要相對獨立,盡量減少對其他微服務的依賴。

拆分方式:

? ? ? ? 縱向拆分:按照業務模塊來拆分。

? ? ? ? 橫向拆分:抽取公共服務,提高復用性。

2、拆分服務

工程結構有兩種:獨立Project(多個項目) 和 maven聚合(一個項目多個模塊)

遠程調用

Spring給我們提供了一個RestTemplate的API,可以方便的實現Http請求的發送。使用步驟如下:

? ? ? ? ①注入Rest Template到Spring容器 (項目中寫到啟動類了)

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

? ? ? ? ②發起遠程調用

  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, ",")));

三、服務注冊和發現

1、注冊中心原理

?

服務提供者通過心跳機制向注冊中心報告自己的健康狀況,當心跳異常時注冊中心會將異常服務剔除,并通知訂閱了該服務的消費者。

?

2、Nacos注冊中心

基于Docker來部署Nacos的注冊中心,首先我們要準備MySQL數據庫表,用來存儲Nacos的數據。由于是Docker部署,所以需要將資料中的SQL文件導入到Docker中的MySQL容器中。

然后,找到課前資料下的nacos文件夾其中的nacos/custom.env文件中,有一個MYSQL_SERVICE_HOST也就是mysql地址,需要修改為你自己的虛擬機IP地址

然后,將課前資料中的nacos目錄上傳至虛擬機的/root目錄。

進入root目錄,然后執行下面的docker命令:

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

啟動完成后,訪問下面地址:http://192.168.100.128:8848/nacos/,注意將192.168.100.128替換為你自己的虛擬機IP地址。

首次訪問會跳轉到登錄頁,賬號密碼都是nacos

3、服務注冊

①在item-servicepom.xml中添加依賴:

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

?②在item-serviceapplication.yml中添加nacos地址配置:

spring:application:name: cart-service  #微服務名稱cloud:nacos:server-addr: 192.168.100.128:8848 # nacos地址

4、服務發現

①我們在cart-service中的pom.xml中添加下面的依賴:

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

這里Nacos的依賴于服務注冊時一致,這個依賴中同時包含了服務注冊和發現的功能。因為任何一個微服務都可以調用別人,也可以被別人調用,即可以是調用者,也可以是提供者。?

?②在cart-serviceapplication.yml中添加nacos地址配置:

spring:cloud:nacos:server-addr: 192.168.150.101:8848

?③服務發現

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

private final DiscoveryClient discoveryClient;
// 2.查詢商品//2.1 根據服務名稱獲取服務的實例列表List<ServiceInstance> instances = discoveryClient.getInstances("item-service");//獲取實例,填寫服務的名稱if(CollUtils.isEmpty(instances)){//判斷是否為空return;}//2.2 手寫負載均衡,從實例列表中挑選實例ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));//隨機使用實例instance.getUri();//2.3 利用restTemplate發起http請求,得到http的響應ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(instance.getUri()+"/items?ids={ids}",  //修改這里HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));

四、OpenFeign

1、快速入門

OpenFeign是一個聲明式的http客戶端,是SpringCloud在Eureka公司開源的Feign基礎上改造而來。其作用就是基于SpringMVC的常見注解,幫我們優雅的實現http請求的發送。

①引入依賴,包括OpenFeign和負載均衡組件SpringCloudLoadBalancer

  <!--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>

②通過@EnableFeignClients注解,啟動OpenFeign功能

????????在啟動類上添加@EnableFeignClients注解(?basePackages = "com.hmall.api.client")

③在cart-service中,定義一個新的接口,編寫Feign客戶端:(代替前面寫的復雜的代碼)

@FeignClient("item-service") //根據服務名稱,去拉取實例列表
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}

④使用FeignClient,實現遠程調用

private final ItemClient itemClient;List<ItemDTO> items = itemClient.queryItemByIds(itemIds);

2、連接池

Feign底層發起http請求,依賴于其它的框架。其底層支持的http客戶端實現包括:

  • HttpURLConnection:默認實現,不支持連接池

  • Apache HttpClient :支持連接池

  • OKHttp:支持連接池

因此我們通常會使用帶有連接池的客戶端來代替默認的HttpURLConnection。比如,我們使用OK Http.

①在cart-servicepom.xml中引入依賴:

<!--OK http 的依賴 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>

?在cart-serviceapplication.yml配置文件中開啟Feign的連接池功能:

feign:okhttp:enabled: true # 開啟OKHttp功能

3、最佳實踐

  • 思路1:抽取到微服務之外的公共module

  • 思路2:每個微服務自己抽取一個module

  • 方案1抽取更加簡單,工程結構也比較清晰,但缺點是整個項目耦合度偏高。

    方案2抽取相對麻煩,工程結構相對更復雜,但服務之間耦合度降低。

    由于item-service已經創建好,無法繼續拆分,因此這里我們采用方案1將itemClient接口抽取到hm-api模塊中。

定義的FeignClient不存在SpringBootApplication的掃描包范圍時,這些FeignClient無法使用。解決方案:

①在啟動類的注解EnablefeignClients上指定FeignClient所在包

@EnableFeignClients(basePackages = "com.hmall.api.client")

②指定FeignClient字節碼

@EnableFeignClients(clients = {ItemClient.class})

4、日志

OpenFeign只會在FeignClient所在包的日志級別為DEBUG時,才會輸出日志。而且其日志級別有4級:

  • NONE:不記錄任何日志信息,這是默認值。

  • BASIC:僅記錄請求的方法,URL以及響應狀態碼和執行時間

  • HEADERS:在BASIC的基礎上,額外記錄了請求和響應的頭信息

  • FULL:記錄所有請求和響應的明細,包括頭信息、請求體、元數據。

Feign默認的日志級別就是NONE,所以默認我們看不到請求日志。

在hm-api模塊下新建一個配置類,定義Feign的日志級別:

public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}

接下來,要讓日志級別生效,還需要配置這個類。有兩種方式:

  • 局部生效:在某個FeignClient中配置,只對當前FeignClient生效。

@FeignClient(value = "item-service", configuration = DefaultFeignConfig.class)
  • 全局生效:在@EnableFeignClients中配置,針對所有FeignClient生效。

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

一般去情況下不開啟日志。

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

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

相關文章

20250726讓榮品的PRO-RK3566開發板使用TF卡啟動

20250726讓榮品的PRO-RK3566開發板使用TF卡啟動 2025/7/26 8:58緣起&#xff1a;需要升級 榮品的PRO-RK3566核心板的 底板上的FPGA程序。 由于沒有使用RK809的電量計功能&#xff0c;板子一上電就會被關機&#xff01;^_于是給生產線制作了一張TF卡/啟動卡&#xff0c;插到底板…

Selenium使用指南

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 概述selenium是網頁應用中最流行的自動化測試工具&#xff0c;可以用來做自動化測試或者瀏覽器爬蟲等。官網地址為&#xff1a;相對于另外一款web自動化測試工具QT…

[機緣參悟-235]:通過AI人工升級網絡的工作方式和特征理解人的思維方式

AI人工神經網絡通過模擬生物神經元連接機制、構建層級化特征提取結構&#xff0c;并結合數據驅動的學習方式&#xff0c;為理解人類思維方式提供了技術參照框架&#xff0c;但其本質仍是基于統計的模式匹配&#xff0c;與人類意識層面的思維存在根本差異。以下從其工作方式、基…

【C#補全計劃:類和對象(七)—— 重寫虛方法】

一、virtual和override1. 問題引入&#xff1a;使用里氏替換原則時&#xff0c;使用父類容器裝載子類對象&#xff0c;若不使用virtual和override而是使用new&#xff0c;當子類調用兩個類共有的方法時&#xff0c;調用的是父類的方法而不是子類的方法&#xff1a;using System…

TCPIP之常用協議

一、TCPIP之網絡支撐協議 1.ARP ARP是網絡層協議&#xff0c;在同一廣播域內&#xff0c;將IP地址解析成MAC地址. 1.1 無故ARP 請求型無故ARP 設備在網絡中不管是自動獲取ip地址還是手動配置ip地址&#xff0c;設備都會發送請求型無故ARP檢查這個ip地址是否有重復的。 應…

網絡之路24:VLAN基礎實驗

正文共&#xff1a;2345 字 18 圖&#xff0c;預估閱讀時間&#xff1a;3 分鐘目錄網絡之路第一章&#xff1a;Windows系統中的網絡0、序言1、Windows系統中的網絡 1.1、桌面中的網卡 1.2、命令行中的網卡 1.3、路由表 1.4、家用路由器網絡之路第二章&#xff1a;認識企業設備2…

基于Verilog的神經網絡加速器設計

本設計實現了一個高效的神經網絡加速器,專注于卷積神經網絡(CNN)的核心計算功能。該設計具有以下創新點: 并行處理架構:同時處理多個卷積窗口,提高計算吞吐量 動態權重加載:支持運行時更新卷積核權重 流水線優化:卷積、激活、池化三級流水線設計 可配置參數:支持不同尺寸…

基于springboot的零食商城的設計與實現/零食銷售系統的設計與實現

用戶&#xff1a;注冊&#xff0c;登錄&#xff0c;商品信息&#xff0c;團購商品&#xff0c;公告資訊&#xff0c;后臺管理&#xff0c;在線客服&#xff0c;購物車&#xff0c;個人中心管理員&#xff1a;登錄&#xff0c;個人中心&#xff0c;用戶管理&#xff0c;商品類型…

《劍指offer》-算法篇-位運算

題目二進制中“1”的個數代碼實現二進制中“1”的個數題目描述&#xff1a;輸入一個整數&#xff0c;輸出該數二進制表示中1的個數。其中負數用補碼表示。思路&#xff1a;求“1”的個數等價于求n-1與n進行“與”運算后不等于0所需要的運算次數。注意&#xff1a;這里的整數可能…

項目上線中的跨域問題

本文將深入解析跨域問題的本質&#xff0c;并提供實用的解決方案。引言 跨域問題可以說是前端開發者的"老朋友"了&#xff0c;特別是在項目從開發環境遷移到生產環境時&#xff0c;這個問題更是頻繁出現。許多開發者對跨域的理解停留在表面&#xff0c;導致在項目上線…

dubbo應用之3.0新特性(響應式編程)(2)

一、介紹 Dubbo 3.0 的響應式編程基于 Triple 協議和 Reactor/RxJava 實現,支持全鏈路異步非阻塞通信。它通過引入 Mono、Flux 等響應式類型,打通跨進程的數據流式傳輸,天然支持反壓、限流等控制能力。相比傳統基于 CompletableFuture 的異步方式,響應式編程更適用于高并發…

力扣-22.括號生成

題目鏈接 22.括號生成 class Solution {List<String> res new ArrayList<>();StringBuilder path new StringBuilder();void backtracking(int n, int left, int right) {if (left right 2 * n) {res.add(path.toString());return;}if (left < n) {path.a…

架構實戰——互聯網架構模板(“網絡層”技術)

目錄 一、負載均衡 1.1、DNS 1.1.1、DNS 負載均衡的優點 1.1.2、DNS 負載均衡的缺點 1.2、Nginx 、LVS 、F5 1.2.1、軟件和硬件的區別 1.2.2、4 層和 7 層的區別 二、CDN 三、多機房 3.1、同城多機房 3.2、跨城多機房 3.3、跨國多機房 四、多中心 本文來源:極客時間vip課程筆記…

TCP/IP 網絡編程面試題及解答

在Qt/C面試中&#xff0c;若涉及“熟悉TCP/IP網絡編程”&#xff0c;面試官通常會結合TCP/IP協議基礎、Qt網絡編程框架&#xff08;如Qt Network模塊&#xff09;、C網絡編程實現以及實際場景問題來提問。以下是常見面試題及解答&#xff1a; 一、TCP/IP協議基礎 1. TCP和UDP的…

unity開發中Hash、Queue、LinkedList簡單介紹

在Unity游戲開發中&#xff0c;除了Dictionary和List外&#xff0c;以下三種數據結構能高效解決特定問題場景&#xff1a;1. HashSet<T>&#xff1a;閃電級存在性檢查 核心特點&#xff1a;基于哈希表實現的高效集合&#xff0c;元素唯一且無視順序 優勢&#xff1a; O(1…

智慧園區:科技與生活的完美融合

在城市的喧囂中&#xff0c;我們常常渴望一片寧靜而充滿活力的綠洲。如今&#xff0c;隨著科技的飛速發展&#xff0c;智慧園區應運而生&#xff0c;它不僅滿足了我們對美好生活的向往&#xff0c;更以其獨特的魅力&#xff0c;成為現代城市中一道亮麗的風景線。今天&#xff0…

繼續打卡day6

383. 贖金信 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool canConstruct(string ransomNote, string magazine) {unordered_map<char, int> us;for(auto c: ransomNote){us[c]; // 將字符串存儲}for(auto c: magazine){if(us.count(c)){us[c]-…

LIMA:大語言模型對齊的“少即是多”革命——原理、實驗與范式重構

“千樣本激活千億參數&#xff1a;重新定義大模型對齊的本質” LIMA&#xff08;Less Is More for Alignment&#xff09; 是由 Meta AI 聯合 卡內基梅隆大學 等機構于 2023年 提出的突破性大模型對齊框架&#xff0c;其核心顛覆了傳統對齊需海量數據的認知&#xff0c;證明僅用…

vite.config.js常用配置

vite.config.js常用配置 import { defineConfig } from vite import { resolve } from "path"; import vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue(), ], // 配置需要使用的插件列表base: ./, // 在生產中服務時的基本公共路徑publicD…

JVM知識點(2)

目錄 Java中可作為GC Roots的引用有哪幾種&#xff1f; finalize方法 垃圾回收算法 標記-清除 標記-復制 標記-整理 分代收集算法 為什么要用分代收集 標記復制的標記過程和復制會不會停頓 MinorGC&#xff0c;MajorGC&#xff0c;MixedGC&#xff0c;FullGC FullGC…