SpringCloud(二)Eureka、集群环境配置、

1.Eureka

1.1 什么是Eureka

  • Netflix在设计Eureka时,遵循的就是AP原则
  • Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper;

1.2原理

Eureka的基本框架

  • SpringCloud封装了NetFlix公司开发的Eureka模块来实现服务注册和发现(对比Zookeeper)
  • Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心
  • 而系统中的其他微服务。使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,SpringCloud的一些其他模块(比如Zuul)就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑;
  • Eureka包含两个组件: Eureka Server和Eureka Client。
  • Eureka Server提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样Eureka Server中的服务注册表中将会村粗所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
  • Eureka Client是一个lava客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除掉(默认周期为90秒)。

Eureka的三角色

  • Eureka Server:提供服务的注册于发现。
  • Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到。
  • Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。

2.创建Eureka模块

2.1 创建一个module子模块springcloud-eureka-7001
2.2 编写application.yml配置文件

server:
  port: 7001

#Eureka配置
eureka:
  instance:
    hostname: localhost #Eureka服务端的实例名称
  client:
    register-with-eureka: false #表示是否向eureka注册中心注册自己
    fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
    service-url:
      defautZone: http://${eureka.instance.hostname}:${server.port}/eureka

2.3编写启动类

@SpringBootApplication
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来
public class EurekaServer_7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer_7001.class,args);
    }
}

测试访问7001端口之后得到如下页面
SpringCloud(二)Eureka、集群环境配置、

3.服务注册、信息配置及自我保护

3.1先在服务提供者8001里导入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>

3.2 在8001的application中添加下面的yml配置

##Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/

3.3 在8001启动类中添加一个注解@EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient//在服务启动后自动注册到Eureka中。
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class,args);
    }
}

之后重新启动我们的项目,先启动7001,再启动8001,此时输入localhost:7001可以得到下面的图。
SpringCloud(二)Eureka、集群环境配置、

3.4自我保护机制
一句话总结:某时刻某一个微服务不可以用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存!

  • 默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka之间无法正常通行,以上行为可能变得非常危险了–因为微服务本身其实是健康的,此时本不应该注销这个服务。Eureka通过自我保护机制来解决这个问题–当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该EurekaServer节点会自动退出自我保护模式。
  • 在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话:好死不如赖活着。
  • 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮和稳定。
  • 在SpringCloud中,可以使用eureka.server.enable-self-preservation = false禁用自我保护模式【不推荐关闭白我保护机制】。

2.集群环境配置

2.1 在之前的基础上,在写两个注册中心,7002,7003.
2.2将注册中心里的配置复制粘贴到7002、7003,修改端口;然后添加主启动类,也可以复制!
为了在自己电脑上模拟,我们可以添加域名映射:C\System32\drivers\etc\host里面修改域名映射如下:
SpringCloud(二)Eureka、集群环境配置、
2.3将每个注册中心的配置文件里的hostname修改为我们映射的文件!再关联另外两个端口!其余两个类似!

SpringCloud(二)Eureka、集群环境配置、
配置成功后,三个之间的关系如下
SpringCloud(二)Eureka、集群环境配置、

此时,假如7001突然崩溃,7001会告诉请求去其他的端口访问!

2.4将8001里的Eureka配置修改,使其注册到三个注册中心
SpringCloud(二)Eureka、集群环境配置、

启动测试,先启动三个注册中心,再启动提供者8001.

假设此时访问7003,会出现下图所示。同样的访问其他的两个注册中心也会出现类似的!
SpringCloud(二)Eureka、集群环境配置、
同时三个集群里面都会包含我们的提供者8001
SpringCloud(二)Eureka、集群环境配置、
这样一来,某一个注册中心突然失效或者崩溃我们都可以通过关联域名去访问!

上一篇:springcloud-支付和订单服务入驻Eureka集群


下一篇:【一起学源码-微服务】Nexflix Eureka 源码三:EurekaServer启动之EurekaServer上下文EurekaClient创建