微服務技術棧簡單介紹,Eureka和Ribbon的引入和使用

程式碼紅了一大片發表於2022-02-13

一、瞭解微服務架構

1、微服務技術棧

  1. 整體框架
  2.  

     整體學習規劃路線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

 

 

主要問題:解決

  •  消費者該如何獲取服務提供者具體資訊?
  1. 服務提供者啟動時向Eureka註冊自己的資訊
  2. Erueka儲存這些資訊
  3. 消費者根據服務名稱向Eureka拉取提供者資訊
  • 如果有多個服務提供者,消費者該如何選擇?
  1. 消費者利用負載均衡演算法,從服務列表中挑選一個
  • 消費者如何感知服務提供者健康狀態?
  1. 服務提供者會每隔30秒向EurekaServer傳送心跳請求,報告健康狀態
  2. Eureka會更新記錄服務列表資訊,心跳不正常會被剔除
  3. 消費者就可以拉取到最新的資訊

 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的元件

  • 負載均衡原理
  • 負載均衡策略
  • 懶載入

 

 

 底層原始碼實現原理:

流程:

  1. 發起請求:RibbonLoadBanlancerClient根據URL中的id去動態的獲取服務列表DynamicServerListLoadBalancer拉取對應的服務列表
  2. 獲取服務列表之後根據自己的策略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  # 負載均衡規則

負載均衡的載入:初始化為懶載入,懶載入之後會進行快取,後面請求訪問就會更快

(開啟飢餓載入)

 

 如果有多個指定服務:

 

相關文章