• UID20502
  • 登录2017-11-16
  • 粉丝0
  • 关注0
  • 发帖48
  • 主页
  • 金币124枚
万万558 发布于2017-11-02 11:26
0/43

关于Spring Cloud微服务架构

楼层直达
微服务架构

Spring Cloud解决的第一个问题就是:服务与服务之间的解耦。很多公司在业务高速发展的时候,服务组件也会相应的不断增加。服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身。经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发。这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖。Spring Cloud 核心组件Eureka就是解决这类问题。

Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是Spring Cloud体系中最重要最核心的组件之一。

用大白话讲,Eureka就是一个服务中心,将所有的可以提供的服务都注册到它这里来管理,其它各调用者需要的时候去注册中心获取,然后再进行调用,避免了服务之间的直接调用,方便后续的水平扩展、故障转移等。如下图:

当然服务中心这么重要的组件一但挂掉将会影响全部服务,因此需要搭建Eureka集群来保持高可用性,生产中建议最少两台。随着系统的流量不断增加,需要根据情况来扩展某个服务,Eureka内部已经提供均衡负载的功能,只需要增加相应的服务端实例既可。那么在系统的运行期间某个实例挂了怎么办?Eureka内容有一个心跳检测机制,如果某个实例在规定的时间内没有进行通讯则会自动被剔除掉,避免了某个实例挂掉而影响服务。

因此使用了Eureka就自动具有了注册中心、负载均衡、故障转移的功能。

Hystrix
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

如下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。

在这种情况下就需要整个服务机构具有故障隔离的功能,避免某一个服务挂掉影响全局。在Spring Cloud 中Hystrix组件就扮演这个角色。

Hystrix会在某个服务连续调用N次不响应的情况下,立即通知调用端调用失败,避免调用端持续等待而影响了整体服务。Hystrix间隔时间会再次检查此服务,如果服务恢复将继续提供服务。

Hystrix Dashboard和Turbine
当熔断发生的时候需要迅速的响应来解决问题,避免故障进一步扩散,那么对熔断的监控就变得非常重要。熔断的监控现在有两款工具:Hystrix-dashboard和Turbine
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine. 监控的效果图如下:

配置中心
随着微服务不断的增多,每个微服务都有自己对应的配置文件。在研发过程中有测试环境、UAT环境、生产环境,因此每个微服务又对应至少三个不同环境的配置文件。这么多的配置文件,如果需要修改某个公共服务的配置信息,如:缓存、数据库等,难免会产生混乱,这个时候就需要引入Spring Cloud另外一个组件:Spring Cloud Config。

Spring Cloud Config
Spring Cloud Config是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,Server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,Client通过接口获取数据、并依据此数据初始化自己的应用。

其实就是Server端将所有的配置文件服务化,需要配置文件的服务实例去Config Server获取对应的数据。将所有的配置文件统一整理,避免了配置文件碎片化。

如果服务运行期间改变配置文件,服务是不会得到最新的配置信息,需要解决这个问题就需要引入Refresh。可以在服务的运行期间重新加载配置文件。

当所有的配置文件都存储在配置中心的时候,配置中心就成为了一个非常重要的组件。如果配置中心出现问题将会导致灾难性的后果,因此在生产中建议对配置中心做集群,来支持配置中心高可用性。

Spring Cloud Bus
上面的Refresh方案虽然可以解决单个微服务运行期间重载配置信息的问题,但是在真正的实践生产中,可能会有N多的服务需要更新配置,如果每次依靠手动Refresh将是一个巨大的工作量,这时候Spring Cloud提出了另外一个解决方案:Spring Cloud Bus

Spring Cloud Bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其它的消息指令中。Spring Cloud Bus的一个核心思想是通过分布式的启动器对Spring Boot应用进行扩展,也可以用来建立一个或多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道。

Spring Cloud Bus是轻量级的通讯组件,也可以用在其它类似的场景中。有了Spring Cloud Bus之后,当我们改变配置文件提交到版本库中时,会自动的触发对应实例的Refresh,具体的工作流程如下:

服务网关
在微服务架构模式下,后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。

Spring Cloud体系中支持API Gateway落地的技术就是Zuul。Spring Cloud Zuul路由是微服务架构中不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

它的具体作用就是服务转发,接收并转发所有内外部的客户端调用。使用Zuul可以作为资源的统一访问入口,同时也可以在网关做一些权限校验等类似的功能。

链路跟踪
随着服务的越来越多,对调用链的分析会越来越复杂,如服务之间的调用关系、某个请求对应的调用链、调用之间消费的时间等,对这些信息进行监控就成为一个问题。在实际的使用中我们需要监控服务和服务之间通讯的各项指标,这些数据将是我们改进系统架构的主要依据。因此分布式的链路跟踪就变的非常重要,Spring Cloud也给出了具体的解决方案:Spring Cloud Sleuth和Zipkin

Spring Cloud Sleuth为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长时间。从而让我们可以很方便的理清各微服务间的调用关系。

Zipkin是Twitter的一个开源项目,允许开发者收集 Twitter 各个服务上的监控数据,并提供查询接口。源码来源

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 79139/378   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 45196/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 44909/0   Python爬虫:常用浏览器的useragent

  • 41330/260   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 38619/145   省时省力的Android组件群来了,非常棒的原型参考

  • 29983/142   2016抢红包软件及源码

  • 29263/2   超全!整理常用的iOS第三方资源

  • 29251/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 24271/160   Android版类似UC浏览器:非常赞,产品级的源码

  • 22850/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22545/25   Android工程师面试题大全

  • 22452/27   2016程序员跳槽全攻略

  • 21936/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20889/20   码魂:程序员的牛B漫画

  • 19016/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 19010/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 18996/10   2016年最全的Android面试考题+答案 精编版

  • 18869/42   一个绚丽的loading动效分析与实现!

  • 18735/3   吐槽那些程序员的搞笑牛逼注释

  • 17610/1   iOS 动画总结

  • 17602/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17455/82   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 17415/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 17123/23   个人收集的Android 各类功能源代码

  • 16651/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16587/21   Android福利第三波【Android电子书】

  • 16402/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16387/10   女程序员的梦,众网友的神回复

  • 16361/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 16323/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16239/0   iOS中文版资源库,非常全

  • 16082/11   年会上现场review代码是怎么样的体验!

  • 16021/23   珍藏多年的素材,灵感搜寻网站

  • 15491/18   65条最常用正则表达式,你要的都在这里了

  • 14834/15   基于Android支付宝支付设计和开发方案

  • 14230/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 14164/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13927/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13704/0   GitHub iOS 库和框架Top100 

  • 13627/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 13550/7   用程序员的姿势抢过年的火车票

  • 13508/7   一张图搞定iOS学习路线,非常全面

  • 13120/10   成为Java顶尖程序员 ,看这11本书就够了

  • 13087/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12983/18   一张图搞定Android学习路线,非常全面

  • 12793/29   【持续更新中】Android福利贴(一):资料源码

  • 12711/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12456/4   46 个非常有用的 PHP 代码片段

  • 11993/3   即时通信第三方库

  • 11432/8   流媒体视频直播方案

  • 11361/18   八个最优秀的Android Studio插件

  • 11239/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 11033/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10996/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10930/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10208/6   开箱即用!Android四款系统架构工具

  • 10011/10   十大技巧快速提升Android应用开发性能

  • 9952/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9899/1   Android性能优化视频,文档以及工具

  • 9763/3   一张图看清Linux 内核运行原理

  • 返回顶部