1. 程式人生 > >Eureka--2、第一個Eureka程式,Eureka Client的自啟動原理和簡要過程

Eureka--2、第一個Eureka程式,Eureka Client的自啟動原理和簡要過程

在之前的Spring Cloud Config的基礎上,搭建簡單的Eureka Server

沒有程式碼,很多試驗做不起來,我們先建立個Eureka Server再說。

本篇主要講如何建立Eureka Server和Eureka Client,還有個重點是通過原始碼分析Eureka Client是如何自動啟動的。

建立Eureka Server

1、通過idea建立Eureka Server

通過Spring Initializr建立,選擇Web和Cloud Discovery裡面的Eureka Server

使用intellij建立spring boot專案的時候,選擇Cloud Discovery下面Eureka有兩個選項,Eureka Server和Eureka Discovery。一個是Eureka Server,一個是Eureka Client。

檢視生成的pom,區別就在引入的jar包不同,一個是spring-cloud-starter-netflix-eureka-client,一個是spring-cloud-starter-netflix-eureka-server。netflix的starter幾經修改,變成了現在的樣子,大家在網上看一些老的帖子,有可能那時候的pom.xml中的dependency和現在是不一樣的。

2、配置eureka server

server application.yml配置檔案

spring:
  application:
    name: eureka-server
server:
  #指定服務埠
  port: 8761
eureka:
  #指定主機名稱
  instance:
    hostname: localhost
  #server一定程度上也是client,互為client,
  client:
    #由於自己就是伺服器,不需要註冊到自己
    register-with-eureka: false
    #由於自己就是伺服器,不需要從伺服器獲取註冊資訊
    fetch-registry: false
    #服務地址
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3、在啟動類上新增@EnableEurekaServer

4、啟動專案,輸入localhost:8761 看一下效果先

5、我們先建立完客戶端,配置完客戶端,再來看配置項的意義

建立Eureka Client

1、新增依賴項,使專案成為Eureka Client

從idea建立時,Eureka client使用Eureka Discovery建立,會自動新增依賴項。我們不新建,把之前的Config Client專案增加Eureka Client依賴,到maven repository那些網站搜spring eureka client,就能找到依賴的xml,注意不要弄成spring boot的starter,是spring cloud的,貼到之前的配置客戶端中。

<!-- Eureka Client -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

2、Eureka Client會在專案啟動時自動啟動,不像Server需要新增什麼@EnableEurekaClient之類的

我一開始只添加了這個依賴,其它什麼也沒做,沒配置指向eureka server,eureka server都沒啟動。啟動Eureka Client時報錯了,報錯無法連線eureka server。但是專案照樣起了起來,我訪問localhost:8080/hello能成功打印出內容。

說明了幾個問題:

1、eureka client獲取和註冊中心互動是非同步執行緒,不干擾主執行緒的啟動。這是很合理的設計。

2、然後我把報錯資訊清空,發現每30s又會報一次錯。也就是有什麼東西30s觸發一次

3、看起來是假設引入了jar包,就會有個執行緒自動啟動,嘗試用某個預設的連線去與“註冊中心”通訊。假設通訊失敗,30s會再次心跳一次。我們去看原始碼到底特麼哪裡“自動”啟動了。

4、根據報錯資訊的最開始的堆疊資訊檢視原始碼,注意要從一開始啟動的報錯資訊開始找。後面30s一次的報錯資訊,是已經開啟了心跳之後的。看這個之前又得補習spring容器的知識(龐大的知識),可以先搜一下LifecycleProcessor這個介面的作用。

從這裡看,後面的再底層的我們不管,上層會觸發DefaultLifecycleProcessor這個類的onRefresh方法,DefaultLifecycleProcessor(預設生命週期處理器)繼承自介面LifecycleProcessor。Spring容器載入完一個bea後,如果bean實現了LifecycleProcessor介面,會判斷bean實現的isAutoStartUp方法的返回值是true返回false,這個方法預設為false。如果我們修改為return true,會執行start()方法,我們可以在start()方法中做一些額外的工作,我後面打算總結一篇關於LifecycleProcessor的文章。

而EurekaAutoServiceRegistration就繼承了這麼個介面,並且也將isAutoStartUp方法實現為return true,所以會執行它的start()方法

然後一直往上找,最終會找到new DiscoveryClient的地方

呼叫DiscoveryClient的建構函式,這個建構函式,裡面有句this.initScheduledTasks(); 。這名字,你懂的。追程式碼會發現initScheduledTasks()這個方法會根據shouldFecthRegistry和shouldRegisterWithEureka這兩個配置決定是否開啟兩個TimedSupervisorTask。這個方法先不繼續追下去,總之,會開啟排程方法,根據配置的重新整理時間,如果沒有預設值30S,去配置的配置中心拿資料。如果配置中心連線不上,報錯連線不上unknown server

5、因為獲取註冊資訊的task會一直重複,假設註冊中心某個時間掛掉,或者沒有事先啟動,客戶端會在服務中心重新活躍之後和註冊中心進行互動。

至此明白了為什麼只要加了Eureka Client的依賴項,引入了jar包,就會預設啟動,以及稍微瞭解了啟動的一些機制。下面我們來點正常操作,先把Eureka Server啟動起來,然後配置一下客戶端。

3、配置Eureka Client

application.yml 配置

在原來的配置裡新增eureka的配置

spring:
  application:
    name: springcloudweb
  cloud:
    config:
      #指定配置服務中心地址
      uri: http://localhost:8888/
      profile: dev
server:
  port: 8080
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

上面也說過Eureka的啟動是通過類整合LifeCycle來自啟動的,所以不需要像Config Server一樣,需要加註解。

新增完重新整理Eureka介面。會發現已經註冊上去了

然後頁面上會有DS Replicas,由於我們是standalone的server,所以這裡是空的,還有各種資訊,這些我們先不管,慢慢都會涉及到。

後來我再看spring文件中的eureka部分,裡面其實講到了在Eureka Client中引入jar包就會在啟動時自動嘗試往Eureka Server註冊的事情,但是隻一筆帶過,太容易被忽略,並且也沒講原理,我喜歡先讀一遍文件瞭解大概,再實踐踩坑,再去研讀理論。。。

好了,主要就先將Eureka Client如何自動啟動的,太多容易消化不良。