Eureka服務發現註冊之使用ip地址註冊eureka服務詳解

一、服務發現簡介

        1.服務提供者、服務消費者、服務發現組件三者之間的關係大致如下:

  • 各個微服務在啓動時時,將自己的網絡地址等信息註冊到服務發現組件上(eureka,zookeeper,Consul),服務發現組件會存儲這些信息。
  • 服務消費者會從服務發現組件查詢服務提供者的網絡地址,然後根據該地址調用服務提供者的接口。
  • 各個微服務與服務發現組件使用一定的機制來維持心跳,服務發現組件若發現有服務沒有提供心跳,那麼服務發現組件會將該服務剔除。
  • 微服務網絡地址發生變更(例如實例增減或者IP端口發生變化等),會重新註冊到服務發現組件上,使用這種方式,可以避免因網絡變化導致服務之間的通訊停止,服務消費者也無須人工的修改網絡地址。

二、Eureka簡介

        Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。

        1.Eureka包含兩個組件:Eureka Server和Eureka Client。

Eureka Server提供服務註冊服務,各個節點啓動後,會在Eureka Server中進行註冊,這樣EurekaServer中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到。

Eureka Client是一個java客戶端,用於簡化與Eureka Server的交互,客戶端同時也就是一個內置的、使用輪詢負載算法的負載均衡器。

       2.在應用啓動後,將會向Eureka Server發送心跳,默認週期爲30秒,如果Eureka Server在多個心跳週期內沒有接收到某個節點的心跳,Eureka Server將會從服務註冊表中把這個服務節點移除(默認90秒)。

       3.Eureka Server之間通過複製的方式完成數據的同步,Eureka還提供了客戶端緩存機制,即使所有的Eureka Server都掛掉,客戶端依然可以利用緩存中的信息消費其他服務的API。綜上,Eureka通過心跳檢查、客戶端緩存等機制,確保了系統的高可用性、靈活性和可伸縮性。

 

三、Eureka一些特性及配置過程時需要注意的問題

       1.Eureka能夠保證AP,即當Eureka中的某個節點掛掉後,剩餘的節點繼續仍然可以提供服務的發現與註冊服務。而Eureka的客戶端在向某個Eureka或者發現了當前的Eureka不可用時,會自動切換到其他的節點,也就是說Eureka的節點是平等的,只要有一臺Eureka服務器在,就能保證服務的可以繼續被使用。

       2.Eureka的自我保護機制,我們在註冊服務時,如發生斷網的情況,Eureka不能接收到當前服務的任何心跳請求,Eureka會在默認的90s後,將該服務進行強制剔除,這樣就能保證到網絡故障時,雖然失去了部分節點,但不會像zookeeper那樣會使整個註冊服務癱瘓。當網絡穩定時,新的實例會同步到其他節點中。

      3.相關配置問題

         服務端的配置如下,不註冊自身:

security:
  basic:
    enabled: true
  user:
    name: user
    password: password123
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://user:password123@localhost:8761/eureka

如果我們需要使用ip地址來配置的話,先添加一行:

   eureka.instance.prefer.IpAddress=true;

如果我們想要關閉保護機制,則設置以下代碼:
eureka.server.enable-self-preservation:=false
設置eureka剔除服務的時間間隔:
eureka.server.eviction-interval-timer-in-ms:=3000

 需要注意的是要在應用類的頭上添加@EnableEurekaServer來啓用Eureka服務器。

接下來:訪問Eureka,Url爲:http://localhost:8761/

可以發現eureka註冊中心就啓動了!!!

在這裏解釋一下register-with-eureka=fasle和fetch-registry的用法,如果不指定該屬性,服務端會將自身作爲一個服務註冊到註冊中心去,因此我們需要在服務端啓動前,指定這兩個屬性值爲false。

假如我們把以下代碼給註釋掉,指定一個應用名,重新啓動eureka-server端:

security:
  basic:
    enabled: true
  user:
    name: user
    password: password123

server:
  port: 8888

eureka:
  instance:
    hostname: 192.168.43.246
    prefer-ip-address: true
    instance-id: ${eureka.instance.hostname}:${server.port}
  client:
#    register-with-eureka: false
#    fetch-registry: false
    service-url:
      defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
spring:
  application:
    name: eureka-server

發現eureka-server也註冊到eureka上去了!

 

注:

    如果使用ip地址來註冊時,一定要添加以下兩行代碼:

    第一種方式: ,使用參數佔位符來引用已經配置好的信息:

       eureka.instance.prefer-ip-adderss=true

        eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}

     第二種方式: 使用springcloud來自動獲取ip地址: 

     eureka.instance.hostname=${spring.cloud.client.ip-address}
     eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}

eureka客戶端的配置添加上這兩行代碼,可以發現,添加以上兩行代碼的服務是以ip地址形式來註冊的,沒有添加的則以默認的方式來進行註冊,即使用的主機名的方式來註冊:

 

附上使用ip地址註冊服務的完整配置:

eureka服務端:

security:
  basic:
    enabled: true
  user:
    name: user
    password: password123

server:
  port: 8888
eureka:
  instance:
    hostname: 192.168.43.246
#    使用ip地址的方式進行註冊
#    prefer-ip-address: true
#    instance-id: ${eureka.instance.hostname}:${server.port}
  client:
#    不註冊自身
#    register-with-eureka: false
#    fetch-registry: false
    service-url:
      defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
spring:
  application:
    name: eureka-server

eureka客戶端:

security:
  basic:
    enabled: true
  user:
    name: user
    password: password123

server:
  port: 9999
spring:
  application:
    name: eurekaClient
eureka:
  instance:
    hostname: 192.168.43.246
    prefer-ip-address: true
    instance-id: ${eureka.instance.hostname}:${server.port}
  client:
   service-url:
      defaultZone: http://user:password123@${eureka.instance.hostname}:8888/eureka

此處的server-url的端口號要爲服務端的端口號。

 附:使用指定的ip去註冊

客戶端配置如下,如果你在pom文件中添加了如下依賴,客戶端可以不用在啓動類上面添加@EnableEurekaClient註解。只需要在applicantion.properties文件中添加配置即可:

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

 

 

四、EurekaServer和EurekaClient的作用分析 

           1.  EurekaServer提供服務發現的能力,當有服務來註冊時,EurekaServer會將這些服務的信息存儲到起來。

           2.  EurekaClient是一個java客戶端,可以與服務發現組件來交互。

           3.  續約。微服務啓動後,會默認底向EurekaServer發送心跳,默認時間爲30s,這樣的作用就是續約自己的租約。

           4.  剔除。如果Eureka在一定時間內沒有收到客戶端的心跳,那麼EurekaServer會剔除掉沒有發生心跳客戶端,默認時間爲90s。  

           5. 緩存。EurekaClient會緩存服務器的信息,這種方式的好處是當EurekaServer宕機時,,服務消費者依然可以訪問服務。

           6. eureka 服務器默認是將自身註冊到服務器裏。可以使用如下代碼不講自身註冊進去:

     eureka:
  client:
#    不註冊自身
#    register-with-eureka: false

           7. 如果設置多個eureka時,需要設置 eureka.client.fetchRegistry=true,表示多個服務器之間的數據同步。單個節點直接設置成false即可。

 

 

五、Eureka開發實戰

          1. 在Spring Cloud Edgware以及更高的版本中,只需要添加相關依賴,即可自動註冊服務到EurekaServer中,在實際的項目中,我們可以直接實現服務消費者連接服務提供者,這樣我們可以不用將服務註冊到eureka上,以便於調試。

          2.  如果不想將服務註冊到EurekaServer上,只需要設置spring.cloud.service-registry.auto-registration.enabled=false,或使用註解@EnableDiscoveryClient(auto-Registry=false)。

           服務的遠程調試也可以參考我另外一篇博客: 

          https://blog.csdn.net/qq_33036061/article/details/103989170

 

 

 

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