Eureka 服务注册与发现

Eureka 服务注册与发现

版本采用 Zuul Core 1.4.6

微服务架构由一组小的服务组成,服务之间采用轻量级的通讯机制进行沟通,微服务之间调用关系是一个网状结构,一个微服务在调用另一个微服务的时候,无法知道另一个微服务的具体地址;由于每个服务属于"微"服务,每个服务生命周期不长,每个服务可能随时被关闭、重启、替换;在随着访问量增加的时候,微服务需要扩容,访问量减少时,微服务需要缩容;这样就导致每个微服务的地址在动态变化。这时候必然引入一个服务的注册与发现问题。

在如今的的服务注册与发现的框架中,SpringCloud提供了一套相对完整的技术组件,其中包括服务发现与注册eureka,Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。Eureka 又可细分为 Eureka Server 和 Eureka Client。

内容概览

快速部署

Spring Cloud中,包括API网关以及服务注册中心都是以服务的形式存在,所以,要部署Eureka,就是构建一个服务,在服务中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

在启动类上加入@EnableEurekaServer开启服务注册中心

添加配置文件

server.port = 8001
server.sessionTimeout=15
server.tomcat.max-threads = 800
server.tomcat.uri-encoding = UTF-8
 
#服务Eureka Server的身份验证
#security.basic.enabled=true
#security.user.name=root
#security.user.password=angus
 
#是否将eureka自身作为应用注册到eureka注册中心
eureka.client.registerWithEureka=false
#为true时,可以启动,但报异常:Cannot execute request on any known server
eureka.client.fetchRegistry=false
 
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/

框架说明

服务注册中心的高可用性,高可用的保证,就是备份,Eureka通过对自身的备份,当自身出现故障时,能保证整个系统的正常运行。注册中心提供3个端口:

  • Application Service port:为服务提供者提供服务注册,更新,下线,剔除,服务通讯等功能
  • Application Client port:为服务消费者提供服务发现和获取服务提供者地址的功能
  • Replicate port:为处于不同节点的Eureka进行数据同步提供服务

在这里插入图片描述

Eureka基本使用

服务注册

添加依赖:

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

在启动类上加上注解 @EnableEurekaClient 声明为 EurekaClient

配置服务注册中心地址:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/
server:
  port: 8762
spring:
  application:
    name: service-hi

服务消费

添加依赖

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

在启动类上加上注解 @EnableDiscoveryClient 声明为 EurekaConsume

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8001/eureka/
server:
  port: 8764
spring:
  application:
    name: service-consume

之后就可以调用服务提供者的服务完成服务消费

负载均衡

在服务消费者的pom中添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

在启动类中向程序的ioc注入一个bean: restTemplate,并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能

@Bean
@LoadBalanced
RestTemplate restTemplate() {
    return new RestTemplate();
}

此时架构如图:

在这里插入图片描述

服务注册中心的自我保护

在默认配置中,Eureka Server在默认90s没有得到客户端的心跳,则注销该实例,但是往往因为微服务跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,但是因为网络分区故障时,Eureka Server注销服务实例则会让大部分微服务不可用,为了解决这个问题,Eureka 有自我保护机制,通过在Eureka Server配置如下参数,可启动保护机制:

eureka.server.enable-self-preservation=true

它的原理是,当Eureka Server节点在短时间内丢失过多的客户端时(可能发送了网络故障),那么这个节点将进入自我保护模式,不再注销任何微服务,当网络故障回复后,该节点会自动退出自我保护模式。

服务注册中心的高可用性实现

简单来说, Eureka的高可用,实际上就是将自己也作为服务向其他服务注册中心进行注册,这样就可以形成一组相互注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。在CAP原则中,相对于zookeeper满足AP(可用性和分区容错性)来说,Eureka是满足CP( 一致性和分区容错性)的。这是它与zookeeper的最大区别。

每个注册中心都将自己作为EurekaClient注册到其他注册中心中去

例如:以下两个注册中心

  • Peer1
spring.application.name=eureka-service-1
# 端口
server.port=1000
# 实例的主机名称
eureka.instance.hostname=Peer1
# 不要向注册中心注册自己
#eureka.client.register-with-eureka=false
#表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
#eureka.client.fetch-registry=false
# 指定服务注册中心地址
eureka.client.service-url.defaultZone=http://Peer2:1001/eureka
  • Peer2
spring.application.name=eureka-service-2
# 端口
server.port=1001
# 实例的主机名称
eureka.instance.hostname=Peer2
# 不要向注册中心注册自己
#eureka.client.register-with-eureka=false
#表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
#eureka.client.fetch-registry=false
# 指定服务注册中心地址
eureka.client.service-url.defaultZone=http://Peer1:1000/eureka

而对于服务提供者,可作如下修改:

eureka.client.service-url.defaultZone=http://Peer1:1000/eureka,http://Peer2:1001/eureka

当然,也可只注册到某个节点上,其他的节点会通过Replicate进行同步,一般建议以集群方式进行配置,即多注册中心配置。避免单点故障,Eureka在搜索注册中心时,根据defaultZone列表,找到一个可用的,之后就不会继续去下一个注册中心地址拉取服务列表了,此时若其中一个注册中心发生故障,这个时候客户端会继续去第二个注册中心拉取服务列表的。

生产环境

TODO

常见问题

TODO

更新计划

  • 增加自定义负载均衡策略实现
  • Eureka的自我保护策略改进实现


版权声明:本文为qq_38958113原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。