Springcloud-Eureka注册服务中心搭建及高可用集群搭建

什么是Eureka

Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。java

功能:

服务注册与发现,各个微服务启动时,会经过 Eureka Client 向 Eureka Server 注册本身的服务,也能够从Eureka Server 中获取服务,每一个微服务的服务提供端和服务调用端,都会注册到 Eureka Server,这就衍生出了微服务相互识别的话题web

它主要包括两个组件:Eureka Server 和 Eureka Client 且由三端构成
1.Eureka Server 服务注册与发现中心端
2.Service Provider服务提供者端
3.Service Consumer服务调用者端
提供者和调用者均属Eureka Client
Eureka Client:一个Java客户端,用于简化与 Eureka Server 的交互(一般就是微服务中的客户端和服务端)
Eureka Server:提供服务注册和发现的能力(一般就是微服务中的注册中心)spring

同步:每一个 Eureka Server 同时也是 Eureka Client(逻辑上的)
   多个 Eureka Server 之间经过复制的方式完成服务注册表的同步,造成 Eureka 的高可用
识别:Eureka Client 会缓存 Eureka Server 中的信息
   即便全部 Eureka Server 节点都宕掉,服务消费者仍可以使用缓存中的信息找到服务提供者(笔者已亲测)
续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息(相似于heartbeat)
续期:Eureka Server 会按期(默认60s)执行一次失效服务检测功能
   它会检查超过必定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点浏览器

单个Eureka Server大搭建实例

首先建立一个springcloud项目工程 添加以下
pom.xml缓存

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

    <dependencies>
  <!-- spring cloud 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-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    
    <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>

启动类:

@SpringBootApplication
//建立服务注册中心
@EnableEurekaServer
public class CloudServer1Application {

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

}

application.yml架构

#server
server:
  port: 8001
  # 应用名称
spring:
  application:
    name: springcloud-eureka-service1

 #eureka
eureka:
  #指定环境
  environment: work
  instance:
    #eureka的主机
    hostname: server1
  # 设置是否将本身做为客户端注册到注册中心(缺省true)
  # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 设置是否从注册中心获取注册信息(缺省true)
    # 由于这是一个单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false
    fetch-registry: false
    #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/
    #访问监控中心地址栏输入http://localhost:8881
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  #是否开启自我保护模式,默认为true。
#server
  server:
    enable-self-preservation: false
    #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
    eviction-interval-timer-in-ms: 40000

上面提到serviceUrl,那就顺便说下 defaultZone
Eureka 有一个 Region 和 Zone 的概念,你能够理解为现实中的大区(Region)和机房(Zone)
Eureka Client 在启动时须要指定 Zone,它会优先请求本身 Zone的 Eureka Server 获取注册列表
一样的,Eureka Server 在启动时也须要指定 Zone,若是没有指定的话,其会默认使用defaultZone
defaultZone就是默认IP+端口并发

此处的${eureka.instance.hostname}须要做在hosts文件中做地址映射
进入C:\Windows\System32\drivers\etc目录下以管理员身份打开 在末尾行添加
127.0.0.1 server1 或
非localhost server1app

运行启动类,浏览器地址栏输入serviceUrl填写的Zone便可访问监控界面
在这里插入图片描述负载均衡

Eureka Client搭建部署

Eureka server最少有一个做为client的注册发现中心 Eureka Client可多个同时向一个Eureka server注册
pom.xmlide

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

    <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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <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>

启动类

@SpringBootApplication
//建立服务客户端
@EnableEurekaClient
public class CloudClient1Application {
    public static void main(String[] args) {
        SpringApplication.run(CloudClient1Application.class, args);
    }
}

application.xml

#应用名称
spring:
  application:
    name: springcloud-eureka-client1
#server 端口
server:
  port: 8011
#eureka
eureka:
#服务注册发现地址 此处需填写注册中心的地址
  client:
    serviceUrl.defaultZone: http://server1:8001/eureka/
  instance:
    #eureka的主机
    hostname: client1
    #服务实体向eureka的注册名
    instance-id: ${spring.application.name}:${server.port}
  # 设置微服务调用地址为IP优先(缺省为false)
    prefer-ip-address: true
  # 心跳时间,即服务续约间隔时间(缺省为30s)微服务会周期性地向 Eureka Server 发送心跳以Renew(续约)信息(相似于heartbeat)
    lease-renewal-interval-in-seconds: 30
  # 发呆时间,即服务续约到期时间(缺省为90s) 超过这个时间没有Renew的微服务,发现则会注销该微服务节点
    lease-expiration-duration-in-seconds: 90

启动client服务后 打开Eureka Server监控中心可看到 该Eureka Client已被注册
在这里插入图片描述

Eureka Server注册中心(高可用)集群部署

Eureka Server 支持运行多实例,并以互相注册的方式(即伙伴机制),来实现高可用的部署
即每一台 Eureka 都在配置中指定另外一个 Eureka 或多个地址做为伙伴,它在启动时会向伙伴节点获取注册列表
注册中心做为微服务架构中的核心功能,其重要性不言而喻。因此单机版的Eureka Server在可靠性上并不符合如今的互联网开发环境。
集群版的Eureka Server才是商业开发中的选择。

Eureka Server注册中心的集群和Dubbo的ZooKeeper注册中心集群在结构上有很大的不一样:
ZooKeeper注册中心集群搭建后,集群中各节点呈现主从关系,集群中只有主节点对外提供服务的注册和发现功能,从节点至关于备份节点,
只有主节点宕机时,从节点会选举出一个新的主节点,继续提供服务的注册和发现功能。

而Eureka Server注册中心集群中每一个节点都是平等的,集群中的全部节点同时对外提供服务的发现和注册等功能。同时集群中每一个
Eureka Server节点又是一个微服务,也就是说,每一个节点均可以在集群中的其余节点上注册当前服务。又由于每一个节点都是注册中心,
因此节点之间又能够相互注册当前节点中已注册的服务,并发现其余节点中已注册的服务

搭建方式有两种:

一、集群版Eureka Server能够经过Spring Boot多环境配置方式快速搭建。只要建立一个合适的Eureka Server工程,经过多个全局配置便可完成快速搭建,
工程打包成jar包后启动时指定配置文件便可完成不一样配置方案的启动。
二、分别在主工程中建立多个Eureka Server工程 分别在其中的YML或Properties文件中配置集群信息,以后分别启动便可

集群搭建步骤: 此处搭建三个Eureka Server注册中心

pom.xml和启动类于单机配置同样
application.yml配置A

#server
server:
  port: 8001
  # 应用名称
spring:
  application:
    name: springcloud-eureka-service1

 #eureka
eureka:
  #指定环境
  environment: work
  instance:
    #eureka的主机
    hostname: server1
  # 设置是否将本身做为客户端注册到注册中心(缺省true)
  # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 设置是否从注册中心获取注册信息(缺省true)
    # 单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false
    fetch-registry: true
    #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/
    # 单节点写法 http://${eureka.instance.hostname}:${server.port}/eureka/
    serviceUrl.defaultZone: http://server2:8002/eureka/,http://server3:8003/eureka/
  #是否开启自我保护模式,默认为true。


#server
  server:
    enable-self-preservation: false
    #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
    eviction-interval-timer-in-ms: 40000

application.yml配置B

#server
server:
  port: 8002
  # 应用名称
spring:
  application:
    name: springcloud-eureka-service2

  #eureka
eureka:
  #指定环境
  environment: work
  instance:
    #eureka的主机
    hostname: server2
  # 设置是否将本身做为客户端注册到注册中心(缺省true)
  # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 设置是否从注册中心获取注册信息(缺省true)
    # 单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false
    fetch-registry: true
    #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/
    # 单节点写法 http://${eureka.instance.hostname}:${server.port}/eureka/
    serviceUrl.defaultZone: http://server1:8001/eureka/,http://server3:8003/eureka/
  #是否开启自我保护模式,默认为true。
  # server
  server:
    enable-self-preservation: false
    #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
    eviction-interval-timer-in-ms: 40000

application.yml配置C

#server
server:
  port: 8003
  # 应用名称
spring:
  application:
    name: springcloud-eureka-service3

  #eureka
eureka:
  #指定环境
  environment: work
  instance:
    #eureka的主机
    hostname: server3
  # 设置是否将本身做为客户端注册到注册中心(缺省true)
  # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 设置是否从注册中心获取注册信息(缺省true)
    # 单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false
    fetch-registry: true
    #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/
    # 单节点写法 http://${eureka.instance.hostname}:${server.port}/eureka/
    serviceUrl.defaultZone: http://server2:8002/eureka/,http://server1:8001/eureka/
  #是否开启自我保护模式,默认为true。
  # server
  server:
    enable-self-preservation: false
    #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
    eviction-interval-timer-in-ms: 40000

分别启动三个Eureka Server后可看到任意一个Server的监控中心能够看到另外两个server节点
访问地址:http://server1:8001/、http://server2:8002/、http://server3:8003/
在这里插入图片描述
以后再启动Eureka Client就能够看到 监控中心出现了client服务注册信息
在这里插入图片描述