//1.Eureka服务端
@SpringBootApplication
@EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App(){
}
//2.yml配置
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
#defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
//3.服务生产者
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
//@EnableDiscoveryClient //服务发现
public class DeptProvider8001_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
//4.生产者配置
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
# defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #访问路径可以显示IP地址
#
info:
app.name: microservicecloud
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
# 注: 配置info需要 <!-- actuator监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
//5.eureka的自我保护机制
如果EurekaServer在一定时间内没有接受到某个微服务实例心跳,EurekaServer将会注销该实例(默认901秒)
当EurekaServer节点在短时间丢失客户端,那么这个节点就会进入自我保护模式,一旦进入该模式,EurekaServer就会保护
服务注册表中的信息,不删除服务注册表中的数据(不会注销任何微服务),当网络故障回复后,该EurekaServer节点会自动退出自我保护模式。
自我保护模式是一种对网络异常的安全保护措施,保留所有微服务,也不会盲目注销任何健康的微服务。
//6.服务发现
加注解:
@EnableDiscoveryClient //服务发现
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
public Object discovery()
{
List<String> list = client.getServices(); //获取所有微服务
//获取指定微服务
List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
for (ServiceInstance element : srvList) {
System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
+ element.getUri());
}
return this.client;
}
//Eureka与Zookeeper的区别
1.Zookeeper保证一致性和分区容错性(CP),Eureka保证可用性和分区容错性(AP)
2.Zookeeper:当其中一个节点down掉后,其他节点会重新进行leader选举,选举时间太长,30-120s,且选举期间整个Zookeeper不可用。
3.Eureka:保证可用性,Eureka各个节点都是平等的,几个节点挂掉不会影响剩余节点,依然可以提供注册和查询服务。如果连接该节点失败,就会自动连接到其他节点。只要有一台Eureka存在就能保证注册服务的可用性,不过不能保证查到的信息是最新的(不保证强一致性)。
3.1 如果15分钟内超过85%的节点没有正常心跳,那么Eureka会认为客户端与注册中心出现了网络故障,会出现以下几种情况
(1)Eureka不再从注册列表中移除,因为长时间没有收到心跳而应该过期的服务
(2)Eureka仍然能接受新服务的注册和查询请求,但是不会同步到其他节点上(保证当前节点可用)
(3)当网络稳定时,当前实例新的注册信息会被同步到其他节点中