首页 > 编程知识 正文

eureka的实现原理,eureka架构

时间:2023-05-05 07:18:27 阅读:196475 作者:2298

Eureka原理及简单项目搭建

文章目录 Eureka原理及简单项目搭建Eureke简介Eureka ServerEureka Client心跳机制Eureka的自我保护机制原理CAP理论Eureka和zookeeper的区别 一个小栗子创建一个Eureka Server注册两个Eureka Client provider 和consumer创建provider:创建consumer

Eureke简介

Eureka是spring cloud Netflix微服务套件中的一部分,包含了服务器端(Eureka Server)和客户端(Eureka Client)两部分,服务器端,也被称作是服务注册中心,用于提供服务的注册和发现;客户端服务启动后会将整服务注册金Eureka Server并且在应用程序运行过程中,Eureka Client会周期性想注册中心发送心跳包来保持服务连接,同时也可以从服务器查询当前注册的服务信息和状态;

Eureka Server

被称为注册中心,用来存储Eureka Client发送的服务信息,例如IP地址,端口,运行状况等;同步到Eureka Client,和其他Eureka Server集群;

Eureka Client

被称为注册中心客户端,服务的提供者,向Eureka Server提供自身的元数据;Eureka Client还会拉取,更新和缓存Eureka Server中的信息,当Eureka Server节点全部宕机,在服务未有改动之前,Eureka Client依然可以使用缓存中的信息找到服务提供者;

心跳机制

服务启动后,Eureka Client会每隔30秒(默认)向Eureka Server发送心跳,证明当前服务是可用状态;Eureka Server如果在90秒(默认)内未收到客户端心跳,则认为服务宕机,注销该服务;

Eureka的自我保护机制

在默认配置中,Eureka Server如果在90秒(默认)内未收到客户端心跳,则认为服务宕机,注销该服务,但有可能因为Eureka Server本身的网络原因,接收不到Eureka Client发送的心跳,这会让Eureka Server删除大量的客户端,造成严重的后果,

所以,Eureka有自我保护机制,当短时间内丢失过多的客户端时,可能是发生了网络故障,会让这个服务端进入自我保护模式,不再注销任何客户端服务;

原理


1、Eureka Server 启动成功,等服务端注册,在启动过程中如果配置了集群,集群之间定时通过Replicate 同步注册表,每个Eureka Server 都存在独立完整的服务注册表信息2、Eureks Client 启动时据配置的Eureka Server 地址去注册中心注册服务

Eureks Client 会每30s向Eureka Serwes 发送一次心跳请求,证明客户端服务正常

4、当Eureka Server 90s 内没有收到Eureka Cent 的心跳注册中心认为该节点失效,会注销该实例

5、单位时间内Eureks Server 统计到有大量的Eureka Client 没有上送心跳则认为可能为网络异常,进入白我保护机制,不再除没有上送心的客户端

6、当Eureka Client 心跳请求恢复正常之后,Eurcka Server 自动退出自我保护模式

7、Eureks Client 定时全量或者增量从注册中心获取服务注册表,并且将获到的信息缓存到本地

8、服务调用时,Eureka Client 会先从本地缓存找寻请取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存

9、Eureka Client 获取到目标服务器信息,发起服务调用

10,Eureka Client 程序关闭时Eureka Serwer 发送取消请求,Eureks Server 将实例从注册表中删除

CAP理论

C 一致性
A 高可用
P 分布式容错

一个分布式系统不可能同时满足这三个条件;

Eureka和zookeeper的区别

Zookeeper保证CP(一致性,分布式容错)
zookeeper保证数据的一致性,在客户端想注册中心注册信心时,会有一个临时节点,这个临时节点会向主节点同步,主节点向子节点同步,当同步完成过半时,才会通知注册成功;当服务宕机时,会直接删除临时节点,就不会存在时间差;但需要注意的一点,主节点与其它节点失去联系时,剩下的子节点会重新进行leader选举,选举时间不会太长,30~120s ,但是选举期间这个zk集群都是不可用的,网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的;
Eureka保证AP(高可用,分布式容错)
Eureka各个节点是平等的,几个节点宕机不会影响其它节点的正常工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性);哪怕服务端全部挡掉,客户端自己也会有缓存;

一个小栗子 创建一个Eureka Server 创建一个spring cloud项目,在正常的boot项目中加入注解: <!-- spring cloud start--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement><!-- spring cloud end--> 加入Eureka Server注解: <!--Eureka server start--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-server</artifactId> <version>1.3.5.RELEASE</version></dependency><!--Eureka server end--> 在启动类中加入注解@EnableEurekaServer;如果需要加入用户验证,需要在pom.xml中加入依赖 <!--用户验证 start--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!--用户验证 end--> application.yml eureka: client: service-url: #设置交互地址 defaultZone: http://localhost:7776/eureka #是否向其他节点的Eureka Server获取注册信息,当前是单节点,不需要同步其他 所以设置为false fetch-registry: false #是否向注册中心注册自己 register-with-eureka: false server: #禁止自我保护模式 (在开发环境下,关闭自我保护比较容易发现错误) enable-self-preservation: false #续期时间,即扫描失效服务的间隔时间 eviction-interval-timer-in-ms: 2000server: port: 7776security: user: #认证用户名 (为防止恶意访问注册中心,需要在client中加入客户端再url加入 defaultZone: http://root:root@localhost:7776/eureka) name: root #认证密码 password: root basic: #开启认证 enabled: true 注册两个Eureka Client provider 和consumer 创建provider: 创建一个cloud项目,加入cloud依赖,cloud start 依赖 <dependencies><!--Eureka client start--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.5.RELEASE</version> </dependency> <!--Eureka client end--> </dependencies> <!-- spring cloud start--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 在启动类加入注解 @EnableEurekaClient或者@EnableDiscoveryClient
@EnableEurekaClient 只用在以eureka为注册中心中
@EnableDiscoveryClient 用再以其他为注册中心 包括eurekaapplication.yml server: port: 8081eureka: client: service-url: defaultZone: http://root:root@localhost:7776/eureka instance: #表示Eureka client 发送心跳的频率 默认30s lease-expiration-duration-in-seconds: 2 #表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间默认90s lease-renewal-interval-in-seconds: 2 #配置IP地址注册到注册中心 instance-id: ${spring.cloud.client.ipAddress}:${server.port}spring: application: #服务的名字 name: eureka-provider-demo 创建UserService @RestControllerpublic class UserService { @RequestMapping(value = "/login") public String login(){ return "登录成功2"; }} 创建consumer 创建一个boot项目,导入cloud依赖,Eureka Client依赖 ,cloud start依赖 <!--Eureka client start--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.5.RELEASE</version> </dependency> <!--Eureka client end--> <!--spring cloud feign start--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.3.5.RELEASE</version> </dependency> <!--spring cloud feign end--> <!--dependencies标签外--> <!-- spring cloud start--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- spring cloud end--> application.yml文件如provider配置文件在启动类中加入注解 @EnableDiscoveryClient@EnableFeignClients 创建UserController,添加login方法 @RestControllerpublic class UserController { @Autowired private UserService userService; @RequestMapping(value = "/login") public String login(){ return userService.login(); }} 创建UserServicer和UserServiceImpl @Service("userService")public class UserServiceImpl implements UserService { @Autowired private UserClient userClient; @Override public String login() { return userClient.login(); }} 创建User Client //provider配置文件中,给服务起的名字,根据这个名字在注册中心查找@FeignClient(name = "eureka-provider-demo",fallback = UserFallBack.class)public interface UserClient { //根据url 和 参数列表 去对应的provider中找 @RequestMapping(value = "/login") public String login();}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。