Spring Cloud (1) — Eureka 服务注册

6 篇文章 0 订阅
2 篇文章 0 订阅

版本控制

  • Spring Cloud 基于 Hoxton.RELEASE
  • Spring Boot 基于 2.2.5.RELEASE

介绍

服务发现是微服务体系结构的核心内容之一。EurekaNetFlix的一个子模块,用于服务的发现和注册,只需要使用服务的标识,就可以访问服务,它遵循分布式事务的AP原则。功能类似Dubbo的注册中心,比如Zookeeper。它分为服务端和客户端,在Spring Cloud中使用起来也很简单。

Eureka Server

主管服务注册,是服务注册中心,存储所有可用的服务节点信息。系统中的其他服务通过Eureka客户端注册到服务中心,并维持心跳连接,Eureka Server通过心跳连接来判断对应的服务节点是否可用。并且可以通过服务中心来发现其他服务进行调用。

pom
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
yml配置
server:
  port: 8761
spring:
  application:
    name: eureka-server
eureka:
  instance:
    # eureka服务端实例名称
    hostname: localhost
    # 发送心跳间隔,默认30,官方不建议修改
    lease-renewal-interval-in-seconds: 30
    # 服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除,默认90
    lease-expiration-duration-in-seconds: 90
  client:
    # 不向注册中心注册自己(自己就是服务中心)
    register-with-eureka: false
    # 不需要去检索注册表信息
    fetch-registry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    # 关闭自我保护模式,生产环境建议开启
    enable-self-preservation: false
引入Eureka服务注解:@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

Eureka Client

每个客户端节点启动后会主动向EurekaServce注册自己,并维持一个心跳链接。当需要和其他服务通信时,会向EurekaServce询问目标服务的地址进行访问。

pom
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
yml配置
server:
  port: 8760
spring:
  application:
    name: eureka-client
eureka:
  instance:
    # 实例显示信息
    instance-id: ${spring.cloud.client.ipaddress}:${server.port}
    # 以IP地址注册到服务中心,相互注册使用IP地址
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
引入Eureka客户端注解:@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

Eureka Server集群

实际项目中往往有大量的微服务实例,如果注册中心出现异常将导致整体系统瘫痪,所以需要对Eureka Server进行集群来达到高可用

修改本机host文件

因为在本机进行集群,所以通过修改host文件,修改EurekaServer配置文件多次启动的方式来实现:

127.0.0.1       eureka1
127.0.0.1       eureka2
修改yml文件

Eureka Server 新增配置文件application-server1.ymlapplication-server2.yml

# application-server1.yml
server:
  port: 8761
eureka:
  instance:
    # eureka服务实例名称
    hostname: eureka1
  client:
    # 不向注册服务中心注册自己(自己就是服务中心)
    register-with-eureka: false
    # 不需要去检索注册表信息
    fetch-registry: false
    serviceUrl:
      defaultZone: http://eureka2:8762/eureka/

# application-server2.yml
server:
  port: 8762
eureka:
  instance:
    # eureka服务实例名称
    hostname: eureka2
  client:
    # 不向注册服务中心注册自己(自己就是服务中心)
    register-with-eureka: false
    # 不需要去检索注册表信息
    fetch-registry: false
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/

Eureka Client修改yml的defaultZone

eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka1:8761/eureka/

启动Eureka Server指定spring.profiles.active=server1,再次启动,指定spring.profiles.active=server2。启动Eureka Client服务,分别访问2个服务中心,可以看到各自的副本信息,并且2个服务中心都有了EUREKA-CLIENT的注册信息。

自我保护机制

默认情况下,如果EurekaServer超过90秒没有接收到某个服务实例的心跳,将会注销该实例。但是,会存在由于网路波动而导致微服务实例和EurekaServer无法正常通信,实际上这个实例是正常运行的,不应该去注销这个实例。针对这种情况Eureka提供了自我保护机制的方案。当EurekaServer节点在短时间内丢失过多客户端时(15分钟内超过85%的节点都没有正常的心跳),那么EurekaServer就会认为客户端和注册中心出现了网络问题,这个EurekaServer节点就会进入自我保护模式。一旦进入自我保护模式,EurekaServer就会保护服务注册表中的信息,不再删除注册表中的信息

自我保护模式中,EurekaServer服务依旧提供注册功能,但是不再注销任何服务实例。当它收到心跳数重新恢复到阈值以上时,该EurekaServer服务就会退出自我保护模式。宁可保留错误的服务信息,也不会盲目注销任何可能健康的服务。

它是一种应对网络异常的保护措施,生产环境建议开启。

可以通过eureka.server.enable-self-preservation=false来关闭自我保护机制

Eureka对比Zookeeper

CAP原则
  • Consistency: 一致性;
  • Availability: 可用性;
  • Partition tolerance: 分区容错性;

CAP 原则指的是,在一个人分布式系统中这三个要素最多只能同时实现两点,不可能三者兼顾,其中P分区容错性是必须要满足的。

Zookeeper

Zookeeper满足CP。在Zookeeper中master因网络故障和其他节点失联的时候,剩余节点会重新选举leader,耗时较长。选举期间整个zk集群不可用,导致注册中心瘫痪

Eureka

Eureka满足AP。Eureka各个节点都是平等的,只要有一个节点正常运行就可以提供注册和查询服务(保证可用性A),只不过查到的信息可能不是最新的(不保证强一致性C)。eureka会首先保证可用性,在一定程度内再去进行一致性的同步。

访问源码

所有代码均上传至Github

>>>>>> Eureka服务注册 <<<<<<

日常求赞

创作不易,如果各位觉得有帮助,求点赞 支持


求关注

微信公众号: 俞大仙

俞大仙


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值