一、Eureka元數據
了解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