學習記錄之微服務(后續(xù))
配置中心
什么是配置中心
所謂配置中心:將項目需要的配置信息保存在配置中心,需要讀取時直接從配置中心讀取,方便配置管理的微服務工具
我們可以將部分yml文件的內容保存在配置中心
一個微服務項目有很多子模塊,這些子模塊可能在不同的服務器上,如果有一些統(tǒng)一的修改,我們要逐一修改這些子模塊的配置,由于它們是不同的服務器,所以修改起來很麻煩
如果將這些子模塊的配置集中在一個服務器上,我們修改這個服務器的配置信息,就相當于修改了所有子模塊的信息,這個服務器就是配置中心
使用配置中心的原因就是能夠達到高效的修改各模塊配置的目的
配置中心的使用
Nacos既可以做注冊中心,也可以做配置中心
Nacos做配置中心,支持各種格式\類型的配置文件
properties\yaml(yml)\txt\json\xml等
Nacos數據結構

namespace:命名空間
group:分組
Service/DataId:具體數據
命名空間
namespace是Nacos提供的最大的數據結構
一個Nacos可以創(chuàng)建多個命名空間
一個命名空間能夠包含多個group
每一個group中又可以包含多條配置信息
在nacos中創(chuàng)建命名空間

在上圖連接的位置可以新增命名空間,填寫命名空間名稱和描述即可
Nacos有默認的命名空間public不能刪除和修改
添加命名空間后,我們在Nacos中注冊的服務或添加的配置就可以指定命名空間了
因為多個命名空間可以隔離項目,每個項目使用自己的命名空間,互不干擾

分組
一個命名空間中可以有多個分組,進行進一步分離
我們使用時,如果不需要進一步分組,推薦使用group名稱:DEFAULT_GROUP
服務或配置
確定了命名空間和分組之后
我們就可以添加服務或配置了
之前我們啟動的各種模塊都是服務,之前都是默認保存在public命名空間中
下面我們主要使用配置中心的功能,在命名空間中添加配置
添加配置就是設置DataId
實際在Nacos中定位一個配置的結構為
Namespace>Group>DataId
Nacos添加配置
Nacos首頁->配置管理->配置列表->添加配置(右側的大"+"號)

添加cart模塊數據庫連接配置

項目讀取配置
csmall-cart-webapi模塊要讀取連接數據庫的配置
如果要讀取配置中心的信心,首先要添加依賴
如果SpringBoot版本不是2.5.x,匹配的SpringCloud版本不是2020.x
可能添加的依賴不同,尤其是加載系統(tǒng)配置的依賴
需要根據實際的SpringBoot\SpringCloud版本來變化
像其他程序一樣,在添加完依賴之后,還需要添加yml文件的配置
我們使用過application.properties和application.yml兩種配置文件添加配置
實際上這兩個配置文件加載是有順序的
先加載yml
后加載properties
如果兩個配置文件同時設置了同一個屬性,后加載的覆蓋掉先加載的
在SpringCloud環(huán)境下,我們添加了加載系統(tǒng)配置的依賴,當前項目就支持了額外一組配置文件
它們是bootstrap.yml和bootstrap.properties
這組配置文件實際開發(fā)時,主要配置系統(tǒng)內容,一般都是不輕易修改的
所以這組配置文件的加載時機,整體早于application.properties這一組
一個SpringCloud項目加載配置文件的順序最終可能如下圖

因為配置文件的特性,bootstrap這一組是加載系統(tǒng)配置的
所以我們讀取配置中心的配置信息,最好添加在bootstrap.yml\properties中
下面我們就在cart-webapi項目中resources文件夾中添加bootstarp.yml文件
RestTemplate遠程調用
我們現(xiàn)在項目中使用的RPC遠程調用技術是Dubbo
實際上除了Dubbo技術之外,還有很多遠程調用的方法
它們有些調用的思想都和Dubbo完全不同
Dubbo是SpringCloudAlibaba提供的功能強大的RPC框架
但是Dubbo功能也有限制,如果我們想調用的方法不是我們當前項目的組件或功能,甚至想調用的方法不是java編寫的,那么Dubbo就無能為力了
我們可以使用RestTemplate來調用任何語言編寫的公開的Rest路徑
也就是只要能夠使用瀏覽器訪問的路徑,我們都可以使用RestTemplate發(fā)送請求,接收響應
使用步驟如下
步驟1:
無需添加任何pom依賴和yml文件配置
只需在調用的發(fā)起方,也就是使用RestTemplate發(fā)起請求的項目配置文件中(指支持@Configuration注解的類或SpringBoot啟動類),向Spring容器注入一個該類型對象
所有SpringBoot配置類都可以添加下面代碼,我們選擇SpringBoot啟動類添加如下代碼
在CartWebapi啟動類中修改
步驟2:
我們配置了cart模塊具備了調用其它控制器方法的功能
我們可以實現(xiàn)在cart模塊運行刪除購物車商品的同時減少庫存
這樣就要求我們stock模塊具備一個能夠減少庫存的控制器方法,現(xiàn)在這個方法是有的url為:
/base/stock/reduce/count,但是這個控制器請求的方法是@PostMapping,RestTemplate只能直接get方法調用目標,所以我們將stock-webapi模塊的StockController中減少庫存方法的的注解修改為@GetMapping
@GetMapping("/reduce/count")
步驟3:
回到cart-webapi模塊
開始調用
我們可以在當前CartController控制器方法deleteUserCart中
添加RestTemplate的調用,實現(xiàn)庫存的減少
步驟4:
發(fā)送測試
將相關的模塊都啟動
cart\stock
調用cart模塊刪除購物車中的方法
運行后檢查對應商品減少庫存和購物車中數據的刪除效果
如果一切正常證明調用成功了
什么是web服務器
簡單來說
Web服務器就是一個能夠接收http請求并作出響應的java程序
webServer項目(二階段項目)就是一個我們手寫的Web服務器
我們現(xiàn)在開發(fā)的標準SpringBoot項目啟動時內置的Web服務器叫Tomcat
實際上我們業(yè)界中還有很多Web服務器,它們具備很多不同的特征
網關Gateway項目使用Netty服務器,Netty服務器內部是NIO的所以性能更好
下圖以Tomcat為例,解釋請求響應流程

大多數情況我們會使用Tomcat作為Web服務器
它是我們請求\響應流程中的核心組件
Tomcat是也有缺點
常規(guī)情況下,一個tomcat并發(fā)數在100多一點
一般情況下,一個網站要1000人在線,并發(fā)數是2%~5%?也就是20~50并發(fā)
如果需要一個支持更高并發(fā)的服務器,就是需要使用Nginx
Nginx
Nginx?("engine x")?是一個高性能的?HTTP?和?反向代理?服務器,也是一個IMAP/POP3/SMTP?代理服務器。?Nginx?是由?Igor Sysoev?為俄羅斯訪問量第二的Rambler.ru?站點開發(fā)的,第一個公開版本?0.1.0?發(fā)布于?2004?年?10?月?4?日。其將源代碼以類?BSD?許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。
Nginx的優(yōu)勢
高并發(fā)響應性能非常好,官方 Nginx 處理靜態(tài)文件并發(fā) 5萬/秒
反向代理性能非常強。(可用于負載均衡)
內存和 cpu 占用率低。(為 Apache(也是一個服務器) 的 1/5-1/10)
又小又快
Nginx快速的原因
Nginx內部是一個主進程(Master)多個工作進程(Worker)
Master負責統(tǒng)籌管理配置和Worker的分工
Worker來負責處理請求,作出響應
而且使用非阻塞式的,異步的
簡單來說,就是一個Worker接到一個請求后,對請求進行處理,處理后在響應返回前,這個Worker還會處理別的請求,直到請求返回響應時,才會處理響應,也就是Worker這個進程全程無阻塞
反向代理
要想了解反向代理,首先了解正向代理

正向代理,當我們訪問的目標服務器無法連通時,可以借助代理服務器,間接訪問該目標服務器
關系類似于生活中的介紹人
而反向代理的模式為下圖

請求反向代理服務器的特點是,我們請求的是代理服務器的地址,真正提供服務的服務器地址我們不需要知道,這樣做的好處是反向代理服務器后可能是一個集群,方便負載均衡
有點類似于生活中的代理人,有什么事情直接找這個人就能完成需求,它怎么完成的我們不用管
Nginx的使用
實際開發(fā)中,Nginx可以用于反向代理服務器,
實際處理請求的是Tomcat服務器

因為Nginx優(yōu)秀的靜態(tài)內容并發(fā)性能
我們常常使用它做靜態(tài)資源服務器
在Nginx中保存圖片,文件視頻等靜態(tài)資源
經常和FastDFS組合使用
Nginx和Gateway的區(qū)別
首先明確Nginx和Gateway并不沖突
他們都是統(tǒng)一入口的概念,它們可以同時開啟
也可以開啟其中一個
只不過Nginx不屬于java程序,而Gateway是java程序
Nginx是服務器程序我們不可編輯,
Gateway是我們自己創(chuàng)建的項目,依賴和配置都由我們自己完成
最終如果想做反向代理服務器,就使用Nginx
如果是微服務項目的網關就是Gateway
SpringMVC攔截器
什么是SpringMvc攔截器
SpringMvc攔截器是SpringMvc框架提供的功能
它可以在控制器方法運行之前或運行之后(還有其它特殊時機)對請求進行處理或加工的特定接口
這個攔截器的編寫是典型的A(Aspect)OP思想的體現(xiàn)
在我們現(xiàn)有的控制器方法運行前后進行代碼的維護和切面的通知
過濾器和攔截器的區(qū)別:
提供者不同
過濾器是由javaEE提供的
攔截器是SpringMvc提供的
作用目標不同
過濾器作用目標更廣:可以作用在所有請求當前服務器資源的流程中
攔截器作用目標單一:只能作用在請求目標為當前服務器控制器的流程中

功能強度不同
過濾器是原生的JavaEE的功能,功能較弱,不能直接處理Spring容器中的內容和對象
攔截器是SpringMvc框架提供的,所以天生和Spring容器有更好的兼容性,可以直接操作Spring容器中的對象,而且攔截器相比于過濾器有更完善的參數返回值的處理,也有更多的運行時機
結論
?如果請求的目標能確定是一個控制器方法,優(yōu)先使用攔截器
?如果請求的目標可能是其他靜態(tài)資源,那么就需要使用過濾器
攔截器工作流程圖

SpringMvc攔截器的使用
在cart-webapi模塊中創(chuàng)建一個包
包名建議叫interceptor
創(chuàng)建攔截器類DemoInterceptor
然后要配置攔截器的攔截目標
需要在spring配置類中編寫
在config包中創(chuàng)建InterceptorConfig類
Mybatis 攔截器
簡介:
Mybatis框架提供的一個功能
能夠在Mapper接口方法運行之前或之后添加額外代碼的功能
之前我們通過設置,實現(xiàn)將運行的sql語句輸出到控制臺的效果,就是攔截器實現(xiàn)的
我們也可以簡單的進行一個類似的演示
首先,要想能夠成功的攔截Mybatis中mapper運行的sql語句
需要先在Spring中設置相關的代碼
步驟1:編寫攔截器
步驟2:
將攔截器設置在SpringBoot框架下使其生效
config包中MyBatisConfiguration添加代碼
MybatisPlus
MybatisPlus是一個國內的團隊在Mybatis框架基礎上新增了一些功能的框架
MybatisPlus新增的功能主要兩方面
1.提供的代碼生成器
可以根據指定的數據庫表,自動生成基本的實體類\控制器\業(yè)務層\持久層的相關文件
2.自動提供基本增刪改查方法的默認實現(xiàn)
Oauth2.0
是一個授權框架
類似一個授權協(xié)議標準
我們常用的掃碼登錄就是Oauth2標準下的功能