🚩 Eureka Server:提供服务注册服务
🚩 Eureka Client:通过服务注册中心访问
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:
port: 7001
eureka:
instance:
# eureka服务端的实例名称
hostname: localhost
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖此地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
@SpringBootApplication
@EnableEurekaServer //开启服务注册功能
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka # 注册中心的地址
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class);
}
}
搭建 Eureka 注册中心集群,实现负载均衡 + 故障容错。
SpringCloud Eureka 集群配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
server:
port: 7002
eureka:
instance:
# eureka服务端的实例名称
hostname: eureka7002.com
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖此地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
server:
port: 7001
eureka:
instance:
# eureka服务端的实例名称
hostname: eureka7001.com
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖此地址
service-url:
defaultZone: http://eureka7002.com:7002/eureka/
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
eureka:
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示ip地址
前提是引入了 actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/payment/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("service:" + service);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info("serviceId:" + instance.getServiceId() + "\t" + "Host:" + instance.getHost() + "\t" + "port:" + instance.getPort() + "\t" + "uri:" + instance.getUri());
}
return this.discoveryClient;
}
在 Eureka 注册中心的页面会看到这样的提示,说明 Eureka 进入了保护模式:
保护模式主要用于一组客户端和 Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server 将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
简单来说就是:某时刻某个微服务不可用了,Eureka 不会立即清理,依然会对该微服务的信息进行保存;属于 CAP 理论中的 AP 分支
🎨 为什么会产生Eureka自我保护机制?
🎨 什么是自我保护模式?
在自我保护模式中,EurekaServer 会保护服务注册表中的信息,不再注销任何服务实例。
它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着I
综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。
🎨 如何禁用自我保护模式
在注册中心服务配置中加入以下内容
eureka:
server:
# 关闭自我保护机制,保证不可用服务及时被剔除
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
刷新注册中心页面可以看到,提示内容已经变了,自我保护模式已关闭
在其它服务配置中加入以下内容
eureka:
instance:
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
lease-expiration-duration-in-seconds: 2
正常启动服务后,服务出现在注册中心列表,当我们关闭服务再查看列表,可以看到服务在 2s 内直接被剔除了.