1 Spring Cloud Eureka服务治理(下)
注:此随笔为读书笔记。《Spring Cloud微服务实战》,想学习Spring Cloud的同伴们可以去看看此书,里面对源码有详细的解读。
上篇主要介绍了什么是微服务以及微服务治理的简单实现,如微服务注册中心的实现、微服务注册的实现、微服务的发现和消费的实现、微服务注册高可用的实现。本篇主要介绍一下微服务治理机制。服务治理基础架构有是三个核心要素:服务注册中心、服务提供者、服务消费者,服务提供者一般执行服务注册、服务同步、服务续约任务,服务消费者会执行获取服务、服务调用、服务下线任务,服务注册中心会执行失效剔除、自我保护任务。下面一一理解。

场景:
有两个服务注册中心,互相注册组成高可用集群;
服务提供者启动两个实例,一个注册在注册中心1中,一个注册在注册中心2中;(疑问:这里我试了,服务只指向一个注册中心,只启动一个实例,两个注册中心都会有刚启动的服务,这应该也算服务同步吧)
有两个服务消费者,一个指向注册中心1中,一个指向注册中心2中。
1.服务提供者
1.服务注册
服务提供者在启动的时候会发送REST请求将自己注册到注册中心,同时带上了自身服务的一些元数据信息。注册中心接收到请求后,将元数据信息存储在一个双层结构Map中,其中第一层的Key是服务名,第二层的Key是具体服务的实例名。如Ribbon负载均衡的例子中,一个服务有多个实例的情况。
2.服务同步
由于服务注册中心之间互相注册为服务,当服务提供者发送注册请求到其中一个注册中心时,它会将请求转发给集群中相连的其他注册中心,此时集群中所有的注册中心都会注册该服务实例,从而实现注册中心之间的服务同步。通过服务同步,消费者就可以通过这两个注册中心的任意一个获取到两个服务提供者的服务信息。
解释:哪些服务是被服务A同步的呢?
即各个注册中心中和服务A的服务名、端口号都相同的服务。
注册中心1:

注册中心2:

3.服务续约
在服务注册完之后,服务提供者会维护一个心跳来告诉注册中心自己还活着,以防止注册中心的“剔除任务”将该服务实例从服务列表剔除,我们把该操作称为续约。
eureka.instance.lease-renewal-interval-in-seconds=30 #服务续约任务的调用间隔时间,默认为30秒
eureka.instance.lease-expiration-duration-in-seconds=90 #定义服务失效的时间,默认90秒
2.服务消费者
1.获取服务
到这里,服务注册中心都注册了一个服务,并且该服务都拥有两个服务实例。当我们启动服务消费者的时候,会发送REST请求给注册中心,来获取注册中心的服务清单。为了性能考虑,注册中心会维护一份只读的服务清单返回给客户端,该缓存清单默认30秒更新一次。
eureka.client.fetch-register=true #确定会获取注册中心的服务清单
eureka.client.fetch-register-interval-seconds=30 #缓存清单的更新时间,默认30秒
2.服务调用
服务消费者获取到服务清单后,通过服务名可以获得服务提供的服务实例名和该实例的元数据信息,由于服务实例有详细的元数据信息,因而客户端可以根据自己的需要调用哪个服务实例,在Spring Cloud Ribbon中采用轮询的方式进行调用,从而实现客户端的负载均衡。
3.服务下线
当服务挂掉后,会触发下线的REST请求给注册中心,注册中心收到请求后会将该服务的状态设置成“DOWN”,并把下线事件传播出去。
3.服务注册中心
1.失效剔除
有些时候我们的服务不会正常下线,有可能是内存溢出、网络故障等原因导致服务不可用,而注册中心并外收到服务下线请求。为了从服务列表中将无法提供的服务正确剔除,注册中心在启动的时候会创建一个定时任务,每隔一段时间(默认60秒)将当前服务清单中超时(默认90秒)没有续约的服务剔除。
2.自我保护
服务注册到注册中心后,会维护一个心跳连接,告诉注册中心自己还活着。注册中心在运行期间,会统计该服务心跳失败的比例,15分钟低于85%(在开发环境,debug调试的时候很容易出现;生成环境网络不稳定会导致) 的情况下,注册中心会将服务信息保存起来,让这些服务实例不会过期,更不会剔除服务实例。但是这段时间服务实例若出现问题,那么消费者很容易拿到不可用的服务实例,从而出现调用失败的情况。所以客户端需要有容错机制,比如使用请求重试、断路由等机制。
我们公司内部产品遇到过这种情况,用户登录系统时有时候超时最终返回错误页面,有时候就可以正常登录。当时确定的影响因素是网络非常不稳定,那么在网络稳定性问题解决之前,服务需要正常访问,当时采用的方案是请求重试机制,一般在第二次请求时便会请求成功,而且速度和网络良好的情况差不多。qa那边也会认为这个问题解决了。当然,网络正常后,服务也会正常访问。现在看来,原来是注册中心的自我保护机制导致的。解决方案就是请求重试和断路由等机制了。
由于在本地开发的时候,debug调试,会经常引起注册中心自我保护机制,所以,在本地开发的时候可以关闭注册中心的自我保护机制,以确保注册中心将不可用的服务立即剔除。
eureka.server.enable-self-preservation=false #关闭自我保护机制
1 Spring Cloud Eureka服务治理(下)的更多相关文章
- 笔记:Spring Cloud Eureka 服务治理
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...
- Spring Cloud Eureka 服务治理
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...
- Spring cloud Eureka 服务治理(搭建服务注册中心)
服务之类是微服务架构中最为核心的基础模块,它主要用来实现各个微服务实例的自动化注册和发现. 1. 服务注册 在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机. ...
- 1 Spring Cloud Eureka服务治理
注:此随笔为读书笔记.<Spring Cloud微服务实战> 什么是微服务? 微服务是将一个原本独立的系统拆分成若干个小型服务(一般按照功能模块拆分),这些小型服务都在各自独立的进程中运行 ...
- Spring cloud Eureka 服务治理(注册服务提供者)
搭建完成服务注册中心,下一步可以创建服务提供者并向注册中心注册服务. 接下来我们创建Spring Boot 应用将其加入Eureka服务治理体系中去. 直接使用签名章节创建hello服务项目改造: 1 ...
- 1 Spring Cloud Eureka服务治理(上)
注:此随笔为读书笔记.<Spring Cloud微服务实战>,想学习Spring Cloud的同伴们可以去看看此书,里面对源码有详细的解读. 什么是微服务? 微服务是将一个原本独立的系统拆 ...
- Spring cloud Eureka 服务治理(高可用服务中心)
在微服务的架构中,我们考虑发生故障的情况,所以在生产环境中我们需要对服务中各个组件进行高可用部署. Eureka Server 的高可用实际上就是将自己作为服务想其它服务注册中心注册自己,这样就形成了 ...
- Spring Cloud Eureka 服务治理机制
服务提供者 服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server 接收到这个RE ...
- spring cloud Eureka 服务注册发现与调用
记录一下用spring cloud Eureka搭建服务注册与发现框架的过程. 为了创建spring项目方便,使用了STS. 一.Eureka注册中心 1.新建项目-Spring Starter Pr ...
随机推荐
- decimal扩展方法(转换为字符串,去掉末尾的0)
/// <summary> /// 转换为字符串,去掉末尾0 /// </summary> /// <param name="target">被 ...
- java模拟斗地主发牌看牌
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class Dou ...
- spring boot整合jsp的那些坑(spring boot 学习笔记之三)
Spring Boot 整合 Jsp 步骤: 1.新建一个spring boot项目 2.修改pom文件 <dependency> <groupId>or ...
- 【渗透笔记】拿下某小H网的全过程
自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...
- virtualbox下正确虚拟机修改设备名称
在学习大数据管理过程中,想要修改虚拟机的设备名称(因为名称太长),所以就直接在右上角的设置中找到详细设置,直接修改设备名称,结果启动Hadoop失败!!!! 后来参考网上问题解决弄好了,现在给出修改设 ...
- webpack教程(六)——分离组件代码
先来运行一下webpack命令, 看到app.js才4k. 安装一下react npm install react --sava-dev 在app/index.js文件内引入react 运行webpa ...
- 一台电脑 一起跑python2 python3
我习惯使用python2.7,命令都是使用的python和pip,这时候装了python3.4,首先到python3下修改python.exe,pythonw.exe为python3.exe,pyth ...
- 开源的API集成测试工具 v0.1.2 - 增强体验
Hitchhiker 是一款开源的 Restful Api 集成测试工具,你可以在轻松部署到本地,和你的team成员一起管理Api. 详细介绍请看: http://www.cnblogs.com/br ...
- 改变input光标颜色与输入字体颜色不同
设置input css: color #ffd600text-shadow 0px 0px 0px #bababa -webkit-text-fill-color initial input, tex ...
- Java 类的热替换 —— 概念、设计与实现
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp71 Java 类的热替换 -- 概念.设计与实现 构建基于 Java ...