Eureka服务注册与发现

一、基础知识

1、服务治理

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

2、服务注册与发现

​ Eureka 采用了 CS 的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接。这样系统的维护人员就可以通过 Erueka Server 来监控系统中各个微服务是否正常运行。

​ 在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息(如服务地址、通讯地址等)以别名方式注册到注册中心上。另一方(消费者、服务提供者)以该别名的方式去注册中心上获取到实际的服务通讯地址,然后在实现本地RPC调用。RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息)。Eureka 系统架构如下:

执行说明:

​ 1)、先启动 Eureka 注册中心;

​ 2)、启动服务提供者 ;

​ 3)、服务提供者启动后把自己的信息(如服务地址)以别名方式注入 Eureka;

​ 4)、消费者服务在需要调用接口时使用服务别名去注册中心获取实际的RPC调用地址;

​ 5)、消费者获得调用地址后,底层实际是使用的 HttpClient 技术实现远程调用;

​ 6)、消费者获得服务地址后会缓存在本地 jvm 内存中,默认每间隔30秒更新一次服务调用地址。

3、组件:Eureka Server 和 Eureka Client

  • Eureka Server 提供服务注册服务

    各个微服务结点通过配置启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面找那个直观看到。

  • Eureka Client 通过注册中心进行访问

    用于简化 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询负载算法的负载均衡器。在应用启动后,将会向 Eureka Server 发送心跳(默认周期为30秒)。如果 Eureka Server 在多个心跳周期内没有接收到某个结点的心跳, Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。

二、单机版服务搭建

1、Eureka Server 搭建

  • 创建一个maven项目在pom中添加一下内容

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 创建 application.yml 文件

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: localhost  #eureka服务端实例名称
      client:
        #false表示不向注册中心注册自己
        register-with-eureka: false
        #false表示自己端就是注册中心,自己职责是维护服务实例,不需要去检索服务
        fetch-registry: false
        service-url:
          #设置与eureka server 交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
    
  • 在主启动类上加注解 @EnableEurekaServer 开启服务

  • 启动项目,在浏览器看到如下界面边配置成功

2、Eureka Client 配置

  • 修改客户端的pom文件,引入依赖

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
  • 在application.yml中添加配置

    eureka:
      client:
        #是否从Eureka server 抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        #表示是否将自己注册进入Eureka server ,默认为true
        register-with-eureka: true
        service-url:
          defaultZone: http://localhost:7001/eureka
    
  • 在主启动类加注解 @EnableEurekaClient

  • 启动客户端,便可以看到 Eureka 注册有客户端,如下图

三、高可用集群搭建

1、集群概念

​ 单机版的 Eureka 只有一个服务,如果这个服务挂掉了那整个系统就挂了。Eureka 集群就是使用多个 Eureka Server服务之间相互注册,以实现高可用的目的。

2、Eureka Server 搭建步骤

  • 建立多个 Eureka Server服务模块(这里建立两个);

  • 在pom中分别引入依赖

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 配置第一个 Eureka 服务(eureka7001.com:7001)的 application.xml

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001.com  #eureka服务端实例名称
      client:
        #false表示不向注册中心注册自己
        register-with-eureka: false
        #false表示自己端就是注册中心,自己职责是维护服务实例,不需要去检索服务
        fetch-registry: false
        service-url:
          #设置与eureka server 交互的地址查询服务和注册服务都需要依赖这个地址
          #单机版地址设置自己,集群设置为其他 eureka server
          defaultZone: http://eureka7002.com:7002/eureka/
    
  • 配置第二个 Eureka 服务(eureka7002.com:7002)的 application.xml

    server:
      port: 7002
    
    eureka:
      instance:
        hostname: eureka7002.com  #eureka服务端实例名称
      client:
        #false表示不向注册中心注册自己
        register-with-eureka: false
        #false表示自己端就是注册中心,自己职责是维护服务实例,不需要去检索服务
        fetch-registry: false
        service-url:
          #设置与eureka server 交互的地址查询服务和注册服务都需要依赖这个地址
          #单机版地址设置自己,集群设置为其他 eureka server
          defaultZone: http://eureka7001.com:7001/eureka/
    
  • 启动服务,成功结果如下图显示

3、将服务提供者与消费者注册

​ 在 application.xml 中加入 Eureka 的配置,多个地址使用逗号隔开,如下:

eureka:
  client:
    #是否从Eureka server 抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    #表示是否将自己注册进入Eureka server ,默认为true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

4、服务提供者集群处理

​ 将多个服务提供者注册到 Eureka Server 中,,因为一个别名下可能对应着多个服务的地址。如下图:

所以在消费者端配置请求的地址为服务注册的别名如public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";,然后在配置类中添加注解 @LoadBalanced 开启负载均衡功能(默认使用轮询)。

四、其他配置完善

1、配置服务名称,不显示主机名称以及ip地址提示

在 application.xml 文件中添加以下配置信息:

instance:
    #配置服务名称,不显示主机名称
    instance-id: payment8002
    #ip地址提示
    prefer-ip-address: true

显示效果如下:

五、Eureka 自我保护模式

1、首页出现如下图所示文字,Eureka便进入到了自我保护模式:

​ 保护模式主要用于一组客户端和 Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式 ,Eureka Server 将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务,即某时刻某一个微服务不可用了,Eureka 不会立刻清理,依旧会对该微服务的信息进行保存。

2、原因

​ 为了保证 Eureka Client 与 Eureka Server 网络不通的情况下, Eureka Server 不会立刻将 Eureka Client 服务剔除。

3、描述

​ 默认情况下,如果 Eureka Server 在一定时间内没有接收到某个微服务实例的心跳, Eureka Server 将会注销该实例(默认时间为90秒)。但是当网络分区故障发生时,微服务与 Eureka Server 之间无法正常通信,以上行为可能变得非常危险——因为微服务本身是健康的,此时不应该注销这个微服务。Eureka 通过"自我保护模式"来解决这个问题——当 Eureka Server 节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。

4、禁止自我保护

​ 在 Eureka Server 的 application.xml 加上配置

server:
    #关闭自我保护模式,保证不可用服务可以被及时剔除
    enable-self-preservation: false

案例代码地址:https://github.com/xhanglog/springcloud-learning

posted @ 2020-03-20 23:04  xhanglog  阅读(370)  评论(0编辑  收藏  举报