微服务注册中心 Eureka 介绍及基础使用

140 阅读6分钟

一、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: 8080​​eureka:  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: 8080​​eureka:  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集群是否搭建成功