0407-服務注冊與發現-Eureka深入理解-元數據、高可用HA


一、Eureka元數據

參看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_eureka_metadata_for_instances_and_clients

  了解Eureka元數據的工作原理,以便您可以在平台中使用它。有主機名,IP地址,端口號,狀態頁和運行狀況檢查等標准元數據。這些信息發布在服務注冊中心,並由客戶用於直接聯系服務。額外的元數據可以添加到eureka.instance.metadataMap中的實例注冊中,並且可以在遠程客戶端訪問,但通常不會改變客戶端的行為,除非它意識到元數據的含義。Spring Cloud已經為元數據映射賦予了含義,下面介紹了一些特殊情況。

1.1、改變Eureka 實例Id

application.yml. 

eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

或者個人使用:    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}

1.2、自定元數據  

在providor中提供:microservice-provider-user

eureka:
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
    metadata-map:
    zone: ABC # zone默認帶的 eureka可以理解的數據
    lihongxu: BBC # 自定義的 不會影響客戶端行為

可在eureka中查看:http://localhost:8761/eureka/apps/microservice-provider-user

可以看到其中manager.port已經影響實際接口,但自定義無影響

二、為甚么注冊一個服務比較慢

  作為一個實例還涉及到注冊表的周期性心跳(通過客戶端的serviceUrl),默認持續時間為30秒。服務不可用於客戶端發現,直到實例,服務器和客戶端在其本地緩存中都具有相同的元數據(因此可能需要3次檢測信號)。您可以使用eureka.instance.leaseRenewalIntervalInSeconds更改期限,這將加快獲取客戶端連接到其他服務的過程。在生產中,堅持使用默認值可能會更好,因為在服務器內部有一些計算可以對租期更新進行假設。

三、Eureka高可用,zones,regions

  Eureka服務器沒有后端存儲,但注冊表中的服務實例必須發送心跳信號以保持其注冊是最新的(所以這可以在內存中完成)。客戶端還擁有一個eureka注冊的內存緩存(因此,他們不必為每個服務請求都去注冊表)。默認情況下,每個Eureka服務器也是Eureka客戶端,並且需要(至少一個)服務URL來定位對等端。如果您不提供該服務,該服務將運行並正常工作,但它會給您的日志帶來很多無法注冊的噪音。

3.1、單機模式

前幾節說的就是單機模式

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.2、高可用

  通過運行多個實例並要求它們相互注冊,Eureka可以變得更加靈活和可用。事實上,這是默認的行為,所以你需要做的只是為對等體添加一個有效的serviceUrl。

application.yml (Two Peer Aware Eureka Servers). 

---
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2/eureka/

---
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1/eureka/

示例:

配置啟動類

@SpringBootApplication
@EnableEurekaServer
public class EurekaHaApplication {
    public static void main(String[] args) {
//        SpringApplication.run(EurekaApplication.class, args);
        // 讀取控制台輸入,決定使用哪個profiles
        System.out.println("輸入配置:");
        Scanner scan = new Scanner(System.in);
        String profiles = scan.nextLine();
        new SpringApplicationBuilder(EurekaHaApplication.class).profiles(profiles).run(args);
    }
}

application.yml配置文件:

spring:
  application:
    name: EUREKA-HA
---    
# 啟動類配置啟動哪個   
server:
  port: 8761
spring:
  profiles: peer1
eureka:
  instance:
    hostname: peer1
  client:
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
      
---
server:
  port: 8762
spring:
  profiles: peer2
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
      
---
server:
  port: 8763
spring:
  profiles: peer3
eureka:
  instance:
    hostname: peer3
  client:
    serviceUrl:
     defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

實際啟動時,配置文件中用三個”-“分隔兩種配置即可,三次分別輸入:peer1,peer2,peer3,便可分別按照配置啟動。

服務提供者配置其中任何一個集群節點即可,建議多配置兩個

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
 
        

3.3、實例

示例一、單例不使用security

示例二、單例使用security

示例三、集群HA不使用security

示例四、集群HA使用security

  參看地址:https://github.com/bjlhx15/spring-cloud-base.git

3.4、注意事項

  1、集群時:eureka.client.serviceUrl.defaultZone配置項的地址,不能使用localhost,要使用域名,DNS解析請自行配置【配置host】。 

  2、集群時:spring.application.name 要一致,多個應用

  3、一下配置

# 單點注冊中心的時候,將這兩個配置項設為false,分布式注冊中心true
# eureka.client.registerWithEureka :表示是否將自己注冊到Eureka Server,默認為true。
#   由於當前這個應用就是Eureka Server,故而設為false
# eureka.client.fetchRegistry :表示是否從Eureka Server獲取注冊信息,默認為true。
#   因為這是一個單點的Eureka Server,不需要同步其他的Eureka Server節點的數據,故而設為false。
# eureka.client.serviceUrl.defaultZone :設置與Eureka Server交互的地址,查詢服務和注冊服務都需要依賴這個地址。
#   默認是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

  4、實例名

# ha 3、區別配置 同 defaultZone一致
eureka.instance.hostname=peer2

  5、ip設置【集群可用性有問題】

# ha 4、去掉下面這個參數或者改為false
eureka.instance.preferIpAddress=false

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM