学校网站建设问卷调查,南冒网站建设制作推广公司,使用wordpress的企业,什么网站可以做引文分析5. Eureka服务注册中心
5.1 什么是Eureka
Netflix在涉及Eureka时#xff0c;遵循的就是API原则.Eureka是Netflix的有个子模块#xff0c;也是核心模块之一。Eureka是基于REST的服务#xff0c;用于定位服务#xff0c;以实现云端中间件层服务发现和故障转移#xff0c;服…5. Eureka服务注册中心
5.1 什么是Eureka
Netflix在涉及Eureka时遵循的就是API原则.Eureka是Netflix的有个子模块也是核心模块之一。Eureka是基于REST的服务用于定位服务以实现云端中间件层服务发现和故障转移服务注册与发现对于微服务来说是非常重要的有了服务注册与发现只需要使用服务的标识符就可以访问到服务而不需要修改服务调用的配置文件了功能类似于Dubbo的注册中心比如Zookeeper.
5.2 原理理解
Eureka基本的架构
Springcloud 封装了Netflix公司开发的Eureka模块来实现服务注册与发现 (对比Zookeeper).
Eureka采用了C-S的架构设计EurekaServer作为服务注册功能的服务器他是服务注册中心.
而系统中的其他微服务使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行Springcloud 的一些其他模块 (比如Zuul) 就可以通过EurekaServer来发现系统中的其他微服务并执行相关的逻辑. 和Dubbo架构对比. Eureka 包含两个组件Eureka Server 和 Eureka Client. Eureka Server 提供服务注册各个节点启动后回在EurekaServer中进行注册这样Eureka Server中的服务注册表中将会储存所有可用服务节点的信息服务节点的信息可以在界面中直观的看到. Eureka Client 是一个Java客户端用于简化EurekaServer的交互客户端同时也具备一个内置的使用轮询负载算法的负载均衡器。在应用启动后将会向EurekaServer发送心跳 (默认周期为30秒) 。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳EurekaServer将会从服务注册表中把这个服务节点移除掉 (默认周期为90s). 三大角色 Eureka Server提供服务的注册与发现 Service Provider服务生产方将自身服务注册到Eureka中从而使服务消费方能够找到 Service Consumer服务消费方从Eureka中获取注册服务列表从而找到消费服务
5.3 构建步骤
配置功能的基本方式 1. eureka-server
1.springcloud-eureka-7001 模块建立
2.pom.xml 配置
知道上网找依赖的仓库 !--导包~--
dependencies!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --!--导入Eureka Server依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka-server/artifactIdversion1.4.6.RELEASE/version/dependency!--热部署工具--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency
/dependencies3.application.yml server:port: 7001# Eureka配置
eureka:instance:# Eureka服务端的实例名字hostname: 127.0.0.1client:# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)register-with-eureka: false# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 turefetch-registry: false# Eureka监控页面~service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/源码中Eureka的默认端口以及访问路径: 4.主启动类 5.测试效果
注意访问地址 2. eureka-client
使用之前创建的服务提供者的8001端口的模块 springlouc-provider-dept-8001
①导入Eureka依赖 !--Eureka依赖--
!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactIdversion1.4.6.RELEASE/version
/dependency②application中新增Eureka配置 # Eureka配置配置服务注册中心地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/③为启动类添加EnableEurekaCliet注解 SpringBootApplication
// EnableEurekaClient 开启Eureka客户端注解在服务启动后自动向注册中心注册服务
EnableEurekaClient
public class DeptProvider_8001 {public static void main(String[] args) {SpringApplication.run(DeptProvider_8001.class,args);}
}注意先开启7001服务注册中心Eureka再开启8001的服务提供者
④测试效果服务成功注册
⑤修改eureka上的默认描述信息 成功修改 ⑥停掉8001的服务提供者的服务查看服务注册中心Eureka的变化
自我保护机制的触发 ⑦配置服务加载的监控信息info 1导入依赖 !--actuator完善监控信息--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependency2application.yml中添加配置 # info配置
info:
# 项目的名称
app.name: kdz-springcloud
# 公司的名称
company.name: LBJ烹饪公司 测试结果 3. EureKa自我保护机制好死不如赖活着
一句话总结就是某时刻某一个微服务不可用eureka不会立即清理依旧会对该微服务的信息进行保存 默认情况下当eureka server在一定时间内没有收到实例的心跳便会把该实例从注册表中删除默认是90秒但是如果短时间内丢失大量的实例心跳便会触发eureka server的自我保护机制比如在开发测试时需要频繁地重启微服务实例但是我们很少会把eureka server一起重启因为在开发过程中不会修改eureka注册中心当一分钟内收到的心跳数大量减少时会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last min)当后者最后一分钟收到的心跳数小于前者心跳阈值的时候触发保护机制会出现红色的警告EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEYRE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.从警告中可以看到eureka认为虽然收不到实例的心跳但它认为实例还是健康的eureka会保护这些实例不会把它们从注册表中删掉。 该保护机制的目的是避免网络连接故障在发生网络故障时微服务和注册中心之间无法正常通信但服务本身是健康的不应该注销该服务如果eureka因网络故障而把微服务误删了那即使网络恢复了该微服务也不会重新注册到eureka server了因为只有在微服务启动的时候才会发起注册请求后面只会发送心跳和服务列表请求这样的话该实例虽然是运行着但永远不会被其它服务所感知。所以**eureka server在短时间内丢失过多的客户端心跳时会进入自我保护模式**该模式下eureka会保护注册表中的信息不在注销任何微服务当网络故障恢复后eureka会自动退出保护模式。自我保护模式可以让集群更加健壮。 但是我们在开发测试阶段需要频繁地重启发布如果触发了保护机制则旧的服务实例没有被删除这时请求有可能跑到旧的实例中而该实例已经关闭了这就导致请求错误影响开发测试。所以在开发测试阶段我们可以把自我保护模式关闭只需在eureka server配置文件中加上如下配置即可eureka.server.enable-self-preservationfalse【不推荐关闭自我保护机制】
4. 注册进来的微服务获取一些消息团队开发会用到
①从源码中找到discovery的接口同时也要查看的它的实现方法 ②DeptController增加方法 /*** DiscoveryClient 可以用来获取一些配置的信息得到具体的微服务*/
Autowired
private DiscoveryClient client;/*** 获取一些注册进来的微服务的信息~** return*/
GetMapping(/dept/discovery)
public Object discovery() {// 获取微服务列表的清单ListString services client.getServices();System.out.println(discoveryservices: services);// 得到一个具体的微服务信息,通过具体的微服务idapplicaioinNameListServiceInstance instances client.getInstances(SPRINGCLOUD-PROVIDER-DEPT);for (ServiceInstance instance : instances) {System.out.println(instance.getHost() \t // 主机名称instance.getPort() \t // 端口号instance.getUri() \t // uriinstance.getServiceId() // 服务id);}return this.client;
} getInstances()方法里面的参数是服务的id名
③源码getInstances()方法中可以配置的属性 只有get方法没有set方法
④配置监控信息 ⑤启动类上新增注解EnableDiscoveryClient ⑥启动单一模块服务即可不要全部重新启动千万不要老是服务注册中心Euraka反复启动 ⑦测试效果
一开始服务没有被服务中心监控到虽然重启了但是也是需要时间的所以获得的消息是空白的 成功获得监控信息 5.4 Eureka集群环境配置 1.初始化工作
新建springcloud-eureka-7002、springcloud-eureka-7003 模块
①3个模块的pom文件都添加依赖 !--导包~--
dependencies!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --!--导入Eureka Server依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka-server/artifactIdversion1.4.6.RELEASE/version/dependency!--热部署工具--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactId/dependency
/dependencies②3个模块的application.yml配置一样(除了端口号) server:port: 7003# Eureka配置
eureka:instance:hostname: localhost # Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)fetch-registry: false # fetch-registry如果为false,则表示自己为注册中心service-url: # 监控页面~# 重写Eureka的默认端口以及访问路径 ---http://localhost:7001/eureka/defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/③启动类都是一样的除了名字 SpringBootApplication
// EnableEurekaServer 服务端的启动类可以接受别人注册进来~
public class EurekaServer_7003 {public static void main(String[] args) {SpringApplication.run(EurekaServer_7003.class,args);}
}2.集群互相关联
①配置IP和域名的映射为了让一台电脑看起来像3台电脑 注意路径 ② 修改application.yml的配置如图为springcloud-eureka-7002配置springcloud-eureka-7001/springcloud-eureka-7003同样分别修改为其对应的名称即可 3个服务注册中心集群都关联一下修改application.yml中的defaultZone属性例如http://eureka7001.com:7001/eureka/ 的形式3个都互相关联一下 server:port: 7001#Eureka配置
eureka:instance:hostname: eureka7001.com #Eureka服务端的实例名字client:register-with-eureka: false #表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心service-url: #监控页面~#重写Eureka的默认端口以及访问路径 ---http://localhost:7001/eureka/# 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群关联7001关联7002、7003defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/③设置8001服务提供者的服务都分别注册提供到这3个服务注册中心里面分别输入3个服务注册中心的访问的url链接就可以了注意格式 # Eureka配置配置服务注册中心地址
eureka:client:service-url:# 注册中心地址7001-7003defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 #修改Eureka上的默认描述信息修改Eureka配置配置服务注册中心地址
④分别开启7001、7002、7003端口的集群 分别访问对应的IP和域名的映射
注册服务 最后这样一个项目就会被挂载在3个服务注册中心的集群上面了无论哪一个宕机掉另外的服务注册中心都可以正常工作
5.5 对比和Zookeeper区别
1. 回顾CAP原则
RDBMS (MySQL\Oracle\sqlServer) ACID
NoSQL (Redis\MongoDB) CAP
2. ACID是什么
A (Atomicity) 原子性C (Consistency) 一致性I (Isolation) 隔离性D (Durability) 持久性
3. CAP是什么?
C (Consistency) 强一致性A (Availability) 可用性P (Partition tolerance) 分区容错性
CAP的三进二CA、AP、CP
4. CAP理论的核心
一个分布式系统不可能同时很好的满足一致性可用性和分区容错性这三个需求根据CAP原理将NoSQL数据库分成了满足CA原则满足CP原则和满足AP原则三大类
CA单点集群满足一致性可用性的系统通常可扩展性较差
CP满足一致性分区容错的系统通常性能不是特别高
AP满足可用性分区容错的系统通常可能对一致性要求低一些
5. 作为分布式服务注册中心Eureka比Zookeeper好在哪里
著名的CAP理论指出一个分布式系统不可能同时满足C (一致性) 、A (可用性) 、P (容错性)由于分区容错性P再分布式系统中是必须要保证的因此我们只能再A和C之间进行权衡。
Zookeeper 保证的是 CP — 满足一致性分区容错的系统通常性能不是特别高Eureka 保证的是 AP — 满足可用性分区容错的系统通常可能对一致性要求低一
Zookeeper保证的是CP
当向注册中心查询服务列表时我们可以容忍注册中心返回的是几分钟以前的注册信息但不能接收服务直接down掉不可用。也就是说服务注册功能对可用性的要求要高于一致性。但zookeeper会出现这样一种情况当master节点因为网络故障与其他节点失去联系时剩余节点会重新进行leader选举。问题在于选举leader的时间太长30-120s且选举期间整个zookeeper集群是不可用的这就导致在选举期间注册服务瘫痪。在云部署的环境下因为网络问题使得zookeeper集群失去master节点是较大概率发生的事件虽然服务最终能够恢复但是漫长的选举时间导致注册长期不可用是不可容忍的。
Eureka保证的是AP
Eureka看明白了这一点因此在设计时就优先保证可用性。Eureka各个节点都是平等的几个节点挂掉不会影响正常节点的工作剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时如果发现连接失败则会自动切换至其他节点只要有一台Eureka还在就能保住注册服务的可用性只不过查到的信息可能不是最新的除此之外Eureka还有之中自我保护机制如果在15分钟内超过85%的节点都没有正常的心跳那么Eureka就认为客户端与注册中心出现了网络故障此时会出现以下几种情况
Eureka不在从注册列表中移除因为长时间没收到心跳而应该过期的服务Eureka仍然能够接受新服务的注册和查询请求但是不会被同步到其他节点上 (即保证当前节点依然可用)当网络稳定时当前实例新的注册信息会被同步到其他节点中
因此Eureka可以很好的应对因网络故障导致部分节点失去联系的情况而不会像zookeeper那样使整个注册服务瘫痪
SpringCloud-Eureka服务注册中心测试实践 到此完结笔者归纳、创作不易大佬们给个3连再起飞吧