Spring-Cloud-Netflix-Eureka注册中心
概述
- eureka是Netflix的子模块之一,也是一个核心的模块
- eureka里有2个组件:
一个是EurekaServer(一个独立的项目) 这个是用于定位服务以实现中间层服务器的负载平衡和故障转移
一个便是EurekaClient(我们的微服务) 它是用于与Server交互的,可以使得交互变得非常简单:只需要通过服务标识符即可拿到服务 - Eureka负责管理、记录服务提供者的信息
- 服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。
- 类似家政中心,物业
Netflix-Eureka与SpringCloud的关系
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现
Eureka原理
- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
- 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
- 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态,会监听有没有定期更新,如果长时间没有心跳,就会自动把该服务移除

Eureka使用
- 在之前工程中添加一个子模块名称为Eureka3000

- 在总父工程添加SpringCloud的依赖集中管理

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 在Eureka3000的子模块中添加依赖

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- 在resources当中创建配置文件application.yml

server:
port: 3000
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 4000 #设置清理间隔(单位:毫秒 默认是60*1000)
instance:
hostname: localhost
- 创建启动类,并在启动器上添加EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class Eureka3000App {
public static void main(String[] args) {
SpringApplication.run(Eureka3000App.class, args);
}
}
- 直接启动会报错com.sun.jersey.api.client.ClientHandlerException
原因:
Eureka做为注册中心, 做为服务的管理,它不能挂掉, 如果它挂掉,整个服务全部访问不了
因此Eureka也要搭建集群多台Eureka服务, 集群之间要进行相互之间通信,通信靠的就是Eureka-client
Eureka是一个服务端, 也是一个客户商, 以后相互注册,现在没有其它的可注册,所以就会报ClientException
解决方案:不让它做为客户端注册,在application.yml添加如下配置

client:
registerWithEureka: false #不把自己作为一个客户端注册到自己身上
fetchRegistry: false #不需要从服务端获取注册信息(因为在这里自己就是服务端,而且已经禁用自己注册了)
serviceUrl: #微服务要注册到的地址.
#http://localhost:3000/eureka
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
- 运行后,在浏览器地址栏直接访问http://localhost:3000/

发现启动后,还没有服务进行注册。
服务注册:
- 在user工程中添加eureka客户端相关依赖

<!--Eureka的客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在启动器上添加注解@EnableEurekaClient

@EnableEurekaClient
- 创建application.yml配置文件,配置eureka的服务端地址

server:
port: 5000
eureka:
client:
serviceUrl:
#eureka服务端提供的注册地址 参考服务端配置的这个路径
defaultZone: http://localhost:3000/eureka
instance:
instance-id: user-1 #此实例注册到eureka服务端的唯一的实例ID
prefer-ip-address: true #是否显示IP地址
#eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
leaseRenewalIntervalInSeconds: 10
#Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒
leaseExpirationDurationInSeconds: 30
spring:
application:
name: client-user #此实例注册到eureka服务端的name
- 注册goods,和上面步骤一样,注意改一下的地方

- 启动Eureka3000,user,goods注册到注册中心

可以看到已经注册成功
常用配置:
- 服务注册
服务提供者在启动时,会检测配置属性中的:eureka.client.register-with-erueka=true参数是否正确,
事实上默认就是true。如果值确实为true,则会向EurekaServer发起一个Rest请求
- 获取服务列表
当服务消费者启动是,会检测eureka.client.fetch-registry=true参数的值,如果为true, 则会从Eureka
Server服务的列表只读备份,然后缓存在本地。并且每隔30秒会重新获取并更新数据。
eureka.client.registry-fetch-interval-seconds: 5 生产环境中,我们不需要修改这个值。
- 服务续约
eureka:
instance:
lease-expiration-duration-in-seconds: 90 :服务续约(renew)的间隔,默认为30秒
lease-renewal-interval-in-seconds: 30 :服务失效时间,默认值90秒
在注册服务完成以后,服务提供者会维持一个心跳
也就是说,默认情况下每个30秒服务会向注册中心发送一次心跳,证明自己还活着。如果超过90秒没有发送心跳
EurekaServer就会认为该服务宕机,会从服务列表中移除,这两个值在生产环境不要修改,默认即可。
- 失效剔除
有些时候,我们的服务提供方并不一定会正常下线,可能因为内存溢出、网络故障等原因导致服务无法正常工作 Eureka
Server需要将这样的服务剔除出服务列表。因此它会开启一个定时任务,每隔60秒对所有失效的服务(超过90秒未响应)进行剔除
可以通过eureka.server.eviction-interval-timer-in-ms参数对其进行修改,单位是毫秒
- 自我保护机制
当把一个服务停掉后, 并不会立马从服务列表当中移除,默认是90秒清除一次
有可以注册中心和微服务之间出现了网络波动,网络不好,没有收到心跳,有可能是网络不好,但是微服务还在,所以它不会立马把服务给移除
当15分钟内85%的心跳都没有正常心跳,那么eureka认为客户端与注册中心出现了网络问题,此时会出现以下情况:
1.Eureka不再从注册列表中移除因为长时间没有收到的心跳而过期的服务
2.Eureka仍然能够接收服务的注册和查询请求,但是不会被同步到其它节点上
3.当网络稳定后,当前实例新注册的信息会被同步到其它节点上
CAP定理(了解)
- 什么是CAP定理
CAP定理又称CAP原则, 指的是在一个分布式系统中,Consistency(一致性)、
Availability(可用性)、Partition tolerance(分区容错性), 最多只能同时三个特性中的两个,三者不可兼得
- Consistency (一致性)
“all nodes see the same data at the same time”,
即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。
- Availability(可用性)
可用性指“Reads and writes always succeed” 即服务一直可用,而且是正常响应时间。
好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况
- Partition tolerance(分区容错性)
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区
分区容错的意思是,区间通信可能失败。比如,一台服务器放在本地,另一台服务器放在外地(可能是外省,甚至是外国),这就是两个区,它们之间可能无法通信
两台跨区的服务器。Server1 向 Server2 发送一条消息,Server2 可能无法收到。系统设计的时候,必须考虑到这种情况.
一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立
即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。
分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。
- Consistency 和 Availability 的矛盾
如果保证 Server2 的一致性,那么 Server1 必须在写操作时,锁定 Server2
的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,Server2 不能读写,没有可用性 如果保证 Server2的可用性,那么势必不能锁定 Server2,所以一致性不成立
- 取舍策略
CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:
1.CA without P:
如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。
但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点, 这是违背分布式系统设计的初衷的。
2.CP without A:
如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长
(也就是等待数据同步完才能正常访问服务)
一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。
3.AP wihtout C:
要高可用并允许分区,则需放弃一致性。 一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务
而这样会导致全局数据的不一致性。
抢购商品时,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在
A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。
没有最好的策略,好的系统应该是根据业务场景来进行架构设计的,只有适合的才是最好的
Spring-Cloud-Netflix-Eureka注册中心的更多相关文章
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
- spring cloud(二)服务(注册)中心Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼
Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...
- Spring Cloud Netflix Eureka源码导读与原理分析
Spring Cloud Netflix技术栈中,Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用,因此对Eureka还是有很大的必要进行深入研究. 本文主要分为四部分,一是对项目构建 ...
- spring cloud(服务注册中心及服务提供者——初学一)
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- 微服务架构 | 3.1 Netflix Eureka 注册中心
目录 前言 1. Eureka 基础知识 1.1 Eureka 模型中的服务器与客户端 1.2 Eureka 的 30s 启动机制 1.3 Eureka 为什么注册服务的 IP ,而不是主机名 1.4 ...
- Spring Cloud Netflix Eureka client源码分析
1.client端 EurekaClient提供三个功能: EurekaClient API contracts are:* - provide the ability to get Instance ...
- 【系统架构理论】一篇文章精通:Spring Cloud Netflix Eureka
是官方文档的总结 http://spring.io/projects/spring-cloud-netflix#overview 讲解基于2.0.2版本官方文档 https://cloud.sprin ...
- Spring Cloud--搭建Eureka注册中心服务
使用RestTemplate远程调用服务的弊端: Eureka注册中心: Eureka原理: 搭建Eureka服务 引pom 启动类: 启动类上要加上@EnableEurekaServer注解: 配置 ...
- Spring Cloud Netflix Eureka(注册中心)
Eureka简介 Eureka是Netflix开发的一个Service Discovery组件,spring cloud将其整合用来做服务注册中心,Eureka包括两部分Eureka Server 和 ...
随机推荐
- iview必备技能一、表单验证规则
iView表单组件使用async-validator验证器对表单域中数据进行验证,给Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. 完整的验 ...
- Node的require和module.exports
node编程中最重要的思想之一就是模块,在 Node.js 模块系统中,每个文件都被视为独立的模块.这是这个思想,让javascript的大规模工程成为可能.模块化编程在前端大肆盛行,在node中导出 ...
- 添加谷歌拓展程序 vue.js devtools过程中的问题
在用vue做项目过程中,需要用到vue.js devtools,在从github上面clone下来代码,然后再npm install ,过程报错,然后更新npm包也是会有问题,以下是install的问 ...
- 检测js对象是不是数组类型?
面试时候被人问如何检测一个未知变量是不是数组类型,丢脸啊,老祖宗的脸都丢没了,这都不会,回家啃书本去吧!!! var a = [];方法一:Array.isArray([]) //true type ...
- Scrapy 入门教程
Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通常我们可以很简单的通过 ...
- 从源码看 PHP 7 数组的实现
本文所用源码为 PHP 7.4.4 的版本. PHP 7 数组概述 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当 ...
- java-打印流(新手)
实例:1.直接输出到文件里面. import java.io.*; //打印流->保持数据原样性并且打印.(各种数据类型.) public class Dyl { public static v ...
- appium移动自动化详解
1移动自动化简介 移动自动化就是通过代码来控制手机,模拟人的动作,对手机进行一些点击,输入等操作,那python代码如何能控制到手机呢?目前的思路应该是python代码->Appium-pyth ...
- 项目部署Django+celery+redis
celery介绍 1.celery应用举例 1.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以 ...
- Python3学习之路~9.4 队列、生产者消费者模型
一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...