SpringCloud筆記(1)—Eureka服務註冊中心

項目開發練習涉及的模塊

  • Eureka:負責服務發現相關。Eureka Server/Client、高可用、服務發現機制。
  • Config:負責統一配置中心。Config Server/Client、SpringCloudBus+RabibtMQ實現配置自動刷新。
  • Ribbon:服務通信。RestTemplate和Feign通信方法、Ribbon實現原理。
  • Zuul:APIgateWay。動態路由、校驗。
  • Hystrix:熔斷機制。Hystrix Dashboar熔斷機制。
  • 容器編排:Docker+Rancher
  • 服務追蹤:SpringCloud Sleuth + Zipkin
  • 環境參數:SpringBoot2.0.0M3,SpringCloud Finchley.M2(可在官網查看SpringCloud和SpringBoot版本對應關係。實際上操作中,使用的是 SpringBoot 2.0.6.RELEASE,SpringCloud Finchley.SR2)。

微服務概念

  • 由一系列微小的服務共同組成。
  • 在自己的進程中運行,互不干擾。
  • 每個服務爲獨立的業務開發。
  • 獨立部署,每個服務可以獨立部署。
  • 分佈式的管理。(微服務是一種架構風格)

涉及的架構形態

  • 單體架構。優點:容易測試;容易部署。缺點:開發效率低;代碼維護困難;部署不靈活;擴展性不夠;穩定性差。
  • 基於AJAX前後端分離。
  • 分佈式(水平擴展&服務拆分)。旨在支持應用程序和服務的開發,可以利用物理架構 由多個自治的處理元素不共享主內存,但通過網絡發送消息合作。(集羣:例如廚房多個員工一起炒菜。分佈式:例如廚房多個員工,一個洗菜,一個切菜,一個炒菜。)

微服務架構的基礎框架/組件

  • 服務註冊與發現。
  • 服務網關(Service Gateway)。
  • 後端通用服務(中間層服務:啓動時將地址信息註冊到服務註冊表)。
  • 前端服務(邊緣服務:查詢註冊表,發現和調用後端服務;對後端服務進行裁剪(基於不同設備將1個API數據的詳細情況進行控制等)和聚合(將多個API進行集合)再暴露給不同的設備)。

微服務架構實現途徑

阿里系:Dubbo-服務化治理;Zookeeper-服務註冊中心;SpringMVC或SpringBoot。
SpringCloud全家桶:SpringCloud Netflix Eureka;SpringBoot。

SpringCloud概念

是什麼

  • SpringCloud是一個開發工具集,包含多個子項目;
  • 利用SpringBoot的開發便利,實現了服務註冊、服務註冊與發現、負載均衡、數據監控、RestAPI發佈方式等等;
  • 主要是基於對NetFlix開源組件的進一步封裝。

作用:簡化了分佈式開發。

Spring Cloud Eureka

概念

  • 基於Netflix EureKa進行了二次封裝。
  • 由兩個組件組成:Eureka Server 註冊中心——供服務註冊的服務器;Eureka Client服務註冊——簡化與服務器的交互,提供服務的故障切換支持。(eureka是一個服務註冊中心,並且其本身也是一個服務,需要被註冊到自身應用中。)
  • 主要功能是 提供 服務的註冊 與 發現。

構建Eureka服務註冊中心 —— Eureka Server

    1. 新建Spring Initializer——>應用名:eureka——>添加依賴:Spring Cloud Discovery—EurekaServer——>項目位置選擇:自定義空文件夾\eureka。

    2. 在pom.xml中將SpringBoot版本和SpringCloud版本修改成文章開頭設定的版本:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.M3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
	<spring-cloud.version>Finchley.M2</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

    3. 啓動類中添加註解:@EnableEurekaServer,聲明註冊中心的功能。

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

    4.  啓動項目(由於服務沒被註冊,會報錯,但沒關係),訪問:http://IP:端口/,即可進入註冊中心。爲了將自身服務註冊到自身應用中,可以添加如下配置到application.yml配置文件中:本例中項目啓動後訪問—— http://localhost:8761/ 進入Eureka服務註冊中心。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: false # 註冊的應用服務列表中不顯示自己本身(自身也是個服務)
  server:
    enable-self-preservation: false # 自我保護機制關閉
spring:
  application:
    name: eureka
server:
  port: 8761

    5. 在cmd中使用命令:maven clean package -Dmaven.test.skip=true 打包項目,使其不依賴idea,可以獨立運行。運行命令:java -jar eureka-0.0.1.SNAPSHOT.jar  即可啓動項目。也可以 後臺啓動。若在後臺運行,啓動後關閉的命令如下(管理員模式打開cmd):tasklist | findstr  "java";查看java線程的PID。殺死線程:taskkill  /pid  12123  /f  (win系統也可在任務管理器中殺死java線程)。即可關閉項目。(linux:ps -ef | grep jarName.jar    kill  -9  pid)

構建一個Eureka服務註冊中心 —— Eureka Client

    1. 新建Spring Initializer——>應用名:client——>添加依賴:Spring Cloud Discovery—EurekaDiscovery——>項目位置選擇:自定義文件夾\client。

    2. pom依賴中統一SpringBoot和SpringCloud的版本。然後在application.yml中進行服務註冊的如下配置(不配置則不能被註冊到EurekaServer服務註冊中心)。並且還需要在項目啓動類中添加服務發現註解@EnableDiscoveryClient

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: client

    3. 啓動項目,然後前往 服務註冊中心(http://localhost:8761/)查看。實際項目啓動時,一直失敗,添加web依賴後才啓動成功。成功後可以看到 Application表單中已經有了新增加的client服務。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>

    4. Eureka頁面中紅字(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE)的出現原因:https://cloud.tencent.com/developer/article/1152507。server通過心跳機制檢查client端,判斷其是否還在線上運行。當client不在線上運行時,保護機制仍會視爲在線(如下圖已關閉client應用)。在開發環境中,最好關閉該模式。在server端的applicaton.yml配置中配置:server: enable-self-preservation: false。(結果啓動服務後又tm出現紅字:THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.cou!我這強迫症哦!)

Eureka的高可用

    1. 高可用:爲避免服務宕機,可以創建多個Eureka服務註冊中心,通過之間的相互註冊創建聯繫。(使用不同的端口啓動eureka服務端即可實現多服務註冊,修改application.yml的註冊地址即可實現相互創建聯繫)。
    2. 創建兩個測試類:

    3. 在啓動application1時,將application.yml的註冊地址修改成 eureka: client: service-url: defaultZone: http://localhost:8762/eureka。然後在啓動application2時,將application.yml的註冊地址端口修改爲 8761.即可模擬啓動兩個eureka的服務端。啓動成功後,分別訪問 localhost:8761和localhost:8762即可進入兩個服務的註冊中心。
    4. 啓動eureka的客戶端。雖然client的註冊端口仍然是8761,但是client會被兩個eureka註冊。因爲被8761的服務同步了。此時掛掉eureka1,eureka2和client都不會受到影響。從而實現了高可用。但是若重啓了client,則client會報錯,因爲請求註冊的地址服務已經不在了。但由於心跳機制,eureka2中註冊的客戶端仍然存在,也只是服務的“自我欺騙”。
    5. 爲了實現eureka掛掉一個,client重啓也不會受到影響,那麼只需要每次都將client註冊到兩個eureka服務中即可。修改client的application.yml配置:(此時掛掉任何一個eureka服務都不會被影響了。)

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
  application:
    name: client

    6. 如果是三個eureka,那麼需要eureka的服務兩兩相互註冊,客戶端也需要註冊三個eureka服務中心。(服務端:8761端口的註冊到8762和8763,8762的端口註冊到8761和8763,8763端口的註冊到8761和8762。客戶端註冊到8761、8762、8763)。

 

總結

  1. @EnableEurekaServer、@EnableDiscoveryClient兩個註解分別註解服務端和客戶端的啓動類。
  2. eureka具有心跳檢測機制、健康檢查機制、負載均衡等功能。
  3. Eureka的高可用,在生產環境上建議至少兩臺以上(三臺或大於三臺,以保證項目的穩定運行)。
  4. 分佈式系統中,服務註冊中心是最重要的基礎部分。
  5. Eureka採用的是客戶端發現方式。(服務端發現服務:Nginx,Zookeeper,Kubernetes)。
  6. SpringCloud的服務調用方式:http的Restful風格接口。

微服務特點:由一系列微小的服務共同組成;單獨部署,運行在自己的進程中;每個服務爲獨立的業務開發;分佈式管理。(異構——不同編程語言、不同類型的數據庫。)

不適合使用微服務框架的業務形態:系統中包含很多強事務的場景;業務相對穩定成熟,迭代週期長;訪問壓力小,可用性要求不高。

康威定律和微服務:任何組織在設計一套系統(廣義概念的系統)時,所交付的設計方案在結構上都與該組織的溝通結構保持一致。簡而言之:溝通的問題會影響系統的設計。

源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章