springcloud微服務框架簡單上手
文章目錄
- springcloud微服務框架簡單上手
- 一、SpringCloud簡單介紹
- 1.1 單體架構
- 1.2 分布式架構
- 1.3 微服務
- 二、SpringCloud與SpringBoot的版本對應關系
- 2022.x 分支
- 2021.x 分支
- 2.2.x 分支
- 三、Nacos注冊中心
- 3.1 認識和安裝Nacos
- 3.2 配置Nacos
- 3.3 nacos部署springboot項目
- 四、http客戶端Feign
- 4.1 Feign的介紹
- 4.2 自定義實現Feign
- 4.3 Feign實踐
- 五、統一網關Gateway
- 5.1 為什么要使用網關
- 5.2 搭建網關服務
- 5.3 測試網關GateWay
前言:作者是通過自己的項目所運用作為講解,分享只是作者用到的方面
一、SpringCloud簡單介紹
- SpringCloud是目前國內使用最廣泛的微服務框架。官網地址:https://spring.io/projects/spring-cloud。
- SpringCloud集成了各種微服務功能組件,并基于SpringBoot實現了這些組件的自動裝配,從而提供了良好的開箱即用體驗:
1.1 單體架構
單體架構:將業務的所有功能集中在一個項目中開發,打成一個包部署。
**優點 **:
架構簡單
部署成本低
缺點:
耦合度高
如下就是簡單的單體架構圖
1.2 分布式架構
分布式架構:根據業務功能對系統進行拆分,每個業務模塊作為獨立項目開發,稱為一個服務。
優點:
降低服務耦合
有利于服務升級拓展
如下就是簡單的分布式架構圖
1.3 微服務
微服務:是一種經過良好架構設計的分布式架構方案
微服務架構特征:
單一職責:微服務拆分粒度更小,每一個服務都對應唯一的業務能力,做到單一職責,避免重復業務開發
面向服務:微服務對外暴露業務接口
自治:團隊獨立、技術獨立、數據獨立、部署獨立
隔離性強:服務調用做好隔離、容錯、降級,避免出現級聯問題
如下就是簡單的微服務架構圖
二、SpringCloud與SpringBoot的版本對應關系
2022.x 分支
適配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按從新到舊排列如下表(最新版本用*標記): (注意,該分支 Spring Cloud Alibaba 版本命名方式進行了調整,未來將對應 Spring Cloud 版本,前三位為 Spring Cloud 版本,最后一位為擴展版本,比如適配 Spring Cloud 2022.0.0 版本對應的 Spring Cloud Alibaba 第一個版本為:2022.0.0.0,第個二版本為:2022.0.0.1,依此類推)
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2022.0.0.0* | Spring Cloud 2022.0.0 | 3.0.2 |
2022.0.0.0-RC2 | Spring Cloud 2022.0.0 | 3.0.2 |
2022.0.0.0-RC1 | Spring Cloud 2022.0.0 | 3.0.0 |
2021.x 分支
適配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按從新到舊排列如下表(最新版本用*標記):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2021.0.5.0* | Spring Cloud 2021.0.5 | 2.6.13 |
2021.0.4.0 | Spring Cloud 2021.0.4 | 2.6.11 |
2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
2021.1 | Spring Cloud 2020.0.1 | 2.4.2 |
2.2.x 分支
適配 Spring Boot 為 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按從新到舊排列如下表(最新版本用*標記):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2.2.10-RC1* | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.9.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.8.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.7.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE |
2.2.1.RELEASE | Spring Cloud Hoxton.SR3 | 2.2.5.RELEASE |
2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE | 2.2.X.RELEASE |
2.1.4.RELEASE | Spring Cloud Greenwich.SR6 | 2.1.13.RELEASE |
2.1.2.RELEASE | Spring Cloud Greenwich | 2.1.X.RELEASE |
2.0.4.RELEASE(停止維護,建議升級) | Spring Cloud Finchley | 2.0.X.RELEASE |
1.5.1.RELEASE(停止維護,建議升級) | Spring Cloud Edgware | 1.5.X.RELEASE |
spring cloud alibaba、spring cloud、spring boot版本對應:來自 gitHub 中的spring cloud alibaba官方說明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本說明spring官網:https://spring.io/spring歷史官方文檔:https://docs.spring.io/spring-cloud/docs/spring離線依賴及文檔下載地址:https://repo.spring.io/ui/native/libs-release-local/org/springframework/
三、Nacos注冊中心
3.1 認識和安裝Nacos
Nacos 是一個開源的分布式服務發現、配置管理和服務管理平臺。它提供了服務注冊與發現、配置管理、服務健康監測等功能,可以幫助開發者構建和管理云原生微服務架構。
具體來說,Nacos 提供了以下核心功能:
- 服務注冊與發現(Service Discovery):允許服務實例注冊到 Nacos,并通過 Nacos 客戶端發現其他服務實例。這樣,服務之間可以動態地發現和通信,實現了微服務架構中的服務發現功能。
- 配置管理(Configuration Management):Nacos 提供了統一的配置管理平臺,允許開發者集中管理微服務的配置信息,支持配置的動態變更和實時推送,從而提高了配置管理的靈活性和可靠性。
- 服務健康監測(Health Check):Nacos 會定期檢查服務實例的健康狀態,確保只有健康的服務實例會被注冊到服務發現中,并且及時地將不健康的實例移除,從而提高了整個系統的穩定性和可用性。
Nacos下載
鏈接:https://pan.baidu.com/s/1gwHPkvylWLtrjQYQCwmqqw?pwd=T401
提取碼:T401
3.2 配置Nacos
Nacos的默認端口是8848,如果你電腦上的其它進程占用了8848端口,請先嘗試關閉該進程。如果無法關閉占用8848端口的進程,也可以進入nacos的conf目錄,修改配置文件中的端口:
修改其中的內容為其他端口
啟動nacos,進入bin目錄, 然后 cmd 進入該目錄執行命令
./startup.cmd -m standalone
出現下面內容即可
如果覺得在cmd輸入命令麻煩可以修改腳本, 編輯start.cmd腳本,將集群模式修改為單機模式,在bin目錄下右擊startup.cmd文件,用記事本的方式打開,將MODE改成standalone即可,如下圖所示
這樣直接雙擊startup.cmd即可運行nacos
ctrl+左鍵點擊命令窗口給的地址
nacos賬號: nacos
nacos密碼: nacos
到此nacos安裝完成
3.3 nacos部署springboot項目
父工程
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
添加nacos的客戶端依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version></dependency>
修改需要更改服務的中的application.yml文件
spring: application: # 應用配置項name: dataAccountService # 應用名稱為 dataAccountServicecloud: nacos: server-addr: localhost:8848 # Nacos 服務端地址為 localhost:8848discovery: # Nacos 服務發現配置項cluster-name: CQ # 使用的 Nacos 集群名稱為 CQ
啟動springboot項目和nacos,出現自己配置的服務,及完成nacos的簡單部署,在我的項目中,nacos主要做的是服務注冊與發現,并沒有其他內容,如果有需要可以參考其他博客
四、http客戶端Feign
4.1 Feign的介紹
Feign是一個聲明式的http客戶端,官方地址:https://github.com/OpenFeign/feign
其作用就是幫助我們優雅的實現http請求的發送,解決上面提到的問題。
Feign 的主要優勢在于:
- 聲明式 API 定義:Feign 允許開發者使用接口和注解來定義 RESTful 服務的請求和響應,而無需關心底層的 HTTP 請求和響應處理邏輯。通過編寫簡單的 Java 接口和添加 Feign 注解,就可以定義服務調用的各種細節,比如 URL、HTTP 方法、請求參數、請求頭等。
- 模板化請求:Feign 提供了一套模板化的請求構建和發送機制,使得開發者可以輕松地構造 HTTP 請求并發送到目標服務端點。Feign 會根據接口定義和注解配置,自動構造出對應的 HTTP 請求,并將請求參數、請求頭等信息注入到請求中。
- 集成了負載均衡和服務發現:Feign 可以與 Spring Cloud 中的服務發現組件(如 Eureka、Consul 等)和負載均衡組件(如 Ribbon)集成,從而實現服務之間的負載均衡和自動服務發現。開發者可以直接通過服務名來調用其他微服務,而無需硬編碼服務的地址和端口。
- 可擴展性:Feign 提供了豐富的擴展點,開發者可以通過自定義編碼器、解碼器、攔截器等來擴展 Feign 的功能,從而滿足各種特定的業務需求。
Feign運行自定義配置來覆蓋默認配置,可以修改的配置如下:
類型 | 作用 | 說明 |
---|---|---|
feign.Logger.Level | 修改日志級別 | 包含四種不同的級別:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 響應結果的解析器 | http遠程調用的結果做解析,例如解析json字符串為java對象 |
feign.codec.Encoder | 請求參數編碼 | 將請求參數編碼,便于通過http請求發送 |
feign. Contract | 支持的注解格式 | 默認是SpringMVC的注解 |
feign. Retryer | 失敗重試機制 | 請求失敗的重試機制,默認是沒有,不過會使用Ribbon的重試 |
4.2 自定義實現Feign
導入依賴
如果服務A需要調用服務B的方法,則將依賴寫入服務A的pom文件中,既服務A是消費者
<!-- feign消費者--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency>
配置Feign日志有兩種方式:
方式一:配置文件方式
全局生效:
feign:httpclient:enabled: trueclient:config:default: # 這里用default就是全局配置,如果是寫服務名稱,則是針對某個微服務的配置logger-level: NONE #日志級別
局部生效
feign:httpclient:enabled: trueclient:config:dataAssetService: # 這里用dataAssetService就是局部配置,只對dataAssetService服務生效logger-level: NONE #日志級別
方式二:編程方式,先聲明一個Bean:
public class FeignClientConfiguration {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; }
}
而后如果是全局配置,則把它放到@EnableFeignClients這個注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,則把它放到@FeignClient這個注解中:
@FeignClient(value = "dataAssetService", configuration = FeignClientConfiguration.class)
4.3 Feign實踐
方式一(繼承):給消費者的FeignClient和提供者的controller定義統一的父接口作為標準。
-
服務緊耦合
-
父接口參數列表中的映射不會被繼承
自定義Feign 客戶端接口
//被消費的服務名稱
@FeignClient(name = "dataManagementService")
public interface dataAssetClient {/*** 獲取數據標準信息* @param dataStandardCode * @return* /dataStandard/getDataStandardInfo為被消費的接口路徑*/@GetMapping("/dataStandard/getDataStandardInfo")R getDataStandard(@RequestParam("dataStandardCode") String dataStandardCode);
}
消費者的controller
/*** <p>* 數據資產表 前端控制器* </p>** @author 不入青山入我懷* @since 2024-03-21*/
@RestController
@RequestMapping("/dataAsset")
public class DataAssetController {@Autowiredprivate dataAssetClient dataassetClient;//數據標準目錄/*** 遠程調用其他接口* /dataAsset/getDataStandard 在該服務調用其他服務的接口路徑* @return*/@GetMapping("getDataStandard")public R getDataStandard() {return dataassetClient.getDataStandard("");}}
被消費者controller(正常寫就行)
/*** 獲取數據標準信息* @param dataStandardCode* @return*/@GetMapping("getDataStandardInfo")public R getDataStandardInfo(@RequestParam("dataStandardCode") String dataStandardCode){return dataStandardService.getDataStandardInfo(dataStandardCode);//實現具體邏輯}
作者的Feign的實現邏輯
你也可以將FeignClient抽取為獨立模塊,并且把接口有關的POJO、默認的Feign配置都放到這個模塊中,提供給所有消費者使用,如下圖
五、統一網關Gateway
5.1 為什么要使用網關
- 路由與負載均衡:網關可以作為請求的入口,根據請求的路徑或者其他條件將請求路由到不同的后端服務。這樣可以實現請求的負載均衡,將流量合理地分發到不同的服務實例上,從而提高整個系統的性能和可擴展性。
- 安全性:網關可以作為安全屏障,用于保護后端服務免受惡意攻擊或者非法訪問。通過網關可以實現訪問控制、身份認證、權限驗證等安全功能,確保只有合法的請求可以訪問后端服務。
- 監控與統計:網關可以對請求進行監控和統計,記錄請求的響應時間、成功率、失敗率等指標,并生成相應的監控報告和統計數據。這樣可以幫助開發者實時了解系統的運行狀況,及時發現和解決問題。
- 日志與審計:網關可以記錄請求的日志,包括請求的來源、目的地、參數、響應狀態等信息,用于后續的審計和分析。這對于排查問題、追蹤請求流程、分析用戶行為等都非常有幫助。
- 服務聚合與協議轉換:網關可以將多個后端服務的接口聚合成一個統一的接口供客戶端調用,從而簡化客戶端的調用邏輯。同時,網關還可以實現不同協議之間的轉換,比如將 HTTP 請求轉換為 WebSocket 請求,或者將 RESTful 接口轉換為 GraphQL 接口等。
5.2 搭建網關服務
創建新的module,引入SpringCloudGateway的依賴和nacos的服務發現依賴:
<!-- 網關gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.6.RELEASE</version></dependency><!-- nacos服務注冊發現--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version></dependency>
編寫路由配置及nacos地址
網關路由可以配置的內容包括:
- 路由id:路由唯一標示
- uri:路由目的地,支持lb和http兩種
- predicates:路由斷言,判斷請求是否符合要求,符合則轉發到路由目的地
- filters:路由過濾器,處理請求或響應
spring: application: name: gateway # 應用名稱為 gatewaycloud: nacos: discovery: server-addr: localhost:8848 # Nacos 服務端地址為 localhost:8848gateway: routes: # 網關路由配置項,定義了多個路由規則- id: server-provice # 第一個路由規則的標識符uri: lb://serve-provide # 路由到服務名為 serve-provide 的服務predicates: # 定義了路由匹配的條件- Path=/api/serve/** # 匹配路徑以 /api/serve/ 開頭的請求filters: # 定義了對請求和響應的處理規則- RewritePath=/api/(?<segment>/?.*),/$\{segment} # 重寫請求路徑,將 /api/ 后面的路徑段作為參數傳遞給后端服務- id: data-asset-service # 第二個路由規則的標識符uri: lb://dataAssetService # 路由到服務名為 dataAssetService 的服務predicates: # 定義了路由匹配的條件- Path=/api/dataAsset/** ,/api/dataAssetField/** ,/api/dataAssetRelationCategory/** # 匹配多個路徑的請求filters: # 定義了對請求和響應的處理規則- RewritePath=/api/(?<segment>/?.*),/$\{segment} # 重寫請求路徑,將 /api/ 后面的路徑段作為參數傳遞給后端服務server:port: 8989
GatewayFilter是網關中提供的一種過濾器,可以對進入網關的請求和微服務返回的響應做處理:
5.3 測試網關GateWay
利用Postman來測試,通過訪問網關的端口8989,成功把接口轉發到對應的服務中去