❤ Java极客技术,你值得星标的公众号

分布式系统面试系列02-Spring Cloud 的底层架构原理,前面我们讲了

前面我们讲了一个以Spring Cloud 技术栈实现的分布式系统,至少得包含 Eureka、Ribbon、Feign、Zuul 这么几个组件,你还能记得他们各自是干嘛的么。记不清了没关系,回去看一下这篇文章就好。

Eureka

首先,我们得说说服务注册中心 Eureka 了,它应该是SpringCloud 技术栈中最核心的东西。

服务注册与发现怎么实现的

服务注册与发现是 Eureka 中最核心的东西。

比如现在我们有一个服务消费者 服务A,和两个节点的服务提供者,服务B。服务A 和服务B 在启动的时候都会向注册中心进行服务注册。

服务A 也会定时从服务注册中心定时去拉取服务注册表信息到本地来,这个过程叫服务发现,默认是30S 一次,当然了可以自己去配置。

如下图:

实际上当服务在拉取服务注册表的时候,其实客户端不是直接从 Eureka 中的 服务注册表中获取数据的。

Eureka 做了二级缓存,第一级叫做 ReadOnly 缓存,二级叫做 ReadWrite 缓存。

客户端会直接从ReadOnly 缓存中读取注册表信息。

当服务在进行注册的时候,先往服务注册表中写入注册信息,服务注册表更新了,立马会同步一份数据到 ReadWrite 缓存中去。

那什么时候 ReadWrite 缓存中的数据会到 ReadOnly 缓存中去?

此时有一个定时任务会定时去检查 ReadWrite 是否跟  ReadOnly 不一致,不一致就把数据同步到 ReadOnly 中去。

这个定时任务也默认是 30S。也可以自己配置。

大家可以考虑一下,这么做的好处是什么,为什么要这么去做二级缓存?

这么做的好处在于,优化并发读写的冲突。

如果服务进行注册的时候,同时有服务来读去注册表信息,就会存在频繁的读写加锁的操作,写的时候就不能读,导致性能下降,所以我们需要避免大量的读写都去操作一个表。

那么有了这两层,其实大部分的读操作都会走 ReadOnly 缓存。只需要定时把 ReadWrite 缓存中的数据写入到 ReadOnly 就好了。

心跳与故障检测

服务注册中心还有一个很重要的功能就是 心跳与故障检查。心跳跟故障检测其实就是为了知道注册上来的这些服务是不是还活着的。

Eureka 还会开启一个定时任务定时去检查心跳,默认也是30秒,也可以自己设置。

当出现机器故障没有在约定的时间间隔内上报自己的状态,那么Eureka 就会把这台机器剔除注册表,同时更新到 ReadWrite 缓存中去。如图:

但是把数据从ReadWrite 缓存同步到 ReadOnly 缓存是有时间间隔的。当服务消费者A 也只有等待下一次请求更新的时候才会把自己列表里面的服务给更新掉。

所以有时候会出现你注册上去的服务经过及时秒才被服务消费者发现,或者服务的某个节点出现故障,没有及时剔除掉。这里就是同步机制的时间差问题。

以上就是 Eureka 的核心运行原理了。

Feign & Ribbon

Feign,它其实就是对一个接口打了一个注解,它会针对这个注解标注的接口生成动态代理对象,然后针对你的 feign 的动态代理代理对象去调用他方法的时候,此时会在底层生成,http 协议格式的请求如:/order/create?productId=1

Feign底层的使用的HTTP 通信框架 HttpClient ,先会使用 Ribbon 从本地的 Eureka 注册表的缓存里面取出要调用服务的机器列表出来,然后根据负载均衡算法,选择一台机器出来,然后针对选择出来的机器发送 Http 请求过去。

Zuul

Zuul 配置请求路径与服务的对应关系,你的请求到网关,他就直接查找到匹配的服务,然后就直接把请求转发给那个服务的某台机器, Ribbon 从 Eureka 本地缓存列表里面获取一台机器,然后通过负载均衡算法选择一台,把请求直接用 http 通信框架发送到指定的机器上面去。

Hystrix

在微服务的架构中,会存在很多的服务调用,如果一个服务出现故障,就很容易导致整个调用链发生故障,发生服务雪崩的情况。

例如,当一个服务出现故障,或者超时的问题,但是服务调用方不知道,一直在发送请求过去,那么等待的请求越来越多,形成任务积压,最终导致服务崩溃,瘫痪。

Hystrix 的出现就是为了解决这种问题。它提供了服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。

Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的依赖服务。

<End>

往期精彩文章

1、
2、

3、

PS:原创不易,喜欢就点个在看 or 转发朋友圈,这将是我们最强的写作动力。后台回复「666」即可获取最新一期电子书。

面试官:兄弟,说说 Spring Cloud 的底层架构原理吧相关推荐

  1. 面试官:说说Spring Cloud底层原理?

    点击上方"蓝字", 右上角选择"设为星标" 周一至周五上午11:45!精品文章准时送上! 本文转载自公众号:石杉的架构笔记 目录 一.业务场景介绍 二.Spri ...

  2. 面试官:连Spring三级缓存都答不好,自己走还是我送你?

    面试官:简历上写了精通Spring,那你回答一下Spring为什么用"三级缓存"去解决循环依赖? 我:.......应该有三个缓存的map结构 面试官:具体回答一下 我:平时没认真 ...

  3. 【200期】面试官问:Spring Security 和 Shiro 该如何选择?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  4. 面试官:为什么 Spring Boot 的 jar 可以直接运行

    转载自  面试官:为什么 Spring Boot 的 jar 可以直接运行 来源:Gormat's Notes fangjian0423.github.io/2017/05/31/springboot ...

  5. 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结

    Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经走了一年多. 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的.从 ...

  6. 《Spring Cloud微服务架构实战派》PDF样章

    内容摘要: 本书针对Spring Cloud Greenwich.SR2版本+Spring Boot的2.1.x.RELEASE版本.在编写过程中,不仅考虑到在企业任职所需的技能,还考虑到求职面试时可 ...

  7. 《Spring Cloud 微服务架构进阶》读书笔记

    前页 随着 DevOps 和以 Docker 为主的容器技术的发展,云原生应用架构和微服 务变得流行起来. 云原生包含的内容很多,如 DevOps.持续交付.微服务.敏捷等 第一章,微服务架构介绍 架 ...

  8. spring cloud云服务架构 - particle云架构代码结构讲解

    上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构,简单的按照几个大的部分去构建代码模块,让我们来回顾一下: 第一部分: 针对于普通服务的基础框架封装(entity ...

  9. 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理

    网络模型介绍 在计算机网络中有著名的OSI七层协议体系结构,概念清楚,理论完整,但是它既复杂又不实用.TCP/IP体系结构则不同,得到了广泛的应用.最终结合OSI和TCP/IP的优点,采用了一种只有五 ...

最新文章

  1. C++11中头文件atomic的使用
  2. 即时通讯下数据粘包、断包处理实例(基于CocoaAsyncSocket)
  3. 【转载】Linux系统与性能监控
  4. 算法--------打家劫舍(动态规划,Java版本)
  5. Android stadio 关联源码
  6. salesforce bigobject 的限制_苹果进一步限制第三方维修
  7. 计算机语言 时间,甲骨文将ISO日期到计算机的语言环境日期/时间
  8. Oolong and Gnoloo
  9. PHPJavaScript笔记-后端利用Refresh头带错误信息给前端(野路子操作)
  10. UVA10733 The Colored Cubes【Polya定理】
  11. Python爬虫之一键保存全部必应高清1080P壁纸
  12. 百度文库文档免费下载教程
  13. 【Xilinx JESD204B】针对JESD204B的一些问题解答
  14. python 计算字符串表达式_python计算数学表达式
  15. 7.2 可分离变量的微分方程
  16. ESP32用自签CA进行MQTT的TLS双向认证通信
  17. Android通知Notification使用全解析,看这篇就够了
  18. 7月14日第壹简报,星期四,农历六月十六
  19. python爬取pbf格式的矢量瓦片并转换为shp使用
  20. HFSS仿真线型抛物面圆极化天线

热门文章

  1. C# 内存泄漏之 Internal 关键词代表什么?
  2. 如何用python实时监控股票,并且持续扫描大盘?
  3. 北大青鸟重庆大学城校区:初中生学it容易吗?
  4. RT-Thread 的 CPU 固件移植理解
  5. 通过脑电图/脑磁图观察到的大脑活动来指导经颅脑刺激
  6. 其实这4种电话号码,很可能是诈骗电话!碰到了最好不要接
  7. python搜索关键词自动提交_Python自动搜索关键词采集信息—以京东为例!
  8. NTFS和FAT32分别是什么意思?他们两有什么区别?各自的作用分别是什么?
  9. CDA数据分析师发布官方吉祥物“赵安豆”
  10. 20201129_091.实例方法_内存分析方法调用过程_dir()_isinstance