你不知道的Eureka

在SpringCloud的微服務體系中,Eureka是非常重要的一部分。微服務架構,幫助我們降低了業務程序之間的耦合,由原來的互相調用,到現在的只需要告訴註冊中心,我需要什麼。大大的幫助我們避免了很多編程時的麻煩。而Eureka就是一箇中介一樣,我只需要將我自己的信息和我想要的信息告訴它,他就能給我想要的。

基礎架構

從這張架構圖中,我們能看到最簡單的信息就是以下幾個:

  • EurekaServer註冊中心:就是我們註冊中你信本尊了。它對外暴露自己的地址。
  • ApplicationService服務提供者:將自己的元數據註冊到註冊中心,以便提供服務(元數據例如:IP地址、端口、運行狀況指示符URL、主頁等)
  • ApplicationClient客戶端消費者:訂閱Eureka的服務,以便Eureka將對應服務提供者的地址發送給它,方便其調用

除了這幾個比較容易理解的,還有一個“心跳”,什麼是心跳呢?

  • 這裏所謂的心跳,也叫作服務續約,服務提供者(ApplicationService)會每隔一段時間(這個時間可以配置)發送一次心跳,來進行需要,通過續約這個操作,告訴EurekaServer自己一切正常,可以正常的提供服務。

那麼如果EurekaServer在一段時間內(時間可以配置)沒有收到來自服務提供者(ApplicationService)的續約,EurekaServer會自動將其在服務的註冊表中剔除

以上兩個時間可以在eureka的配置文件中進行設置:

服務續約任務的調用間隔時間,默認爲30秒
eureka.instance.lease-renewal-interval-in-seconds=30

服務失效的時間,默認爲90秒。
eureka.instance.lease-expiration-duration-in-seconds=90

剔除(服務剔除):當EurekaServer 檢測到ApplicationService不在有心跳時,及對其進行服務剔除(Eviction),防止調用這個服務時發生異常。

搭建Eureka的Server

1、引入依賴

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2、編寫application.yml文件

server:
  port: 10086 # 端口
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    service-url: # EurekaServer的地址,現在是自己的地址,如果是集羣,需要加上其它Server的地址。
      defaultZone: http://127.0.0.1:${server.port}/eureka

3、在啓動類上添加@EnableEurekaServer註解:

@SpringBootApplication
@EnableEurekaServer // 聲明當前springboot應用是一個eureka服務中心
public class EurekaApplication {

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

4、啓動測試

在瀏覽器中輸入地址 127.0.0.1:10086,注意,端口號爲自己在application.yml文件中配置的端口號

將服務註冊到註冊中心

1、引入依賴

<!-- Eureka客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、編寫application.yml文件

server:
  port: 8081
spring:
  application:
    name: service-provider # 應用名稱,註冊到eureka後的服務名稱
mybatis:
  type-aliases-package: cn.itcast.service.pojo
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka

3、在啓動類上添加註解

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class, args);
    }
}

Eureka的自我保護機制

前面提到,如果EurekaServer在一定的時間內沒有收到某個微服務的心跳,Eureka會自動剔除其服務,但是如果因爲網絡等外部原因導致很多微服務都無法正常的盡心服務的續約,那麼按照之前的機制,EurekaServer如果將這些服務都剔除掉,那麼可能會導致整個系統的癱瘓,所以Eureka設定一個自我保護機制。

自我保護機制:EurekaServer在運行期間會統計心跳失敗比例在15分鐘內是否低於85%,如果低於85%,EurekaServer會自動進入自我保護機制

進入自我保護的EurekaServer會進行如下的處理:

  • 不在移除因爲在規定時間內發送心跳的服務
  • EurekaServer仍接受新服務的註冊和查詢,但是不會把它同步到其他的節點上,當網絡穩定後,再將其同步到其他節點

Eureka的自我保護,機制建議在生產環境中打開,而我們在開發的過程中,可以將其關閉,從而減少對我們開發的影響

eureka:
  server:
    enable-self-preservation: false # 關閉自我保護模式(缺省爲打開)
    eviction-interval-timer-in-ms: 1000 # 掃描失效服務的間隔時間(缺省爲60*1000ms)

Eureka的高可用

EurekaServer作爲微服務架構中不可缺少的一部分,同樣也可以創建一個集羣,也防止單節點情況下服務出現問題,導致其他微服務無法拉取服務列表或者進行服務註冊的問題。

在之前的內容裏,我們已經搭建好一個端口爲10086的EurekaServer,我們在用同樣的方法搭建一個其他端口號的EurekaServer。

但是本次搭建與之前不同的是:本次EurekaServer的service-url應爲上次搭建好的EurekaServer的地址。也就是說,兩臺EurekaServer互相使用對方的地址,將自己註冊給對方。

server:
  port: 10087 # 端口
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    service-url: # 配置其他Eureka服務的地址,而不是自己,比如10086
      defaultZone: http://127.0.0.1:10086/eureka

如果有有多臺,那麼也是同樣的操作。互相註冊自己的EurekaServer。

高可用下的EurekaClient

只需要在配置service-url時,將多個服務器的地址寫上,用逗號分隔即可

server:
  port: 9999 # 端口
spring:
  application:
    name: App-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    service-url: # 配置其他Eureka服務的地址,有多個EurekaServer,寫多個
      defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

 

感謝閱讀~

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