发布时间: 阅读量

springcloud-eureka

eureka 特性

前言,eureka作为微服务的核心组件,其功能之强大,今天来领略一番


理论

1.为什么会出现注册中心
假设两个微服务实例商品和订单,商品服务需要调用订单服务的某个REST接口。假如某一天订单服务迁移到了另外一台服务器,IP和端口也发生了变化,这时候我们不得不去修改商品服务中调用订单服务REST接口的静态配置。随着公司业务的发展,微服务的数量也越来越多,服务间的关系可能变得非常复杂,传统的微服务维护变得愈加困难,也很容易出错。这时候就出现了服务治理,所谓服务治理就是用来实现各个微服务实例的自动化注册与发现,在这种模式下,服务间的调用不再通过指定具体的实例地址来实现,而是通过向服务注册中心获取服务名并发起请求调用实现。

2.eureka
Eureka是由Netflix开发的一款服务治理开源框架,Spring-cloud对其进行了集成。Eureka既包含了服务端也包含了客户端,Eureka服务端是一个服务注册中心(Eureka Server),提供服务的注册和发现,即当前有哪些服务注册进来可供使用;Eureka客户端为服务提供者(Server Provider),它将自己提供的服务注册到Eureka服务端,并周期性地发送心跳来更新它的服务租约,同时也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。这样服务消费者(Server Consumer)便可以从服务注册中心获取服务名称,并消费服务。

69602661

首先eureka分为客户端和服务端,服务端位注册和发现服务中心,客户端分为服务提供着和服务消费者!拿电商业务来说商品服务为服务提供者,提供pc,或移动调用,订单服务为服务消费者也为服务提供者,作为服务消费者,他调用库存服务!

3.eureka客户端机制

1.服务注册

服务提供者在启动的时候会通过REST请求的方式将自己注册到Eureka Server上,同时带上自身服务的一些元数据信息。Eureka Server接收到这个Rest请求之后,将元数据信息存储在一个双层结构的Map中,其中第一层的key是服务名。第二层的key 是具体服务的实例名。

2.获取服务

消费者服务启动时,会发送一个Rest请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,Eureka Server会维护一份只读的服务注册清单来返回给客户端,同时该缓存清单默认会每隔30秒更新一次。
下面是获取服务的两个重要的属性:

(1)eureka.client.fetch-registry

是否需要去检索寻找服务,默认是true

(2)eureka.client.registry-fetch-interval-seconds

表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒

3.服务续约

在注册完服务之后,服务提供者会维护一个心跳用来持续告诉EurekaServer: "我还活着”, 以防止Eureka Server 的“ 剔除任务” 将该服务实例从服务列表中排除出去, 我们称该操作为服务续约(Renew)。默认30秒发送一次心跳!

4.服务调用

服务消费者在获取服务清单后,通过服务名可以获取具体提供服务的实例名和该实例的元数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡

4.eureka服务端的机制

1.失效剔除

有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出、网络故障等原因使服务不能正常运作。而服务注册中心并未收到“服务下线”的请求,为了从服务列表中将这些无法提供服务的实例剔除,Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去

2.自我保护

服务注册到Eureka Server后,会维护一个心跳连接,告诉Eureka Server自己还活着。Eureka Server在运行期间会统计心跳失败的比例在15分钟以之内是否低于85%,如果出现低于的情况,Eureka Server会将当前实例注册信息保护起来,让这些实例不会过期。这样做会使客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况。因此客户端要有容错机制,比如请求重试、断路器。
自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而让Eureka集群更加的健壮、稳定
以下是自我保护相关的属性:
eureka.server.enableSelfPreservation=true. 可以设置改参数值为false,以确保注册中心将不可用的实例删除

3.服务下线

在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭操作时,会触发一个服务下线的Rest服务请求给Eureka Server,告诉服务注册中心:“我要下线了。”服务端在接收到该请求后,将该服务状态置位下线(DOWN),并把该下线事件传播出去。

eureka集群数据同步
当节点开始接受客户端请求时,所有的操作都会进行节点间复制,eureka集群的节点时对等的,保证了他的高可用性


实操

1.创建基础的boot工程,勾选eureka server 依赖

tian-jia-eureka-sever

或者在pom文件中添加

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

2.在配置文件中添加配置信息,这边用的是yml

server:
  port: 9000

# 最佳实践:springcloud应用都要指定application.name
spring:
  application:
    name: springcloud-eureka-server

#  在默认情况下erureka server也是一个eureka client ,必须要指定一个 server
eureka:
  instance:
    hostname: localhost
  client:
    #   registerWithEureka和fetchRegistry=false 表明自己是一个eureka server.
    registerWithEureka: false
    #表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.在启动类中添加注解@EnableEurekaServer
eureka

4.启动应用,访问http://localhost:9000/
eurekasuccess

至此一个单机的Eureka服务端就搭建完毕了。是不是很简单,基本就几行代码。从上图也可以看出,目前还没有服务注册上去,所以应用列表是空的。接下来,创建个客户端同时注册到此注册中心下。

下面创建一个订单服务,之后所有的服务都是eureka客户端
1.创建基础的boot工程,勾选 eureka discover client 以及web依赖(用于接口调式)

eurekaclient

或者在pom文件中添加

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

2.在配置文件中添加配置信息

    server:
  port: 9003

spring:
  application:
    name: order-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:9000/eureka/

3.在启动类中添加注解@EnableDiscoveryClient(此注解适用于各种注册中心,如consul,zookeeper)

client

4.启动orderService,再次访问http://localhost:9000/

clientsuccess

至此,一个完整的eureka服务端和客户端就搭建完毕
1.接下来我们创建一个请求测试一下订单服务是否可用,创建DemoController

democontroller

2.启动服务,访问http://localhost:9003/hello

demosuccess

至此订单服务可正常使用

protect

eureka有一个自我保护的机制,上面也有说到,eureka默认是开启的,开发阶段可以关闭这个机制
开发阶段可以通过配置:eureka.server.enable-self-preservation=false关闭自我保护模式。

eureka作为微服务重要的一部分,那么一旦它挂了,那么整个系统也就凉了,所以对于注册中心的高可用必不可少,下面来搭一个一台机器上的eureka集群,当然实际当中,eureka集群是部署在不同的服务器上


后语,eureka也是我们在用的,对于每一个组件的理解以及他的机制特点的掌握至关重要!感谢那么多开源博客,博主们的无私奉献!