服务注册之Eureka

一、Eureka

1.1 Eureka介绍

Eureka 的音译为 尤里卡,它是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务,主要用于运行在 AWS 域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud 将它集成在其子项目spring-cloud-netflix 中,以实现 SpringCloud的服务发现功能。

1.2 Eureka 组件

Eureka 包含两个组件:

  • Eureka Server
  • Eureka Client

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

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

在应用启动后,将会向 Eureka Server 发送心跳,默认周期为30秒,如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server 之间通过复制的方式完成数据的同步,Eureka 还提供了客户端缓存机制,即使所有的 Eureka Server 都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。

1.3 Eureka 工作流程

1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务

3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常

4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例

5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端

6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式

7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地

8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存

9、Eureka Client 获取到目标服务器信息,发起服务调用

10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

二、Eureka应用

2.1 创建 Eureka Server 模块

  1. 新建 Eureka Server 模块,添加 Eureka Server 依赖
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
    
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
    
<dependencies>
    <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-test</artifactId>
        <scope>test</scope>
    </dependency>		
</dependencies>		    
  1. 在配置文件 resources/application. yml 中添加 EurekaServer 相关配置
# 指定运行端口
server:
  port: 9000      
spring:
  application:
	# 指定服务名称
    name: eureka-server
eureka:
  instance:
    # 指定主机地址
    hostname: localhost
  client:
    # 指定是否从注册中心获取服务(注册中心不需要开启)
    fetch-registry: false
    # 指定是否将自身注册到注册中心(注册中心不需要开启)
    register-with-eureka: false
  1. 在启动类上添加 @EnableEurekaServer 注解来启用 Euerka 注册中心功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}
  1. 启动项目,访问 http://localhost:9000 ,可以看到 Eureka 注册中心界面:

2.2 创建 Eureka Client 模块

  1. 新建 Eureka Client 模块,添加 Eureka Client 依赖
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
    
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
    
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>		
</dependencies>	
  1. 在配置文件 resources/application. yml 中添加 EurekaClient 相关配置
spring:
  application:
	# 指定服务名称
    name: eureka-client
eureka:
  client:
    # 注册到 Eureka 的注册中心
    register-with-eureka: true
    # 获取注册实例列表
    fetch-registry: true
    service-url:
      # EurekaServer 地址
      defaultZone: http://localhost:9000/eureka
  1. 在启动类上添加 @EnableDiscoveryClient@EnableEurekaClient 注解来启用 Euerka 注册中心功能
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

}
  • @EnableEurekaClient 是基于 spring-cloud-netflix 依赖,只能用于 eureka

  • @EnableDiscoveryClient 是基于 spring-cloud-commons 依赖,可以用于多个不同注册服务组件,推荐使用。

  1. 启动项目,访问 http://localhost:9000 ,查看是否服务是否注册成功:

注:如果 eureka-service 没有先启动的话,eureka-client 项目将会抛出 ClientHandlerException 异常。

三、Eureka集群

为了让注册中心可以实现高可用,必然要使用集群模式,让我们来构建下 Eureka集群。

3.1 eureka集群原理

服务启动后向 Eureka 注册,Eureka Server 会将注册信息向其他 Eureka Server 进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

3.2 EurekaService 集群配置

  1. host 文件中配置域名IP对应关系(这里为了模拟集群存放在两台机器上)

windows 系统以管理员身份编辑 C:\Windows\System32\drivers\etc 文件:

127.0.0.1 replica1
127.0.0.1 replica2
  1. eureka-service 模块下新建 application-replica01.yml 配置文件,内容如下:
server:
  # 指定运行端口
  port: 9001
spring:
  application:
	# 指定服务名称
    name: eureka-server
eureka:
  instance:
    # 指定主机地址
    hostname: replica1
  client:
    # 指定是否从注册中心获取服务(注册中心不需要开启)
    fetch-registry: false
    # 指定是否将自身注册到注册中心(注册中心不需要开启)
    register-with-eureka: false
    service-url:
      # 注册到另一个 Eureka 注册中心
      defaultZone: http://replica2:9002/eureka
  server:
    # 关闭自我保护机制
    enable-self-preservation: false
  1. eureka-service 项目中新建 application-replica02.yml 配置文件,内容如下:
server:
  # 指定运行端口
  port: 9002
spring:
  application:
	# 指定服务名称
    name: eureka-server
eureka:
  instance:
    # 指定主机地址
    hostname: replica2
  client:
    # 指定是否从注册中心获取服务(注册中心不需要开启)
    fetch-registry: false
    # 指定是否将自身注册到注册中心(注册中心不需要开启)
    register-with-eureka: false
    service-url:
      # 注册到另一个 Eureka 注册中心
      defaultZone: http://replica1:9001/eureka
  server:
    # 关闭自我保护机制
    enable-self-preservation: false
  1. 指定配置文件的形式分别运行两个 eureka-service

  1. 分别访问 http://localhost:9001http://localhost:9002**

可以看到两个 eureka-server 互相注册。

3.3 修改 Eureka-client 配置,使其使用集群模式

只需要在 eureka.client.service-url.defaultZone 属性中配置多个 EurekaService 地址即可:

eureka:
  client:
	......
    service-url:
      # 同时注册到两个注册中心
      defaultZone: http://replica1:9002/eureka,http://replica2:9001/eureka
posted @ 2020-05-26 10:15  MarkLogZhu  阅读(353)  评论(0编辑  收藏  举报