简介

Eureka是Netflix服务发现的服务端与客户端,Eureka提供服务注册以及服务发现的能力,当是Eureka Server时(注册中心),所有的客户端会向其注册,当是Eureka Client时,可以从注册中心获取对应的服务信息,或者是向Eureka Server将自己作为实例注册进去,每个Eureka不仅仅是一个服务端同时还是一个客户端。

注册中心

当Eureka想要成为注册中心时,必须将注册中心的服务地址指向自己,同时禁用服务检索的功能。Eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳来检测服务的可用性,注册中心不处理请求的转发,只是记录每个实例注册进来的信息。

创建注册中心
  1. 引入依赖:
   <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
  1. 开启注册中心注解:
/**
 * @EnableEurekaServer 启动注册中心
 */
@EnableEurekaServer
@SpringBootApplication
public class EurekaRegisterMasterApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaRegisterMasterApplication.class, args);
    }
}
  1. 配置文件:
    application.yml
#服务端口
server:
  port: 8880

eureka:
  instance:
    hostname: register-master
  client:
    #通过设置fetch-registry与register-with-eureka 表明自己是一个eureka服务
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: register-center
  • fetch-registry: 检索服务选项,当设置为True(默认值)时,会进行服务检索,注册中心不负责检索服务。
  • register-with-eureka: 服务注册中心也会将自己作为客户端来尝试注册自己,为true(默认)时自动生效
  • eureka.client.serviceUrl.defaultZone是一个默认的注册中心地址。配置该选项后,可以在服务中心进行注册。

所以一般情况下,当我们设置服务为注册中心时,需要关闭eureka.client.fetch-registryeureka.client.register-with-eureka,在做注册中心集群的时候,register-with-eureka必须打开,因为需要进行相互注册,不然副本无法可用。

服务发现

Eureka如果不做注册中心时,它就是一个客户端,向注册中心提供注册的实例,每一个实例注册之后需要向注册中心发送心跳来检测服务的可用性,当需要调用服务的时候,它们会自己从注册中心去检索对应的服务信息,为了保证高性能,Eureka并不是每次都会去注册中心查询服务,Eureka Client注册到Eureka Server时,彼此会进行数据同步,也就是说Eureka Client会缓存一份Eureka Server中的服务列表信息,当本地服务不可用的时候才会去注册中心获取,这样可以较低服务端的请求压力,也提升了服务调用的时间。

  1. 引入依赖
  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

  1. 开启服务发现
@EnableEurekaClient
@SpringBootApplication
public class ConfigServerApplication {

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

@EnableEurekaClient@EnableDiscoveryClient的区别:

  • @EnableDiscoveryClient注解是基于spring-cloud-commons依赖,相当于一个公共的服务发现;
  • @EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用;
  1. 配置文件
    application.yml
server:
  port: 8881

spring:
  application:
    name: eureka-client

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

注册中心集群化

为了提供高可用性,说白了就是保证机器挂了还是可以服务注册的能力,一般都不会将注册中心部署到一台机器上,而是采取多台机器部署,集群化管理。
注册中心的集群化,最简单的做法就是,将注册中心相互注册,但是不开启检索服务的能力(fetch-registry: false),这也是Eureka的特性使得的,因为Eureka天然就是集服务端与客户端为一体的。

下面将采取单机部署多注册中心的模式:

三台注册中心分别为:register-master:8080 register-salve1:8081 register-salve2:8082

整个应用名称为:register-center

修改配置文件
  • master:
#服务端口
server:
  port: 8880

eureka:
  instance:
    hostname: register-master
  client:
    #通过设置fetch-registry与register-with-eureka 表明自己是一个eureka服务
    fetch-registry: false
#    register-with-eureka: false
    #注册register-salve1,register-salve2做注册中心集群
    service-url:
      defaultZone: http://register-salve1:8881/eureka/,http://register-salve2:8882/eureka/

spring:
  application:
    name: register-center

  • salve1:

#服务端口
server:
  port: 8881

eureka:
  instance:
    hostname: register-salve1
  client:
    #通过设置fetch-registry与register-with-eureka 表明自己是一个eureka服务

#    #由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
    fetch-registry: false
#    #默认设置下,服务注册中心也会将自己作为客户端来尝试注册自己,这里禁用它的客户端注册行为
#    register-with-eureka: false
    #注册register-salve1,register-salve2做注册中心集群
    service-url:
      defaultZone: http://register-master:8880/eureka/,http://register-salve2:8882/eureka/

spring:
  application:
    name: register-center
  • salve2:

#服务端口
server:
  port: 8882

eureka:
  instance:
    hostname: register-salve2
  client:
    #通过设置fetch-registry与register-with-eureka 表明自己是一个eureka服务
    fetch-registry: false
#    register-with-eureka: false
    #注册register-salve1,register-salve2做注册中心集群
    service-url:
      defaultZone: http://register-master:8880/eureka/,http://register-salve1:8881/eureka/

spring:
  application:
    name: register-center

注意:

由于单机模拟,所以我们需要修改hosts文件,添加对应的映射:
127.0.0.1 register-master
127.0.0.1 register-salve1
127.0.0.1 register-salve2

现在随便注册一个服务到其中一个注册中心,三个注册中心都可以查看到。
Master:
在这里插入图片描述
Salve1:
在这里插入图片描述
Salve2:
在这里插入图片描述

可以查看到注册中心的副本:两个可用
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐