3、SpringCloud之服务注册中心Eureka

SpringCloud之Eureka注册中心高可用集群概述

对于微服务这种分布式系统,要充分考虑每个微服务组件的高可用性问题,不能用单点故障。

注册中心本身也是一个服务,如果只有一个节点(服务器),则有可能发生故障而导致无法使用注册和查询服务(单点故障),为保证服务注册中心的高可用,通过服务注册中心集群来解决。

Eureka Server 本身也是服务,既是Provider 也是 Consumer;

Eureka实现高可用

Eureka Server 的高可用实际上就是将自己作为服务向其他服务注册自己,形成一个互相注册的服务注册中心,实现服务清单之间的同步,A注册中心上注册的服务,可以被复制同步到B注册中心上,任何一台注册中心上都能查询到已经注册的服务,从而实现高可用。

Eureka 注册中心高可用集群搭建

  • 拥有两个以上的Eureka 服务注册中心
  • A服务中心指向B服务中心,B服务中心指向A服务中心(在配置文件设置service-url)

第一步,两个服务注册中心

有两种方式可以实现(这里选择第二种)
1、通过创建两个springboot项目来获取两个Eureka服务注册中心
2、通过指定不同的配置文件启动两次程序应用程序来获得两个服务注册中心。

创建项目

添加依赖

<!-- 添加Eureka依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
 <!--添加依赖管理-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      </dependencies>
</dependencyManagement>

编写配置文件

配置文件1:Application8761.properties

# 应用服务 WEB 访问端口
server.port=8761
#配置该服务注册中心的hostname(填ip)
eureka.instance.hostname=eureka8761
#由于我们目前创建的应用是一个服务注册中心,而不是普通的应用。
# 默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种自己向自己注册的默认行为
eureka.client.register-with-eureka=false
#表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它不需要检索其他服务
eureka.client.fetch-registry=false
#指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://eureka8762:8762/eureka

配置文件2:Application8762.properties

server.port=8762
#配置该服务注册中心的hostname(填ip)
eureka.instance.hostname=eureka8762
#由于我们目前创建的应用是一个服务注册中心,而不是普通的应用。
# 默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种自己向自己注册的默认行为
eureka.client.register-with-eureka=false
#表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它不需要检索其他服务
eureka.client.fetch-registry=false
#指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka

配置映射
在电脑的C:\Windows\System32\drivers\etc打开hosts文件进行配置,如下:

127.0.0.1 eureka8761
127.0.0.1 eureka8762

多环境下指定程序配置文件
创建两个启动类,并指定启动类使用哪个配置文件运行

@SpringBootApplication
@EnableEurekaServer //开启Eureka注册中心服务端
public class Application8762 {

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

}


另一个启动类也是这样配置

测试
启动该程序的两个启动类,启动成功后获得两个服务注册中心
访问后如下:

当复制选项出现了另一台服务器的hostname时,说明Eureka的高可用集群已经搭建成功了,这两个Eureka Server之间就可以相互同步数据

服务消费者和服务提供者添修改访问Eureka Server的访问路径

#eureka的访问地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka

启动服务消费者程序和服务提供者程序
刷新

Eureka服务注册中心自我保护机制

自我保护机制是Eureka注册中心的重要特性,当Eureka注册中心进入自我保护模式是,在Eureka Server首页会输出如下:

在没有Eureka自我保护的情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例,认为该服务宕机了。但是如果是因为网络问题微服务实例无法与Eureka Server正常通信,而微服务本身是正常的,在这种“网络分区故障”的情况下,Eureka可能会错杀了一个服务,将其注册信息进行销毁。这时Eureka的自我抱回模式就显得非常重要了。

Eureka Server进入“自我保护模式”时,当Eureka Server节点在短时间内丢失过多客户端时,Eureka Server 会认为可能该服务节点出现网络分区故障,那么就会把这个微服务节点保护起来,一旦进入自我保护模式,Eureka Server就会保护服务注册表中的信息,也就不会对该服务进行注销。当网络恢复后,该Eureka server节点会再自动退出自我保护模式,这种模式编码了因网络分区故障导致服务不可用。

自我保护机制是一种应对网络异常的安全保护措施,宁愿保留所有微服务,也不盲目注销任何健康的服务;自我保护模式让Eureka集群更加的健壮,稳定;

如果想禁用保护模式,可以使用eureka.server.enable-self-preservation=false禁用自我保护模式。

Eureka Server的自我保护模式让集群变得健壮,稳定的同时,也会带来一些困扰,如果在保护期内,某个服务提供者刚好下线,此时的消费者就拿到一个无效的服务实例,此时会调用失败。关于这个问题需要服务消费者端具有一些容错机制,如重试,断路由等策略。

Eureka Client 配置

#每间隔30秒,向服务端发送一次心跳,证明自己依然“存活”(默认30秒)
eureka.instance.lease-renewal-interval-in-seconds=30
#告诉服务端,如果90s内没有发送心跳,就代表该服务故障了,让服务端注销该服务(默认90秒)
eureka.instance.lease-expiration-duration-in-seconds=90

要让该配置看见效果,最好是让服务端的保护机制禁掉
eureka.server.enable-self-preservation=false

posted @ 2020-09-10 11:44  lawrence林  阅读(207)  评论(0编辑  收藏  举报