Eureka简介
简介
-
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
-
Eureka包含两个组件:
Eureka Server
和Eureka Client
。 -
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
-
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
-
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。(自我保护机制)
-
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性
三大角色
Eureka Server
:提供服务的注册与发现
Service Provider
:服务生产方,将自身服务注册到Eureka中,从而使服务消费方能狗找到
Service Consumer
:服务消费方,从Eureka中获取注册服务列表,从而找到消费服务
Eureka服务搭建
该环境延续了上一篇Blog的Rest的环境,所以我们的Eureka环境是在Rest环境下接着搭建
Eureka
- 创建一个新的模块
springcloud-eureka-7001
,导入Eureka的依赖
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
- 编写
application.yml
配置
server:
port: 7001
#eureka配置
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false # 表示是否向eureka注册自己
fetch-registry: false # false:设置自己为注册中心
service-url: #监控页面
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 编写主启动类
package springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //eureka服务端启动类
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class,args);
}
}
- 访问http://localhost:7001/ 进行测试
服务提供者
- 导入依赖
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
- 在
application.yml
配置eureka
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
- 主启动类开启服务端,添加
@EnableEurekaClient
- 启动测试,eureka也要启动!!!(如果之前启动了eureka的,要先重新启动eureka,再启动服务提供者)
5. 我们还可以修改eureka中,服务提供者的描述信息,在
application.yml
中配置
eureka:
instance:
instance-id: provider-detail-message # 配置描述信息
- 如果突然停电了,或者你的服务崩了,(模拟一下场景就是你把服务提供者先关了),这时候,服务提供者还在eureka里面嘛?
我们发现服务提供者还在,这就涉及到了eureka的自我保护机制。
- 虽然这服务提供者已经崩了,但是eureka还是会保存它的信息的,我们可以查看一下它的监控信息
到底要怎么查看呢,我们需要增加一些配置
- 添加完善监控信息的依赖
<!-- actuator完善监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 在
application.yml
配置监控信息
info:
app.name: springcloud-provider
company.name: apach
- 启动服务提供者
- 当然了,我们还可以去获取一下这些服务的信息
- 编写
DeptController.java
,获取这些服务的信息
@Autowired
private DiscoveryClient client;
//注册进来的微服务,获取信息
@GetMapping("/message")
public Object discovery(){
//获取微服务
List<String> services = client.getServices();
System.out.println("获取的微服务"+services);
//得到具体的微服务,通过微服务的id
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER");
for (ServiceInstance instance : instances) {
System.out.println(instance.getHost());
System.out.println(instance.getInstanceId());
System.out.println(instance.getPort());
System.out.println(instance.getUri());
System.out.println(instance.getServiceId());
}
return client;
}
- 在主启动类加上
@EnableDiscoveryClient
- 启动测试
Eureka VS Zookeeper
CAP是什么?
- C (Consistency) 强一致性
- A (Availability) 可用性
- P (Partition tolerance) 分区容错性
CAP理论的核心
一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,只能三选二
根据CAP原理,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类
- CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差
- CP:满足一致性,分区容错的系统,通常性能不是特别高
- AP:满足可用性,分区容错的系统,通常可能对一致性要求低一些
其中 Eureka 保证的是 AP —> 满足可用性,分区容错的系统,通常可能对一致性要求低一些
Zookeeper 保证的是 CP —> 满足一致性,分区容错的系统,通常性能不是特别高
这也是我们选择Eureka的原因~~~