一、瞭解微服務架構
1、微服務技術棧
- 整體框架
-
整體學習規劃路線2、微服務與單體架構的區別
單體架構:將業務的所有功能集中在一個專案中開發,打成一個包部署
優勢
- 結構簡單
- 部署成本低
缺點
- 耦合度高,不利於構建和開發
3、分散式架構:根據業務功能對系統進行拆分,每個業務模組作為獨立專案開發,成為一個服務。
優點:
- 降低服務耦合度
- 有利於服務升級擴充套件
缺點:
- 架構非常複雜
- 運維、監控,部署難度提高
4、微服務:是一種經過良好架構設計的分散式架構方案
微服務架構特徵:
- 單一職責:微服務菜飯粒度更小,每一個服務都對應唯一的業務能力,做到單一職責,避免重複業務開發
- 面向服務:微服務對外暴露業務介面
- 自治:團隊獨立,技術獨立,資料獨立,部署獨立
- 隔離性強:服務呼叫做好隔離、容錯、降級、避免出現級聯問題
5、微服務技術對比
6、一般企業需求對比
二、SpringCloud
1、介紹:SpringCloud是目前國內使用最廣泛的微服務框架。
SpringCloud整合了各種微服務功能元件,並基於SpringBoot實現了這些元件的自動裝配,從而提供了良好的開箱即用體驗
SpringCloudyuSpringBoot的版本相容關係如下:
2、服務拆分及遠端呼叫
- 不同微服務,不能重複開發相同業務
- 微服務資料獨立,不要訪問其他微服務的資料庫
- 微服務可以將自己的業務暴露為介面,供其他微服務呼叫
3、微服務遠端呼叫
- 遠端呼叫分析:在模組中發出http請求,訪問其他模組的介面,實現遠端介面的呼叫
- 基於RestTemplate發起的http請求實現遠端呼叫
- http請求做遠端呼叫是與語言無關的呼叫,只要知道對方的ip,埠,介面路徑,請求引數即可。
//在主類(配置類)中引入springboot帶有的RestTemplate(),注入spring容器
//主類springbootApplication就是配置類
@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
restTemplate.getForObject(url,User.class);
可根據請求地址(該請求地址和在瀏覽器中的地址相同),User.class可將返回的json型別轉換為對應的類(物件);
遠端呼叫的提供者與消費者:
- 服務提供者:在一次業務中,被其他微服務呼叫的服務。(提供介面給其他微服務)
- 服務消費者:在一次業務中,呼叫其他微服務的服務。(呼叫其他微服務的介面)
- 中間角色(呼叫其他微服務,又被其他微服務呼叫):按照業務邏輯來看,提供介面和呼叫介面分別就是服務提供者和服務消費者
- 提供者與消費者的角色相對而言(相對業務而言)
三、Eureka註冊中心
1、傳統直接地址呼叫的問題
硬編碼:寫死地址(微服務多個地址如何解決)
Eureka的作用:
(1)Eureka註冊中心分為兩部分:
消費者根據負載均衡選擇對應微服務,並進行遠端呼叫
註冊中心與服務提供者存在一個30秒心跳續約,檢測該微服務是否還是正常執行,如果沒有正常執行,
就從註冊中心刪除,並且消費者也不會再收到這個微服務的對應資訊,如圖中的8083
主要問題:解決
- 消費者該如何獲取服務提供者具體資訊?
- 服務提供者啟動時向Eureka註冊自己的資訊
- Erueka儲存這些資訊
- 消費者根據服務名稱向Eureka拉取提供者資訊
- 如果有多個服務提供者,消費者該如何選擇?
- 消費者利用負載均衡演算法,從服務列表中挑選一個
- 消費者如何感知服務提供者健康狀態?
- 服務提供者會每隔30秒向EurekaServer傳送心跳請求,報告健康狀態
- Eureka會更新記錄服務列表資訊,心跳不正常會被剔除
- 消費者就可以拉取到最新的資訊
Eureka的搭建主要步驟:
Eureka服務端:
- 引入eureka-server依賴
<!--eureka服務端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 主類上新增@EnableEurekaServer註解
- 在application.yml中配置Eureka地址
server:
port: 10086 # 服務埠
spring:
application:
name: eurekaserver # eureka的服務名稱
eureka:
client:
service-url: # eureka的地址資訊
defaultZone: http://127.0.0.1:10086/eureka
Eureka客戶端:
- 引入Eureka-client依賴
<!--eureka客戶端依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 在application.yml中配置Eureka地址
spring:
application:
name: user-service #服務名稱
eureka:
client:
service-url: # eureka的地址資訊(客戶端與服務端的相同)
defaultZone: http://127.0.0.1:10086/eureka
大致服務搭建流程:@LoadBalanced註解用於負載均衡
四、Ribbon(實現負載均衡)SpringCloud的元件
- 負載均衡原理
- 負載均衡策略
- 懶載入
底層原始碼實現原理:
流程:
- 發起請求:RibbonLoadBanlancerClient根據URL中的id去動態的獲取服務列表DynamicServerListLoadBalancer拉取對應的服務列表
- 獲取服務列表之後根據自己的策略IRule(可自定義),選擇某個伺服器返回給RibbonLoadBanlancerClient,重新拼接地址,請求到對應伺服器
輪詢策略:
修改負載均衡策略:(server:伺服器;service:服務)
1、程式碼方式,在配置類中,定義一個新的IRule;這種方式配置之後不論是該類訪問哪一個服務都會遵循這個規則,分配的伺服器都是隨機的。
//此處是在application(需要隨機伺服器的主類)中配置的配置類,負載均衡策略為隨機
@Bean
public IRule randomRule() { return new RandomRule(); }
2、在配置檔案中application.yml,新增新的配置也可以修改配置的規則; (這裡可以指定某種服務請求會使用這種規則,此處為userservice)表示該類,該服務類請求userservice時就會按照這個規則,其他的不管。
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則
負載均衡的載入:初始化為懶載入,懶載入之後會進行快取,後面請求訪問就會更快
(開啟飢餓載入)
如果有多個指定服務: