服务注册中心之Eureka使用

一、Eureka基础

  Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。在Eureka Client应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

  Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

  服务治理产生的原因?

   传统的rpc远程调用框架中,要进行每个服务之间的依赖管理是比较复杂的,所以需要服务治理来管理服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务的发现与注册。springCloud封装了Netflix公司的Eureka模块来实现服务治理。

  什么是服务注册与发现?

   Eureka采用了cs客户-服务设计模式,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他服务,则使用Eureka的客户端连接到Eureka Server并维持心跳。这样系统的维护人员就可以通过Eureka Server来监控系统中各个服务模块的运行状况。当服务启动的时候会把自己的服务器信息注册到Eureka Server注册中心,这就是服务注册。当调用方用服务别名去获取和查找服务信息这就是服务发现。注册中心拥有管理服务之间依赖关系的能力,这就是服务治理的概念。在任何rpc远程调用框架中,都会有一个注册中心用于存放微服务模块相关的地址信息(服务在注册中心是以键值对形式存在的,key为服务名,value为调用地址),当服务调用者需要调用某个服务时,就用该服务的别名去注册中心查找,获取对应的调用地址(获取后可能会缓存该地址,会根据配置定时更新地址),获得调用地址后底层利用httpclient技术实现远程调用。

  Eureka的架构模式:Eureka服务注册中心可以有多个形成集群,服务提供者也可以有多个形成集群,而消费者可以只有一个,他们的架构关系如下图。

、单机Eureka-Server注册中心构建

  按照Maven项目模块的创建方式,依次进行建立模块、修改POM、编写yml配置文件、编写主启动类的顺序完成服务模块的编写。编写完成启动该模块后访问ip+port即可显示一个服务监控界面,如下图。

  编写主启动类时,在启动类上加入@EnableEurekaServer注解,以表示该模块是服务注册中心。

  编写POM时,引入Eureka-server包和图形监控包,如下所示:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupid>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

  编写yml文件时,在resources文件夹下创建application.yml文件,并写入如下代码:

server:
port:8765
eureka:
  client:
    register-with-eureka: false   #false表示不向服务注册中心注册自己
    fetch-registry: false #false表示自己就是注册中心,不需要去检索服务
    service-url:   #与Eureka-server交互的地址查询服务和注册服务,都需要使用这个地址
      default-zone: http://eurekaServer:8765/eureka/eureka
  instance:
    hostname: main-service  #eureka服务端的实例名称

 

三、Eureka将服务模块注册到注册中心成为服务提供者

  同样按照Maven项目模块的创建方式,依次进行建立模块、修改POM、编写yml配置文件、编写主启动类的顺序完成服务模块的编写。

  编写主启动类时,在启动类上加入@EnableEurekaClient注解,以表示该模块是服务提供者。

  编写POM时,引入Eureka-client包,如下所示:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

  编写yml文件时,在resources文件夹下创建application.yml文件,并写入如下代码server:

   port:8088
spring:
 application:
  name:service-name  #表示服务模块的名称,当服务注册到注册中心后,可以在监控界面显示该名称,以定位该服务。
eureka:
  client:
    register-with-eureka: true   #true表示向服务注册中心注册自己
    fetch-registry: true #true表示检索服务,单节点可以不设置,集群节点必须设置为true才能配合ribbon使用负载均衡
    service-url:   #这是服务注册中心地址,表示该服务要注册到哪一个注册中心
      default-zone: http://eurekaServer:8765/eureka/eureka
  instance:
    instance-id:servicename   #服务名称
   prefer-ip-address:true    #访问路径显示ip地址
    lease-renewal-interva1-in-seconds: 20    #EurekaClient向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 60   #EurekaServer在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务

 

  当该服务启动后,可以在注册中心监控界面查看到该服务的信息,如图所示:

、Eureka注册中心负载均衡集群理论

  1.注册中心集群:多个注册中心相互注册,形成相互守望,对外暴露出这些注册中心地址,使用负载均衡服务来访问这些地址。

  2.服务提供者集群:注册中心可以集群,服务提供者也可以集群,实现服务提供者集群需完成以下两件事情:

    a.当服务提供者集群以后,就不能使用端口的形势(http://ip:port)来调用服务提供者,调用消费者需使用微服务名称来调用提供者(http://cloud-servername),原因是集群状态下服务提供者端口不止一个。

    b.消费者通过微服务名称来调用提供者时,因为集群会有多个相同的微服务名称,会出现调用不明确的情况而报错,因此需要赋予RestTemplate负载均衡能力,具体实现是在消费者的ApplicationContextConfig配置文件的getRestTemplet()下增加@LoadBalanced注解。(RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。)

  3.服务模块需要同时注册到每个集群的注册中心:其注册方式为在yml配置文件中的defaultzone下使用","逗号来分割这些注册中心地址。

 五、服务发现Discovery

  微服务自身要向外提供服务功能,就需要向外部提供微服务的信息,服务本身可以向外暴露一个discovery()方法,消费者可以通过调用该方法获得服务的说明信息。在eureka组件中,通过DiscoveryClient类来实现,该类可以获取已经在注册中心注册成功的所有微服务的信息。微服务要向外提供信息,需要在主启动类上增加@EnableDiscoveryClient注解,同时需要给DiscoveryClient类增加注解@resource注解。

  

 六、Eureka的自我保护机制

  保护模式主要用于一组客户端和EurekaServer之间存在网络分区时的保护,EurekaServer将尝试保护其注册表中的信息,不再删除服务注册表中的数据,也不会注销任何微服务。如果在EurekaServer首页看到如下提示,则表示进入了保护模式。

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE。

  通俗的说,就是指某一时刻某一个微服务不可用了,Eureka不会立即清理,依旧会对该服务的信息进行保存。这是CAP理论中的AP理论。为什么会产生自我保护机制?这是为了防止Eureka可以正常运行,但与EurekaServer之间网络不通时造成误删。

  什么是自我保护模式?默认情况下,如果EurekaServer在一定时间内没有收到某服务的心跳,EurekaServer会将其注销(默认90秒),但是当EurekaServer与服务模块之间网络存在延时、卡顿、拥挤时,他们之间无法正常发送心跳,此时微服务本身是健康的,不应该被注销。Eureka就通过"自我保护模式"来解决,自我保护模式的思想是当检测到短时间内偶尔没有收到心跳时(可能发生了网络分区故障),不会立即删除微服务。

  如何禁止自我保护?在EurekaServer的application.yml配置文件中server节点下增加如下配置:

server:               
     enable-self-preservation: false  #关闭自我保护机制
     eviction-interval-timer-in-ms: 2000  #心跳间隔时间

  关闭自我保护模式后,刷新注册中心页面主页,则会出现THE SELF PRESERVATION MODE IS TURNED FFNCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.提示。

  七、Eureka停止更新的说明

  Netflix官网公告了Eureka已经停止更新,进入维护模式,除非已经在项目中使用该组件,新项目建议使用其他替代组件,比如Zookeeper、Consul、Nacos等。

 

 

 

 

 

  

posted @ 2021-10-11 14:55  我若安好,便是晴天  阅读(823)  评论(0编辑  收藏  举报