本文參考:http://www.itdecent.cn/p/cb7fa0aa47a8
一、Eureka 的服務(wù)發(fā)現(xiàn)
EurekaClient 會(huì)從 server 端獲取一份注冊(cè)表信息,將其復(fù)制一份到 client 端本地,然后進(jìn)行調(diào)用訪(fǎng)問(wèn)其它服務(wù)。
所以我們可以在本地獲取到所有注冊(cè)到 Eureka server 端的服務(wù)信息。
1、在 client 端的 主啟動(dòng)類(lèi)加注解 @EnableDiscoveryClient
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
2、通過(guò) Spring 的依賴(lài)注入可以獲取 DiscoveryClient 對(duì)象,通過(guò) DiscoveryClient 我們能發(fā)現(xiàn)其它服務(wù)
import org.springframework.cloud.client.discovery.DiscoveryClient;
...
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/consumer/discovery/info")
public Object info() {
//獲取 eureka server 端的所有服務(wù)
List<String> services = discoveryClient.getServices();
for (String service : services) {
List<ServiceInstance> instances = discoveryClient.getInstances(service);
log.info("service is {}", service);
//獲取所有實(shí)例的信息
for (ServiceInstance serviceInstance :instances ) {
log.info("instanceId:{}, serviceId:{}, URI:{}, PORT:{}"
, serviceInstance.getInstanceId(), serviceInstance.getServiceId(),serviceInstance.getUri(),serviceInstance.getPort());
}
}
return services;
}
最終調(diào)用可以打印出所有服務(wù)和實(shí)例信息:

打印信息.png
二、Eureka 的自我保護(hù)機(jī)制
1、什么是 Eureka 的自我保護(hù)機(jī)制?
(1)官方定義:自我保護(hù)模式正是一種針對(duì)網(wǎng)絡(luò)異常波動(dòng)的安全保護(hù)措施,使用自我保護(hù)模式能使Eureka集群更加的健壯、穩(wěn)定的運(yùn)行。
(2)工作機(jī)制:如果在15分鐘內(nèi)超過(guò)85%的客戶(hù)端節(jié)點(diǎn)都沒(méi)有正常的心跳,那么Eureka就認(rèn)為客戶(hù)端與注冊(cè)中心出現(xiàn)了網(wǎng)絡(luò)故障,Eureka Server自動(dòng)進(jìn)入自我保護(hù)機(jī)制,此時(shí)會(huì)出現(xiàn)以下幾種情況:
一、Eureka Server不再?gòu)淖?cè)列表中移除因?yàn)殚L(zhǎng)時(shí)間沒(méi)收到心跳而應(yīng)該過(guò)期的服務(wù)。
二、Eureka Server仍然能夠接受新服務(wù)的注冊(cè)和查詢(xún)請(qǐng)求,但是不會(huì)被同步到其它節(jié)點(diǎn)上,保證當(dāng)前節(jié)點(diǎn)依然可用。
三、當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),當(dāng)前Eureka Server新的注冊(cè)信息會(huì)被同步到其它節(jié)點(diǎn)中。
2、Eureka 的自我保護(hù)機(jī)制的相關(guān)配置
(1)eureka.server.enable-self-preservation=false
關(guān)閉自我保護(hù),保證不可用服務(wù)被即使剔除
(2)eureka.server.eviction-interval-timer-in-ms= 60000
eureka server清理無(wú)效節(jié)點(diǎn)的時(shí)間間隔,默認(rèn)60000毫秒,即60秒
server:
port: 7001
eureka:
instance:
# hostname: localhost #eureka 服務(wù)端的實(shí)例名稱(chēng)
hostname: eureka7001.com #eureka 服務(wù)端的實(shí)例名稱(chēng)
client:
register-with-eureka: false #false表示不向注冊(cè)中心注冊(cè)自己
fetch-registry: false #是否去注冊(cè)中心fetch信息,false表示自己就是注冊(cè)中心,所以自己不必找自己去檢索服務(wù)
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設(shè)置與eureka server交互的地址查詢(xún)服務(wù)和注冊(cè)服務(wù)都需要依賴(lài)這個(gè)地址
defaultZone: http://eureka7002.com:7002/eureka/ #設(shè)置與eureka server交互的地址查詢(xún)服務(wù)和注冊(cè)服務(wù)都需要依賴(lài)這個(gè)地址
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 60000

自我保護(hù)機(jī)制打開(kāi).png

自我保護(hù)機(jī)制關(guān)閉.png