微服務筆記 2025/2/15

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

微服務是一種架構。

微服務是一種架構。

微服務是一種架構。

以前自己做項目最常用的架構是單體架構。單體項目不適合開發大型項目。

學習微服務技術來解決服務拆分碰到的問題。

使用微服務技術(工具)把單體項目拆成微服務項目。

上圖是一些微服務技術,解決相應問題。

什么是單體架構

將業務的所有功能集中在一個項目中開發,打成一個包部署。

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

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

總結:單體架構適合開發功能相對簡單,規模較小的項目。

微服務架構

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

SpringCloud

SpringCloud是目前國內使用最廣泛的微服務框架。SpringCloud集成了各種微服務功能組件,并基于SpringBoot實現了這些組件的自動裝配,從而提供了良好的開箱即用體驗。(但對于Springboot的版本也有要求)

(題外話:Springboot最擅長自動裝配和依賴管理)

拆分原則

目標:高內聚、低耦合

拆分方式:橫向拆分(抽取公共服務,提高復用性)、縱向拆分(按照業務模塊拆分)

拆分服務

工程結構有兩種:獨立project、Maven聚合

遠程調用

一旦微服務進行了拆分,數據產生了隔離,服務也產生了隔離,沒法像以前一樣調用了,如果想要像以前一樣查詢,查別人的數據,就必須通過網絡調用。

注冊中心

為什么要有注冊中心?8081不能寫死,8082和8083服務也要訪問。

1.服務調用者不知道服務提供者的地址,因為寫代碼的那一刻項目還沒啟動。

2.就算知道了地址,要訪問哪個。

3.寫好了代碼卻掛了,怎么知道新的服務的地址。

這就是服務遠程調用時可能出現的問題,可以用注冊中心來解決這個問題。設一個中介。

?Nacos——注冊中心的技術

Nacos是目前國內企業中占比最多的注冊中心組件。它是阿里巴巴的產品,目前已經加入SpringCloudAlibaba中。

服務注冊

拆好的服務去實現服務的注冊,引入依賴,配ip和端口,注冊后可以通過Nacos看到注冊好的服務。

服務發現

服務調用者去Nacos里拉取服務的信息。也要引入依賴,獲取ip和端口才行,提供好了這個API。

最簡單的負載均衡,隨機負載均衡,Ramdom。

OpenFeign

OpenFeign是一個聲明式的http客戶端,用來發送http請求的。讓剛剛的代碼也就是下圖的代碼變得簡單。

簡化后(OpenFeign已經被SpringCloud自動裝配)

連接池

日志

總結

服務拆分嘗試(以支付微服務為例)

首先去支付部分的controller, 看里面的各種接口進到serviceImpl里,然后看是否用到其他微服務,用到了就把此接口拆出來,放到新的client里,加上FeignClient注解,由api統一向所有的發請求(包括拆出來的client),然后回到servicelmpl里修改那些調用的主體。把那些不變的復制粘貼過來。

網關

就是網絡的關口,負責請求的路由,轉發,身份驗證。

在SpringCloud中網關的實現包括兩種:Spring Cloud Gateway、Netfilx Zuul

網關路由

1.創建新模塊

2.引入網關依賴:起步依賴(網關依賴、負載均衡依賴、Nacos依賴)

3.編寫啟動器:xxxApplication.java(記得帶SpringbootApplication注解)

4.配置路由規則

【GeekHour】30分鐘Nginx入門教程_嗶哩嗶哩_bilibili?

路由屬性

網關路由對應的java類型是RouteDefinition,其中常見的屬性:

id:路由唯一標識

url:路由目標地址

predicates:路由斷言,判斷請求是否符合當前路由(不僅可以指定路徑,還能設置在某時之前之后的條件)

filters:路由過濾器,對請求或響應做特殊處理(可添加修改請求頭、響應頭、路徑重寫、去路徑n段前綴)

網關登錄校驗

網關就像小區的開門大爺,是整個微服務的入口。

我們就不必在每個微服務里都校驗一次,在網關里這個入口jwt校驗一次就可以了。

這個校驗一定要放在網關轉發之前去做,就像看門大爺在找人前必須校驗外來人員。

?基于路由斷言RoutePredicateHandMapping去做路由匹配,然后到過濾器形成過濾器鏈...

綜上,如何在網關轉發之前做登錄校驗?在網關自定義一個過濾器,保證這個過濾器執行的順序在NettyRoutingFilter之前,并且在它的pre邏輯去實現jwt的校驗。(pre是轉發之前,post是之后)

網關如何傳遞用戶信息給微服務?不同的微服務tomcat都不一樣,所以肯定沒法用threadlocal(threadlocal在tomcat內部,線程之間去共享)。可以保存用戶到請求頭。

如何在微服務之間傳遞用戶信息?也是保存用戶要請求頭。

自定義過濾器

網關過濾器由兩種:GatewayFilter、GlobalFilter

GatewayFilter:路由過濾器,可以任意指定路由范圍

GlobalFilter:全局過濾器,作用范圍是所有路由

自定義過濾器仿寫:微服務02-05.網關登錄校驗-自定義GlobalFilter_嗶哩嗶哩_bilibili

方法1.自定義過濾器GlobalFilter類直接實現GlobalFilter接口就行了,如果向控制自定義過濾器的執行順序,加個order就可以了:利用exchang參數獲取請求信息,然后寫過濾器業務邏輯,然后放行(調用過濾器鏈chain的下一個過濾器)

方法2.利用gateway自定義過濾器,回頭再寫吧。

登錄校驗

自定義過濾器寫好了,準備工作就完畢了,可以寫登錄校驗了。(黑馬商城是JWT實現的登錄校驗)

hmall.jks文件打開亂碼,是保存jwt密鑰的文件,所以看起來亂碼。配置在hm的jwt里(yaml),有個類(jwtProperties.java)去加載配置里的屬性,真正去讀取文件生成密鑰的在securityConfig.java里。還有一個jwtTool。

excludePaths不用登錄校驗的,放行的路徑。也要有一個屬性類去讀取(回頭再看吧)

如果不用登錄攔截就直接放行chain鏈調用下一個,否則獲取token再校驗并解析token,可以的話就傳遞用戶信息后放行。

網關傳遞用戶

攔截器

步驟:

1.在網關的登錄校驗過濾器中,把獲取到的用戶寫入請求頭。(有API)

2.在hm-common中編寫SpringMVC攔截器,獲取登錄用戶。(因為每個微服務都有登錄用戶的需求)

OpenFeign傳遞用戶

微服務之間也要傳遞用戶。

openFeign中提供了一個攔截接口,所有由OpenFeign發起的請求都會先調用攔截器處理請求,其中的RequestTemplate類中提供了一些方法可以讓我們修改請求頭。

攔截器每個微服務都會用,公共的,所以放在hm-api里。

總結:

1.登錄校驗問題:

網關部分定義了一個過濾器,過濾器主要做兩件事:請求來了之后先去做JWT登錄校驗,從而獲取token中的用戶信息,把用戶信息保存到請求頭,轉發這個請求的時候自然就傳到微服務了。這里用到的過濾器是GlobalFilter。

當請求到達微服務部分,我們需要在微服務里獲取用戶信息。該微服務里有好多業務都要去獲取用戶信息,不可能在每個微服務的每個業務里都寫這個邏輯,為了簡化這個操作,我們就在微服務里定義了一個攔截器,攔截器可以幫助我們把網關傳過來的請求頭中的用戶信息給取出來,取完之后為了方便使用,保存信息到threadlocal里(因為這是微服務內部,可以線程來回調,就可以用threadlocal)。這樣的攔截器是SpringMVC的攔截器,叫做HandlerInterceptor。

微服務之間的相互調用:有一些業務比較復雜,可能會出現微服務之間的相互調用,往往這些可以通過OpenFeign去實現,而這些微服務要怎么拿到用戶信息呢(從微服務,而不是網關)?也保存到請求頭,后續的微服務才能拿到用戶信息。用到OpenFeign的攔截器,requestInterceptor。

配置管理

微服務太多,重復配置太多,如mysql

優點:配置共享;避免配置更新后的重啟,實現配置熱更新。

而之前我們用到提供注冊中心服務的nacos,也可以提供配置管理服務。

配置共享

步驟:

1.添加共享配置到Nacos中,包括jdbc、MybatisPlus、日志、Swagger、OpenFeign等。

2.拉取共享配置:基于NacosConfig拉取共享配置代替微服務的本地配置。

引入依賴->新建bootstrap.yaml?

配置熱更新

當我們修改配置文件中的配置中時,微服務無需重啟即可使配置生效。

配置前提:

1.nacos中要有一個與微服務名有關的配置文件。

2.微服務中要以特定方式讀取需要熱更新的配置屬性。

動態路由

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

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

相關文章

7-1JVMCG垃圾回收

一、GC的作用與原理 ?核心功能? 自動識別并回收堆內存中不再被引用的對象,釋放內存空間。 避免手動管理內存的復雜性(如C/C中的delete/free操作),降低內存泄漏風險。 ?判斷對象可回收的方法? ?可達性分析算法:…

yunedit-post ,api測試比postman更好

postman應該是大家最熟悉的api測試軟件了,但是由于它是外國軟件,使用它的高端功能注冊和繳費都比較麻煩。生成在線文檔分享也經常無法訪問被攔截掉。 這里可以推薦一下yunedit-post,該有的功能都有。 https://www.yunedit.com/postdetail …

010 rocketmq批量消息

文章目錄 批量消息BatchProducer.javaBatchConsumer.java 批量消息 批量發送可以提?發送性能,但有?定的限制: topic 相同 waitStoreMsgOK 相同 (?先我們建設消息的iswaitstoremsgoktrue(默認為true), 如果沒有異常,我們將始終收到"O…

6.6.6 嵌入式SQL

文章目錄 2個核心問題識別SQL語句主語言和SQL通信完整導圖 2個核心問題 SQL語句嵌入高級語言需要解決的2個核心問題是:如何識別嵌入語句?如何讓主語言(比如C,C語言)和SQL通信? 識別SQL語句 為了識別主語言中嵌入的SQL…

Windows安裝sql server2017

看了下官網的文檔,似乎只有ubuntu18.04可以安裝,其他debian系的都不行,還有通過docker的方式安裝的。 雙擊進入下載的ISO,點擊執行可執行文件,并選擇“是” 不要勾選 警告而已,不必理會 至少勾選這兩…

RuoYi框架介紹,以及如何基于Python使用RuoYi框架

若依框架(RuoYi)是一款基于Spring Boot和Vue.js的開源快速開發平臺,廣泛應用于企業級應用開發。它提供了豐富的功能模塊和代碼生成工具,幫助開發者快速搭建后臺管理系統。 主要特點 前后端分離:前端采用Vue.js&#x…

從零搭建Tomcat:深入理解Java Web服務器的工作原理

Tomcat是Java生態中最常用的Web服務器之一,廣泛應用于Java Web應用的部署和運行。本文將帶你從零開始搭建一個簡易的Tomcat服務器,深入理解其工作原理,并通過代碼實現一個基本的Servlet容器。 1. Tomcat的基本概念 Tomcat是一個開源的Servl…

京東云DeepSeek-R1模型一鍵部署教程,基于智算GCS【成本2元】

使用京東云智算一鍵部署DeepSeek-R1模型,京東云智算服務AI平臺GCS支持DeepSeek-R1模型預裝環境,支持1.5B、7B、32B及70B參數模型環境,用戶可在GCS中快速啟動,使用ChatbotUI或者Open-WebUI作為用戶界面,進行測試并接入業…

Jenkins 自動打包項目鏡像部署到服務器 ---(前端項目)

Jenkins 新增前端項目Job 指定運行的節點 選擇部署運行的節點標簽,dev標簽對應開發環境 節點的遠程命令執行配置 jenkins完整流程 配置源碼 拉取 Credentials添加 觸發遠程構建 配置后可以支持遠程觸發jenkins構建(比如自建的CICD自動化發布平臺&…

7.2 - 定時器之計算脈沖寬度實驗

文章目錄 1 實驗任務2 系統框圖3 軟件設計 1 實驗任務 本實驗任務是通過CPU私有定時器來計算按鍵按下的時間長短。 2 系統框圖 參見7.1。 3 軟件設計 注意事項: 定時器是遞減計數的,需要考慮StartCount<EndCount的情況。 /***********…

雙機熱備旁掛組網實驗

1拓撲圖 2.要求 1 、 SW3 的流量 正常情況下: SW1_VRF-->FW1--->SW1_Public--->R5 故障情況下: SW2_VRF-->FW2--->SW2_Public--->R6 2 、 SW4 的流量 正常情況下: SW2_VRF-->FW2--->SW2_Public--->R6 故障情…

2025春新生培訓數據結構(樹,圖)

教學目標: 1,清楚什么是樹和圖,了解基本概念,并且理解其應用場景 2,掌握一種建圖(樹)方法 3,掌握圖的dfs和樹的前中后序遍歷 例題與習題 2025NENU新生培訓(樹&#…

HTML 日常開發常用標簽

文章目錄 HTML 日常開發常用標簽1、基本結構標簽2、內容標簽3、多媒體標簽4、表單標簽5、列表和定義標簽6、表格標簽7、鏈接和圖像8、元數據9、語義化標簽(HTML5新增)10、框架和內聯11、交互12、過時或不推薦使用的標簽 HTML 日常開發常用標簽 1、基本結…

7.1.1 計算機網絡的組成

文章目錄 物理組成功能組成工作方式完整導圖 物理組成 計算機網絡是將分布在不同地域的計算機組織成系統,便于相互之間資源共享、傳遞信息。 計算機網絡的物理組成包括硬件和軟件。硬件中包含主機、前端處理器、連接設備、通信線路。軟件中包含協議和應用軟件。 功…

【AI論文】MedVLM-R1:通過強化學習激勵視覺語言模型(VLMs)的醫療推理能力

摘要:推理是推進醫學影像分析的關鍵前沿領域,其中透明度和可信度對于贏得臨床醫生信任和獲得監管批準起著核心作用。盡管醫學視覺語言模型(VLMs)在放射學任務中展現出巨大潛力,但大多數現有VLM僅給出最終答案&#xff…

國產RISCV64 也能跑AI

Banana Pi BPI-F3 進控時空 K1開發板 AI人工智能AI 部署工具使用手冊_bianbu software-CSDN博客 文章置頂了 有興趣的可以一起留言探索,非常有意思: 我最近接觸到了進迭時空研發的 Spacengine?,這是一套能在進迭時空 RISC-V 系列芯片上部署…

APISIX Dashboard上的配置操作

文章目錄 登錄配置路由配置消費者創建后端服務項目配置上游再創建一個路由測試 登錄 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根據docker 容器里的指定端口: 配置路由 通過apisix 的API管理接口來創建(此路由,直接…

【WPF】綁定報錯:雙向綁定需要 Path 或 XPath

背景 最開始使用的是 TextBlock: <ItemsControl ItemsSource"{Binding CameraList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation"Horizontal"/></ItemsPanelTemplate></ItemsControl.Item…

Kotlin協變與逆變區別

在Kotlin中&#xff0c;協變和逆變是泛型編程中的兩個重要概念&#xff0c;它們允許我們在類型系統中更加靈活地處理類型關系。 1.協變&#xff1a;協變允許我們使用比原始類型更具體的類型。在kotlin中&#xff0c;通過在類型參數上加out關鍵字來表示協變,生產者&#xff0c;例…

如何調試Linux內核?

通過創建一個最小的根文件系統&#xff0c;并使用QEMU和GDB進行調試。 1.準備工作環境 確保系統上安裝了所有必要的工具和依賴項。 sudo apt-get update //更新一下軟件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…