SpringCloud注册中心-Eureka

Posted 熊猫IT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud注册中心-Eureka相关的知识,希望对你有一定的参考价值。

1.Eureka注册中心

1.1.Eureka简介

首先我们来解决第一问题,服务的管理。

问题分析

在刚才的案例中,user-service对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现变更,还需要及时更新。这在服务较少的时候并不觉得有什么,但是在现在日益复杂的互联网环境,一个项目肯定会拆分出十几,甚至数十个微服务。此时如果还人为管理地址,不仅开发困难,将来测试、发布上线都会非常麻烦,这与DevOps的思想是背道而驰的。

网约车

这就好比是网约车出现以前,人们出门叫车只能叫出租车。一些私家车想做出租却没有资格,被称为黑车。而很多人想要约车,但是无奈出租车太少,不方便。私家车很多却不敢拦,而且满大街的车,谁知道哪个才是愿意载人的。一个想要,一个愿意给,就是缺少引子,缺乏管理啊。

此时滴滴这样的网约车平台出现了,所有想载客的私家车全部到滴滴注册,记录你的车型(服务类型),身份信息(联系方式)。这样提供服务的私家车,在滴滴那里都能找到,一目了然。

此时要叫车的人,只需要打开APP,输入你的目的地,选择车型(服务类型),滴滴自动安排一个符合需求的车到你面前,为你服务,完美!

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

Netflix在设计Eureka是遵循的就是AP原则
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:
●一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
●可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
●分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

●CAP原则只能三选二
最多只能同时较好的满足两个。
CAP理论的核心足:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这止个需求,因此,根据CAP原理将NOSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
CA单点集群,满足一致性,可川性的系统,通常在可扩展性上不太强大。
CP满足一致性,分区容忍必的系统,通常性能不是特别高。
AP满足可用统,通常可能对一致性要求低一些。
SpringCloud注册中心-Eureka_spring
Eureka遵守AP原则
zookeeper遵守CP原则
双11、618只能用AP

1.2.Eureka基本架构

SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册和发现(请对比Zookeeper)。Eureka采用了C-S的设计架构。EurekaServer作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到EurekaServer并维持心路连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行。SpringCloud的一些其他模块(比如Zuul)就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑。
SpringCloud注册中心-Eureka_服务列表_02

  • Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
  • 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
  • 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
  • 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态

注意和Dubbo对比:
SpringCloud注册中心-Eureka_服务列表_03

1.2.1 EurekaServer

EurekaServer作为一个独立的部署单元,以RESTAPI的形式为服务实例提供了注册、管理和查询等操作。同时,EurekaServer也为我们提供了可视化的监控页面,可以直观地看到各个EurekaServer当前的运行状态和所有已注册服务的情况。

EurekaServer节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。EurekaServer通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果EurekaServer在一定时间内没有接收到某个服务实例的心跳,EurekaServer将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当EurekaServer节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。

自我保护模式:
默认配置下,如果EurekaServer每分钟收到心跳续约的数量低于一个阈值(instance的数量(60/每个instance的心跳间隔秒数)自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该EurekaServer节点就会自动退出自我保护模式。它的设计理念就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation=false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔,eureka.server.renewal-percent-threshold可以用来修改自我保护系数(默认0.85)。

1.2.2 EurekaClient

服务注册
启动时,会调用服务注册方法,向EurekaServer注册自己的信息。EurekaServer会维护一个已注册服务的列表。当实例状态发生变化时(如自身检测认为Down的时候),也会向EurekaServer更新自己的服务状态,同时用replicateToPeers()向其它EurekaServer节点做状态同步。

续约与剔除
服务实例启动后,会周期性地向EurekaServer发送心跳以续约自己的信息,避免自己的注册信息被剔除。续约的方式与服务注册基本一致,首先更新自身状态,再同步到其它Peer。如果EurekaServer在一段时间内没有接收到某个微服务节点的心跳,EurekaServer将会注销该微服务节点(自我保护模式除外)。

服务消费:ServiceConsumer本质上也是一个EurekaClient。它启动后,会从EurekaServer上获取所有实例的注册信息,包括IP地址、端口等,并缓存到本地。这些信息默认每30秒更新一次。前文提到过,如果与EurekaServer通信中断,ServiceConsumer仍然可以通过本地缓存与ServiceProvider通信。

三处缓存
EurekaServer对注册列表进行缓存,默认时间为30s。
EurekaClient对获取到的注册信息进行缓存,默认时间为30s。
Ribbon会从上面提到的EurekaClient获取服务列表,将负载均衡后的结果缓存30s。

2.Eureka项目的构建

我们做三个角色
EurekaServer:提供服务注册和发现;
ServiceProvider:服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到;
ServiceConsumer:服务消费方,从Eureka获取注册服务列表,从而能够消费服务。

2.1 新建一个工程EurekaServer-7001

依然使用spring提供的快速搭建工具
SpringCloud注册中心-Eureka_客户端_04
选择依赖
SpringCloud注册中心-Eureka_spring_05
完整的Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bruceliu.eureka.server</groupId>
<artifactId>eureka-server-7001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server-7001</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>

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

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

编写启动类

@SpringBootApplication
@EnableEurekaServer // 声明这个应用是一个EurekaServer
public class EurekaServer7001Application

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


编写配置

server:
port: 7001 # 端口
spring:
application:
name: eureka-server-7001 # 应用名称,会在Eureka中显示
eureka:
client:
register-with-eureka: false # 是否注册自己的信息到EurekaServer,默认是true
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
defaultZone: http://127.0.0.1:$server.port/eureka

启动服务,并访问:​​http://127.0.0.1:7001​​​SpringCloud注册中心-Eureka_客户端_06
SpringCloud注册中心-Eureka_客户端_07

2.2.将user-service注册到Eureka

注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中。
我们在springcloud-demo中添加Eureka客户端依赖:
先添加SpringCloud依赖

<!-- SpringCloud的依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>$spring-cloud.version</versionSpringCloud系列服务注册中心Eureka基础

SpringCloud之eureka注册中心入门

SpringCloud Eureka(注册中心集群)

springCloud系列教程01:Eureka 注册中心集群搭建

springcloud:注册中心Eureka

springcloud:注册中心Eureka