基础架构

  • 服务注册中心:Eureka提供的服务端,提供服务注册于发现的功能,也就是在上一节中我们实现的eureka-server

  • 服务提供者:提供服务的应用,可以是springBoot应用,也可以是其他技术平台且遵循Eureka通信机制的应用。它将

        自己提供的服务注册到Eureka,以供其他应用发现,也就是上一节中我们实现的HELLO-SERVICE应用。

  • 服务消费者:消费者应用从服务注册中心获取服务列表,从而使消费者可以知道从何处调用其所需要的服务,在上一节

        使用了Ribbon来实现服务消费,另外后续还需介绍是哦那个Feign的消费方式。

很多时候客户端既是服务提供者也是服务消费者。

服务治理机制

  根据上面的结构,我们来详细了解一下,从服务注册开始到服务调用,及各个元素涉及的一些重要通信行为

服务提供者

  1.服务注册

      “服务提供者”在启动的时候会通过发送REST请求的方式将自己注册到EurekaServer上,同时带了自身服务的一些元

数据信息。Eureka Server接收到这个REST请求之后,将元素据信息存储在一个双层结构的MAP中,其中,第一层的key是服务名,

第二层的key是具体服务的实例名。一个服务有多个实例的情况下,这些内容就是以这样的双层Map形式存储的。

    在服务注册时,需要确认下eureka.client.register-with-eureka=true 参数是否正确,该值默认为true。若设置为false将不会启动注册操作。

  2.服务同步。

      两个服务提供者分别注册到了两个不同的服务注册中心上,也就是说,他们的信息分别被两个服务注册中心所维护。

此时,由于服务注册中心之间因互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将请求转发给集群中

相连的其他注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个服务提供者的服务信息就可以通过这两台服务注册中心的任意一台获取。

  3.服务续约

      在注册完服务之后,服务提供者会维护一个心跳用来持续告诉EurekaServer:"我还活着,"以防止Eureka Server的”剔除任务“将该服务实例从服务列表中排除出去。

我们称该操作为服务续约。(Renew)

  

服务消费者

  1.获取服务

      到这里,在服务注册中心已经注册了一个服务,并且该服务有两个实例。当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取

上面的服务清单,为了性能考虑,Eureka Server会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每隔30s更新一次。

      

   2.服务调用

      服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息因为有这些服务实例

的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而使客户端负载均衡。

      对于访问实例的选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone,每个服务客户端需要被注册到一个

Zone中,所以每个客户端对应一个Region和一个Zone。在进行服务调用的时候,优先访问同处一个Zone中的服务提供方。

  3.服务下线

       在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭期间,我们自然不希望客户端会继续调用关闭了的实例。所以在客户端

程序中,当服务实例进行正常的关闭操作时,它会出发一个服务下线的REST请求给EurekaServer,告诉服务注册中心:”我要下线了“。服务端接收到请求之后,将

该服务状态置为down。并把下线事件传播出去。

服务注册中心

  1.失效剔除 

      有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出,网络故障等原因使服务不能正常工作,而服务注册中心未

收到”服务下线“的请求。为了从服务列表中将这些无法提供服务的实例剔除。Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间

(默认60s)将当前清单中超时(默认为90s)没有续约的服务剔除出去。

  2.自我保护

      当我们在本地调试基于Eureka的程序时,基本上都会碰到一个这样的问题,在服务注册宗信的信息面板出现类下面

的警告信息:

实际上,该警告就出发了Eureka Server的自我保护机制。服务注册到Eureka Server之后,会维护一个心跳连接,告诉Eureka Server自己还活着。

Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于80%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来

让这些实例不会过期,尽可能保护这些注册信息。但是,这段保护期间内实例出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,

所以客户端必须要有容错机制,比如可以使用请求重试,断路器机制等。

  

Spring Cloud Eureka的基础架构的更多相关文章

  1. 微服务架构之spring cloud eureka

    Spring Cloud Eureka是spring cloud的核心组件,负责服务治理功能,起到中心枢纽作用,其它组件都依赖eureka来获取服务,然后再根据项目需求实现自己的业务,eureka在整 ...

  2. Spring Cloud构建微服务架构(一)服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  3. 1 Spring Cloud Eureka服务治理

    注:此随笔为读书笔记.<Spring Cloud微服务实战> 什么是微服务? 微服务是将一个原本独立的系统拆分成若干个小型服务(一般按照功能模块拆分),这些小型服务都在各自独立的进程中运行 ...

  4. 笔记:Spring Cloud Eureka 服务治理

    Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...

  5. Spring Cloud微服务笔记(三)服务治理:Spring Cloud Eureka快速入门

    服务治理:Spring Cloud Eureka 一.服务治理 服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现. 1.服务注册: 在服务治理框架中,通常会构 ...

  6. Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】

    转载:http://blog.didispace.com/spring-cloud-starter-dalston-6-2/ 原创  2017-08-26  翟永超  Spring Cloud 被围观 ...

  7. Spring Cloud构建微服务架构(五)服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...

  8. 第三章 服务治理:Spring Cloud Eureka

    Spring Cloud Eureka是Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能.Spri ...

  9. Spring Cloud构建微服务架构 - 服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

随机推荐

  1. 《Effective C#》读书笔记——条目13:正确地初始化静态成员变量<.NET资源管理>

      我们知道在C#语言中创建一个类型的实例前,就应该初始化该类型的所有静态成员变量.C#语言为我们提供了静态初始化器和静态构造函数.其中,静态构造函数是一个特殊的构造函数,将在其他所有方法执行前以及变 ...

  2. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  3. halcon之屌炸天的变形匹配(1)

    在日常工程应用中,我们通常通过halcon的 shape-based matching(形状匹配)进行各种定位, 如以前文章介绍的这样,理解各个参数并灵活应用通常就能得到很好的匹配效果和匹配速度, 当 ...

  4. rabbitmq之window环境启动

    rabbitmq启动方式有2种 1.以应用方式启动 rabbitmq-server -detached 后台启动 Rabbitmq-server 直接启动,如果你关闭窗口或者需要在改窗口使用其他命令时 ...

  5. centos6.9使用yum安装mysql(简单粗暴,亲测有效)

    第1步.yum安装mysql[root@stonex ~]#  yum -y install mysql-server安装结果:Installed:    mysql-server.x86_64 0: ...

  6. 利用Sonar定制自定义JS扫描规则(一)——sonar环境搭建

    接触sonar已经有段时间了,最早是在一个项目组里面听到这个框架,后来在公司持续集成活动的推动下,也逐渐学习了sonar的具体功能.sonar集成了findbugs,pmd,checkstyle各种静 ...

  7. BootStrap使用

    BootStrap简单使用 <深入理解BootStrap>这本书对BootStrap进行了全面的讲解包括设计思想以及源码解析对没有接触过的很有帮助 BootStrap可以说是最简单的一类框 ...

  8. Field 'id' doesn't have a default value 原因

    Field 'id' doesn't have a default value昨晚做项目的时候遇到一个问题,在测试数据存储的时候老是报Field 'id' doesn't have a default ...

  9. Editor does not contain a main type

    1.错误描述 2.错误原因 在含有main方法的类中,运行应用程序,却提示这个错误:编译器不包含main类型 3.解决办法 (1)选择该Java类上一级文件,build path--->use ...

  10. 链表的实现、输出和反向 python

    链表节点包含两个元素:节点的值和指向的下一个节点,因此可以定义链表的类为: class linknode: def __init__(self,value=None,next=None): self. ...