一、Eureka 概述
1、CAP 定理
(1) 概念
CAP 定理指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、 Partition tolerance(分区容错性),三者不可兼得。
-
一致性(C):分布式系统中多个主机之间是否能够保持数据一致的特性。即,当系统数据发生更新操作后,各个主机中的数据仍然处于一致的状态。
-
可用性(A):系统提供的服务必须一直处于可用的状态,即对于用户的每一个请求,系统总是可以在有限的时间内对用户做出响应。
-
分区容错性(P):分布式系统在遇到任何网络分区故障时,仍能够保证对外提供满足一 致性和可用性的服务。
(2) 定理
CAP 定理的内容是:对于分布式系统,网络环境相对是不可控的,出现网络分区是不可避免的,因此系统必须具备分区容错性。但系统不能同时保证一致性与可用性。即要么 CP, 要么 AP。
二、Eureka 简介
Eureka 是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务,主要用于定位运行在 AWS(Amazon Web Services,亚马逊网络服务,亚马逊云)域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix 中,实现 SpringCloud 的服务发现功能。
其实,Eureka 就是一个专门用于服务发现的服务器,一些服务注册到该服务器,而另一 些服务通过该服务器查找其所要调用执行的服务。可以充当服务发现服务器的组件很多,例 如 Zookeeper、Consul、Eureka 等。
三、Eureka 体系架构
四、Eureka 与 Zookeeper 对比
Eureka 与 Zookeeper 都可以充当服务中心,那么它们有什么区别呢?它们的区别主要体 现在对于 CAP 原则的支持的不同。
-
Eureka:AP
-
zk:CP
五、创建Eureka服务端
5.1 总步骤
-
添加 Eureka Server 依赖
-
在配置文件中配置 Eureka Server
-
在启动类上添加@EnableEurekaServer 注解,启动 Eureka Server 功能
5.2 详细步骤
1、创建一个 Spring Initializr 工程,命名为 eureka,仅导入 Eureka Server 依赖 即可
注意:若你使用的是 JDK6、7、8,那么这些依赖无需导入。而 JDK9 及其以上版本需要导入
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.2.11</version> <!-- 版本需要根据需要选取适合的 --></dependency><dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.2.11</version></dependency><dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version></dependency><dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version></dependency>
2、创建并配置 yml 文件
server: port: 8888spring: application: name: eureka-demoeureka: instance: hostname: localhost # 指定eureka主机 client: register-with-eureka: false # 指定是否向注册中心注册自己 fetch-registry: false # 指定此客户端是否能获取eureka注册信息 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 暴露eureka服务地址
3、在启动类上加入@EnableEurekaServer开启服务
六、创建提供者工程
6.1 总步骤
-
添加 Eureka Client 依赖
-
在配置文件中指定要注册的 Eureka Server 地址,指定自己微服务名称
-
启动类开启客户端功能
6.2 详细步骤
1、创建一个 Spring Initializr 工程,命名为provider-register,导入eureka client客户端依赖。
2、修改 yml 文件
server: port: 8080eureka: client: service-url: defaultZone: http://localhost:8888/eureka # 指定eureka服务地址 instance: instance-id: provider-register # 指定当前客户端注册中心名称spring: application: name: provider-register # 指定当前服务对外暴露的名称
3、启动类增加@EnableEurekaClient开启客户端功能
七、创建消费者工程
7.1 总步骤
-
添加 Eureka Client 依赖
-
在配置文件中指定要注册的 Eureka Server 地址,指定自己微服务名称
-
启动类开启客户端功能
7.2 详细步骤
1、创建一个 Spring Initializr 工程,命名为consumerr-register,导入eureka client客户端依赖。
2、修改 yml 文件
server: port: 8080eureka: client: service-url: defaultZone: http://localhost:8888/eureka # 指定eureka服务地址 instance: instance-id: consumer-register # 指定当前客户端注册中心名称spring: application: name: consumer-register # 指定当前服务对外暴露的名称
3、启动类增加@EnableEurekaClient开启客户端功能
4、修改处理器
5、修改BaseConfigure文件
八、服务发现discover
@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/discovery")public Object getDiscovery() { List<String> services = discoveryClient.getServices(); List<Map<String, Object>> result = new ArrayList<>(); services.forEach(service -> { Map<String, Object> map = new HashMap<>(); for (ServiceInstance instance : discoveryClient.getInstances(service)) { String serviceId = instance.getServiceId(); URI uri = instance.getUri(); String host = instance.getHost(); int port = instance.getPort(); Map<String, String> metadata = instance.getMetadata(); String scheme = instance.getScheme(); map.put("serviceId", serviceId); map.put("uri", uri); map.put("host", host); map.put("port", port); map.put("metadata", metadata); map.put("scheme", scheme); } result.add(map); }); return result;}
九、eureka自我保护机制
在 Eureka 服务页面中看到如下红色字体内容,表示当前 EurekaServer 启动了自我保护机制,进入了自我保护模式。
紧急情况!当微服务主机联系不上时,Eureka 不能够正确判断它们是否处于 up 状 态。当更新(指收到的微服务主机的心跳)小于阈值时,为了安全,微服务主机将不再失效
默认情况下,EurekaServer 在 90 秒内没有检测到服务列表中的某微服务,则会自动将该微服务从服务列表中删除。但很多情况下并不是该微服务节点(主机)出了问题,而是由于网络抖动等原因使该微服务无法被 EurekaServer 发现,即无法检测到该微服务主机的心跳。 若在短暂时间内网络恢复正常,但由于 EurekaServer 的服务列表中已经没有该微服务,所以该微服务已经无法提供服务了。
在短时间内若 EurekaServer 丢失较多微服务,即 EurekaServer 收到的心跳数量小于阈值, 为了保证系统的可用性(AP),给那些由于网络抖动而被认为宕机的客户端“重新复活”的 机会,Eureka 会自动进入自我保护模式:服务列表只可读取、写入,不可执行删除操作。当 EurekaServer 收到的心跳数量恢复到阈值以上时,其会自动退出 Self Preservation 模式。
默认值修改
# server: renewal-percent-threshold: 0.75 # 设置自我保护阈值 enable-self-preservation: false # 关闭自我保护机制
注:不提倡关闭自我保护机制
十、服务离线
服务离线,即某服务不能对外提供服务了。服务离线的原因有两种:服务下架与服务下线。这两种方案都是基于 Actuator 监控器实现的。
-
服务下架:将注册到 Eureka Server 中的 Eureka Client 从 Server 的注册表中移除,这样其 实 Client 就无法发现该 Client 了。
-
服务下线:Client并没有从Eureka Server的注册表中移除(其它Client仍可发现该服务), 而是通过修改服务的状态来到达其它 Client 无法调用的目的
10.1 准备工作
为 Eureka Client 添加 actuator 依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>
10.2 服务下线
10.2.1 修改配置文件
management: # 开启所有监控终端 endpoints: web: exposure: include: "*" # 开启shutdown监控终端 endpoint: shutdown: enabled: true
10.2.2 测试
十一、服务平滑上下线
前面的“服务下架”方式存在一个不足是,若还需要再启用该服务,则必须再次启动该 应用。我们也可以通过修改服务的状态为 UP 或 DOWN 来设置提供者是否可用,而无需重启 应用。这种方式通常称为服务的平滑上下线。
11.1 修改配置文件
11.2 测试
下线:
上线:
十二、eureka 集群
1、创建两个eureka服务,端口为7777、8888
2、设置配置增加集群配置
3、修改生产者跟消费者配置信息
4、启动服务后,查看3台eureka集群是否搭建成功