SpringCloud入门—Eureka入门
一、介绍
-
背景
在传统应用中,组件之间的调用,通过有规范的约束的接口来实现,从而实现不同模块间良好的协作。但是被拆分成微服务后,每个微服务实例的网络地址都可能动态变化,数量也会变化,使得原来硬编码的地址失去了作用。需要一个中心化的组件来进行服务的登记和管理。 -
概念
实现服务治理,即管理所有的服务信息和状态。注册中心用途相当于打开地图找周围超市买东西,先看看周围都有哪些超市(获取注册列表),再去超市买东西(调用服务)。
-
服务器端
Server是一个公共服务,为Client提供服务注册和发现的功能,维护注册到自身的Client的相关信息,同时提供接口给Client获取注册表中其他服务的信息,使得动态变化的Client能够进行服务间的相互调用。 -
客户端
Client将自己的服务信息通过一定的方式登记到Server上,并在正常范围内维护自己信息一致性,方便其他服务发现自己,同时可以通过Server获取到自己依赖的其他服务信息,完成服务调用,还内置了负载均衡器,用来进行基本的负载均衡。
二、Eureka单节点搭建
-
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zhow</groupId> <artifactId>Eureka-Server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Eureka-Server</name> <description>Eureka-Server</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR9</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> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.zhow.eurekaserver.EurekaServerApplication</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
-
application.properties
#是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息 eureka.client.register-with-eureka=false #是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false eureka.client.fetch-registry=false #设置服务注册中心的URL,用于client和server端交流 eureka.client.serviceUrl.defaultZone=http://localhost:7000/eureka/
-
代码
启动类上添加此注解标识该服务为配置中心 @EnableEurekaServer
打开http://localhost:8080/,查看Eureka页面。
三、Eureka多节点搭建
client功能
- 注册:每个微服务启动时,将自己的网络地址等信息注册到注册中心,注册中心会存储(内存中)这些信息。
- 获取服务注册表:服务消费者从注册中心,查询服务提供者的网络地址,并使用该地址调用服务提供者,为了避免每次都查注册表信息,所以client会定时去server拉取注册表信息到缓存到client本地。
- 心跳:各个微服务与注册中心通过某种机制(心跳)通信,若注册中心长时间和服务间没有通信,就会注销该实例。
- 调用:实际的服务调用,通过注册表,解析服务名和具体地址的对应关系,找到具体服务的地址,进行实际调用。
server注册中心功能
-
服务注册表:记录各个微服务信息,例如服务名称,ip,端口等。
注册表提供 查询API(查询可用的微服务实例)和管理API(用于服务的注册和注销)。
-
服务注册与发现:注册:将微服务信息注册到注册中心。发现:查询可用微服务列表及其网络地址。
-
服务检查:定时检测已注册的服务,如发现某实例长时间无法访问,就从注册表中移除。
搭建
-
修改本机hosts文件
文件位置 C:\Windows\System32\drivers\etchosts文件下添加以下代码 127.0.0.1 eureka1.com 127.0.0.1 eureka2.com 127.0.0.1 eureka3.com
-
pom 不变
-
application.properties
#依次打开eureka1,eureka2,eureka3 spring.profiles.active=eureka1 #spring.application.name 表示是否为同一服务 spring.application.name=EurekaService
application-eureka1.properties
#是否将自己注册到其他Eureka Server,默认为true 需要 #eureka.client.register-with-eureka=true #是否从eureka server获取注册信息, 需要 #eureka.client.fetch-registry=true #设置服务注册中心的URL,用于client和server端交流 #此节点应向其他节点发起请求 eureka.client.serviceUrl.defaultZone=http://eureka2.com:7002/eureka/,http://eureka3.com:7003/eureka/ #主机名,必填 eureka.instance.hostname=eureka1.com #web端口,服务是由这个端口处理rest请求的 server.port=7001
application-eureka2.properties
#是否将自己注册到其他Eureka Server,默认为true 需要 #eureka.client.register-with-eureka=true #是否从eureka server获取注册信息, 需要 #eureka.client.fetch-registry=true #设置服务注册中心的URL,用于client和server端交流 #此节点应向其他节点发起请求 eureka.client.serviceUrl.defaultZone=http://eureka1.com:7001/eureka/,http://eureka3.com:7003/eureka/ #主机名,必填 eureka.instance.hostname=eureka2.com #web端口,服务是由这个端口处理rest请求的 server.port=7002
application-eureka3.properties
#是否将自己注册到其他Eureka Server,默认为true 需要 #eureka.client.register-with-eureka=true #是否从eureka server获取注册信息, 需要 #eureka.client.fetch-registry=true #设置服务注册中心的URL,用于client和server端交流 #此节点应向其他节点发起请求 eureka.client.serviceUrl.defaultZone=http://eureka1.com:7001/eureka/,http://eureka2.com:7002/eureka/ #主机名,必填 eureka.instance.hostname=eureka3.com #web端口,服务是由这个端口处理rest请求的 server.port=7003
打开http://localhost:7001,查看Eureka页面。
四、Eureka原理
Register 服务注册
想要参与服务注册发现的实例首先需要向Eureka服务器注册信息。
注册在第一次心跳发生时提交
Renew 续租,心跳
Eureka客户需要每30秒发送一次心跳来续租
更新通知Eureka服务器实例仍然是活动的。如果服务器在90秒内没有看到更新,它将从其注册表中删除实例
Fetch Registry 获取注册表信息
Eureka客户端从服务器获取注册表信息并将其缓存在本地。
之后,客户端使用这些信息来查找其他服务。
通过获取上一个获取周期和当前获取周期之间的增量更新,可以定期(每30秒)更新此信息。
节点信息在服务器中保存的时间更长(大约3分钟),因此获取节点信息时可能会再次返回相同的实例。Eureka客户端自动处理重复的信息。
在获得增量之后,Eureka客户机通过比较服务器返回的实例计数来与服务器协调信息,如果由于某种原因信息不匹配,则再次获取整个注册表信息。
Cancel 发送取消请求
Eureka客户端在关闭时向Eureka服务器发送取消请求。这将从服务器的实例注册表中删除实例,从而有效地将实例从通信量中取出。
Time Lag 同步时间延迟
来自Eureka客户端的所有操作可能需要一段时间才能反映到Eureka服务器上,然后反映到其他Eureka客户端上。这是因为eureka服务器上的有效负载缓存,它会定期刷新以反映新信息。Eureka客户端还定期地获取增量。因此,更改传播到所有Eureka客户机可能需要2分钟。
Communication mechanism 通讯机制
Http协议下的Rest请求
默认情况下Eureka使用Jersey和Jackson以及JSON完成节点间的通讯。