赣州新闻网

首页 / 科技

「冷酷无情」的任正非,对华为功勋元老的「大清洗」

2020-03-19 · 赣州新闻网 · 科技

转眼已经2020,距离微服务这个词落地已经过去好多年!(我记得2017年就听过这个词)。然而今天我想想什么是微服务,其实并没有一个很好的定义。为什么这样说+ D t q m ( f k,按Q B C W n V照微服务的定义:

微服务架构就是将一个庞大的业务系统按照业务模块拆分成若干个独立的子系统,每个子系统都是一个独立的应用,它是一种将应用构建成一系* R z ~列按业务领域划分模块的,小的自治服务的软件架构方式,倡导将复杂的单体应用拆分成Z 9 3 ` 若干个功能单一、松偶合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发,及持续集成与交付活动。

根据这个定义,不i ! b } O k P ~ MVC 模式,把业务逻辑分为:表示层,业务逻辑层,数据访问层。MVC3 , K # t V G !模式随着大前端的发展,从一开始的前后端不分离,到现在的前后端分离逐渐演进。这种演进3 l j 5 c % D 8好的一点是剥离了不同开发语言的开发环境和部署p % N 1 环境,使得开发较为便利,部署更直接。然而问题是:这种模式仍然是单体应用模式,如果有一n % $ [ | * F个改动需要上线,c t o 6 X / p你不得不因为这个改动去考虑更多,因为你无法估量在这么大体量的代码中你的一个改动会不会引发蝴蝶效应。

另外很重要的一点就是移动互联网时代的到来,引发了用户数几何倍数暴增,传统的单体应用模式已经无法支撑用户量暴涨的流量冲击,互联网人不得不做出加机器的无赖之举,然而发现有的时候加机器都无法搞定问题,因为逻辑调用过于耦合导致调用链复杂( : ; } ) 8 s 6 !。继而出现精简调用流程,梳理调用路径的举措,于是演变出微服务这个概念。

其实在没有微服务这个词出现之前, 我们也是这样干的,只是干的不彻底而已。比如说有一个信贷系统,信贷系统分为贷前,贷中,贷后三步:

微服务全流程各组件详细对比分析

在微服务未出现之前,我们大多是单体应用,基本上一个工程包含所有,无所不能,所以很臃肿上。述这些模块应该都是在一个工程中,但是按照业务做了代码上的拆分。另外就是 RPC 框架并为3 : &横空出世,如果有服务上的拆分,比如不同部门之间调用对方提供的服务,那么八九/ g p @ s o不离十肯定定义的是HTTP 接口,因为通用。但是某些时候大家又怕 HTTP 接口性 ) % *能差,关键服务不敢用。

微服务出现之后,大家觉得按照模块分别部署好像是这么回事,同时默默在心里嘀咕,以前我只用发布一个工程,现在倒好,可能有个改动涉及3个服务,我一个小小的改动就要发布3q j ) p l m m Y C次,是不是增加了工作量,另外我以前都不用调接口的,现在依赖了一堆别的系统,系统t # 3调用这么复杂,万一别的系统有问题,我岂不是就被耽搁了!

在这种质疑中大家虽有抱怨但是也没有放弃q 0 L U赶时髦,微服务开展的如火如荼,用户中心独立部署,风控系统单独成型,支付中心全公司统一独立,财务系统不再各个业务各自为战而是统筹公司各个业务线统一规划。按照业务抽象独立之后,大家A ~ e + ~ f d L发现好像是这m M P么回事,用起来真香。虽然每次需要别的模块的时候就需要找对应模块进行接入,但是业务逻辑上清晰了呀,如果出了问题,不是自己的,那就是别人的,甩锅很方便的(笑)。

如何做微服务

因为微服务是功能粒度上的拆分,必然导致拆分之后的模块变多。针对模块与模块之间的通信与维护,又演变出如下问题:

  • 模块与模块之间如何通信;

  • 每个被拆g N & p分的微服务如何做负载均衡;

  • 服务如何做注册,如何做发现;

  • 服务之间调用如何做限流,服务调用失败如u 6 # ~ = X d e )何做降级,流量异常如何做熔断;

  • 服务调用是否可以做统一的访问控制;

针对这些问题,业界也在发展中慢慢演进出几套通用的框架。理想中微服务框架应该具备这样的能力:

微服务全流程各组件详细对比分析

基于上述微服 { R z & A T目。但是Dubbo更加准确来说是一个分布式服务框架,致力于提供高效的RPC远程服务调用方案以及SOA服务治理方案。说白了就是个分布式远程服务调用框架。

Dubbo

从Dubbo官网给的图来看Dubbo的整体架构:

微服务全流程各组件详细对比分析

模块注解:

  • Provider: 暴露服务的服务+ f s l $提供方。

  • Consumer: 调用远程服务的服务消费方。

  • Registry: 服务注册与发现的注册中心。

  • Monp + ~ E ;itor: 统计服务的调用次调和调用时间的监控中心。

  • Container: 服务运行容器。

从上图中不难看出Dubbo功能还是很明确的:服务注册于发现,服务监控。另外Dubbo也提供服务治理功能:

微服务全流程各组件详细对比分析

Dw 2 C Q R O ? 8ubbo提供了集群容错的能力,在管理后台可以快速的摘除失败的服务。

对于我们上面提到的一整套微服务应该提m v G g供的功能看,Dubbo只是提供了服务注册与服务发现的功能。不可否认在这一项功能中,D` U D } i E Wubbo做的是非常优秀的。

Spring Cloud

Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发? * 0 y / |现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

微服务全流程各组件详细对比分析

服务注册与发现

目前Spring Cloud 支持的服务注册组件V d u } ) r } 2有 Consul,Eureka。Consul 不是 Spring 官方的项目,需要单独部署,Eureka 被 Spring 官方收录,本身属于 Spring Cla 0 4 U ]oud 体系中。

下面列出可以被用作注册中心的组件他们的特性u t o 1 P p对比:

微服务全流程各组件详细对比分析

Consul

Consul 官网中介绍了 Consul 的以下几个核心功能:

  • 服务发现(Service DiscF = { V a X o u 9overy):提供 HTTP 与DNS 两种方式。

  • 健康检查(Health ChA - & c f L 8ecking):提供多种健康检查方式,U = D & ) 3 3 _ 6比如 HTTP 状态码、内存使用情况、硬盘等等。

  • 键值存储(KV Store):可以作为服务配置中心使用6 J 2 ( = z j,类似 Spring Cloud Config。

  • 加密服务通信(S } G 8 | F (ecure Service{ ; O Y Communication)

  • 多数据中心(Multi Datl r # a ^ ` m 7 _acenter):Consul$ Z g 通过 WAN 的 Gossip 协议,完成跨数据中心的同步。

Consul 需要单独部署,而不是与Spring集成的组件。

Eureka

Eureka 是 Spring Cloud NetFlix 默认的服务发现框架,但目前 2.0 版本已闭源,只剩下 1.9 版本的处于维护状态。Eureka 使用K 4 ? 0 1 %尽力而为同Q ^ p G 9 /步的方式提供提供弱一致的服务列表。当一个服务注册时,Eureka 会尝试将其同步到其他节点上,但不6 - # 7提供一致性的保证。因此,Eureka 可以提供过时的或是已不存在的服务列表(在服务发现场景下,返回旧Q W I O 5 P n的总比什么也不返回好)。

如果在 15分钟内超过85%的客户端节点都没有正常的心跳,那W = W N 9 : i么 Eureka 就会认为客户端与注册中心出现了网络故障(出现网络分区),进入自我保护机制。

此时:

  • Eureka Server 会保护服务注册表中的信息,不再删除服务。这是由于如果出现网络分区导致其他微服务和该 Eureka Server 无法通信,Eureka Server 就会判定这些微服务失效,但很可能这些微服务都是健康的。

  • Eureka Server 仍能接受新~ _ Q x a { q M服务的注册和查询请求,但这些数x } ~ R d n 1据不会被同步到其他节点。

  • 当网络恢复时,这个 Eureka Server 节点的数据会被同步到其他节点中。

优点:

Eureka Server 可以很好的应对因网络故障导致部分节点失联z q - ! 5 b k ? Q的情况,而不会像 ZK 那样如果有一半不可用的情况会导致整个集群不可用。

服务网关

微服务的拆分6 I f导致服务分散,如果一个大的业务要对外提供输出,每个服务单独对外提供调Y @ 用对接入方不友好并且调用也会很复杂。所以出现了网关,网关主要实现请求的路由转发,负载均衡,统一校验,请求过滤等功能。

目前社区主流的网O 8 B 7 K 6 B关有三个:Zuul,Kong,Spring CN c N ` $loud GateWay。

Zuul

Zuul 是 Netflix 公司的开源项目,SL 0 % z epring Cloud 在 Netflix 项目中也已经集成了 Zuul,依赖名叫:spring-cloud-starter-netflix-zuul。Zuul构建于 Servlet 2.5,兼容 3.x,使用的是阻塞式的 API,不支持长连接,比如 wep ^ { } z l N jbsockets。我们现在说的 Zuul 指 Zuu7 r ; 1l 1.x,Netflix 最新的 Zuul 2.x一直跳票,所y U E ` _以 Spring Ce m D = 1 j v o gloud 在Zuul 2.x没有出的时候依靠社区的力量发展出了新的网关组件:SpringO & } r y ) 9 Cs K _ I v k Jloud Gateway。

Zuul 的核心S c t P功能就是基于 Servlet 提供了一系列的过滤器:

  • 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。

  • 审查与监控:在边缘位置追踪有K & 9 & H 9 5 W t意义的数据和统计结果,从/ R k P ` S 1 M y而带来精确的生产视图。

  • 动态路由:动Y k U X态地将请求路由到不同的后端集] 1 7 F H群。

  • 压力测试:逐渐增加指向集群的流量,以了解性能。

  • 负载分配:为每一种负载类型分配对应容量,并启用超出限定值的请求。

  • 静态响应处理:在边缘位置直接建立部分相应,从而避免其转发到内部集群。

Sp1 * j % 3ring Cloud Gateway

Spring Cloud Gateway 构建于 SC 0 G w 2 ] {pring 5+,基于 Spring Be s D Y oot 2.x 响应式的、非阻塞式的 API。同时,它支持 Wg $ Debsockets. i F w L } J,和 Spring 框架紧密集成,开发体验相对来说十分不错。SpringCloud Gateway 是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。

总体来说 Spr! | Ving Cloud Gateway 与Z0 / 6 _ * T I nuul 功能差$ e ( P 2 . * 0 w别不大,最大的出入是在底层性能v N u的提升上。

Zuul 本O D )身是基于 Servlet 容器来实现的过滤,Servlet采用的是单实例多线程的处理方案,Servlet会为每一个Request分配一个线程,如果当前线程比较耗时那么会一直等到线程处理完毕才会返回。所以说 Zu` 0 q xul 是基于servlet之上的一个阻塞式处理模型。

同步阻塞模型^ 6 p B l W c对于网关这种比较在意响应耗时和调用频繁的组件来说,必然会引发一些性能问题,所以Zuul 2已经做出了改良,从G o $Zuul 2开始已经使用Netty。但是不幸的是Spring 官方已经对它的更新频率感到失望所以纵然q ! 3 z | P更新了也没有被选用。

Spring Cloud Gateway 底层基于Webflux。WeS C C H Q E i E Zbflux模式替换了旧的Servlet线程模型。用少量的线程处理request和response io操作,这些线程称为Loop线程。Webfluxo ; { F M z的Loop线程,正好就是著名的Reactor 模式IO处理模型的Reactor线程,如果使用的是高性能的通信框架Netty,这就是Nettyp g ? 4的EventLoop线程^ V D 5 %。

所以整体来看,Spring Cloud Gateway 的性能要比目 V A / Q _前在用的 Zuul 高。但是Webflux的编程方式可能大家不是很能接收。

服务降级

降级限流在微服务中属于银弹,一般不用,一旦用上那就是拯救宇宙般存在。

目前业界通用的降级限流工具主要有3款:Hystrix,Sentinel,Resilience4j。

Hystrix 的关注点在于以 隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失@ $ 1 Q X P N败,并可以q . @ N提供 fallback 机制。L + UHystri# I . / } x 是元老级别的存在,但是在18年11月 Netflix 官方宣布停止更新(就是这么不靠谱,说跳票就跳票)。虽然停止更新,但是社区又推出了新的替代工具:Resilience4j。

Resilience4j 的模块化做的比较好,将每个功能点(如熔断、限速器、自动重试)都拆成了单独的模块,这样整体结构很清晰,用户也只r $ &需要引8 | = F j ^ c入相应功能的依赖即可;另外resilience4j 是针对 Java 8 和函数式编程设计的,API 比较简洁优雅。同时与 Hystrix 相比,Resilience4j 增加了简单的限速器和自动重试特性,使用场景更加丰富。

相比 Hystrix , Resilience4j的优势在于:

  • 针对 Java 8 和函数式编程设计,提供函数式和响应式风格的 AP0 Z c # q _ j 0 SI;

  • 增加了 rate limiting 和 automatic retrying 两个模块。其中 rate limiting 引入了简单的速率控制实现,补充了流量控制这一块的功能;

  • 而 automaticY y p V O ) o retx M & L K Brying 则Q k } W ? Y e是封装了自动重试的逻辑,简化了异常恢复的流程。

Resil: ! Bience4j 属于一个新兴项目,社区? ) X h r g A K c也在蓬勃发展。总的来说,Resilience4j 是比较轻量的库,在较小较新的项目3 T : ]中使用还= ; O b是比较方便的,但是 Re= G h ] /sili~ 9 W J E e / -ence4j 只包含限流降级的基本场景,对于非常复杂的企业级服务架= ( c C q 1 G构可能无法很好地 cover 住;同时 Resilience4j 缺乏生产级别的配套设施(如提供规则管理和实时监控能力的控制台` a 0 B * & b {)。

Sentinel 一款面向分布式服务架C K # F J @ v g _构的, # P轻量级流量控制组件,主要以流量为切入点,从流量控制、熔断降U . . R 7 A a级、系统自适应保护等多个维度来帮助用户保障服务的稳定性。

Sentinel 的核心思想:根据对应资源配置的规则来/ , & @ z t为资源执行相应的流控/降级/系统保护策略。在 SentL : ` g 8 R p ,inel 中资源定义和规则配置是分离的。用户先通过 Sentinel API 给对应的业务逻辑定义资源,然后可以在需要的时候动态配置规则。

整体功能对比:

微服务全流程各组件详细对比分析

从上面的参照看,Sentinel 的功能相对要多一4 f ?些,但是多并不意味着所有,合适的才是最好的,对5 ( o $ X于你用不到的功能,简单才是美丽。

统一配置中心

统一配置中心概念的提出也是伴随着微服务架构出现才出+ x p 2 ? .现,g { * -单体应用的时候所有的配置都可以集成在服* : Y I 7 l 6务之中,? V u m G 5 C多应用的时候x W 6 T如果每个应用都持有一份配置可能会有相同配置冗余的情况;如果一共有2000台机器,如果一个配置发生更改,是否要登录每一台机器重新更改配置呢;另外,更多的配置必然会带来管理上的混乱,$ E . y M k ) _ w如果f x &没有集中管理的地方必然会越来越乱。

分布式配置管理r v C Z S N M m的本质y S b a基本上就是一种推Q h v | u * w ,送-订阅模1 f 5 l X C X 2式的运用。配置的应用方是订阅者,配置管理服务则是推送方w L r z S ? 1。其中,客户端包括管理人员publish数据到配置管理服务E o b 7 f,可以理解为添加/更新数据;配置管理服务notify数据到订阅者,可以理解为推送。配置管理服务往往会封装一个客户端库,+ o g应用方则是基于该库与配置管理服务进行交互。在实际实现` j _ t时,客户端库可能是主动拉取(pull)数据,但对于应用方而言,一般是一种事件通知方式。

选型一个合格的配置中* ! & a心,至少需要满足如下4个核心需求:

  • 非开发环境下应用配置的保密性,避免将关键配置写入源代码;

  • 不同部署环境下S 5 L , C 2 ?应用配置的隔离性,比如非生~ 2 { *产环境的配置j 7 p _ Q不能用于生产环境;

  • 同一部署环境下的服务器应用配置的一致性,即所有服1 G务器使用 z 6同一份配置;

  • 分布式环境下应用配置的可管理性,即提供远程管理配置的d g i S . M能力。

Diamond

最开始我接触过的配置中心是淘宝的 Di* 8 /amond,Diamon+ ` ] E Xd中的数据是/ & j M 0 Y `简单的key-value结构。应用方订阅数据则是基于key来订阅,未订阅的数据当然不会被推送( ) f -。

Diamond是无单点架构,在做更新配置的时候只做三件事:

  • 写数据库

  • 写本地

  • 通知其他机器到数据库拉更新

本地的设计就是为了缓存,减少对数据库的压力。作为一个配置中心,高可用是最主要的需求。如何保持高可用,Diamond持有多层的数据存储,数据被存储在:数据库,服务端磁盘,客_ J z B户端缓存目录,以及可以手工干预的容灾目录。客户端通过API获取配置数据按照固定的顺序去不同的数据源获取数据:容灾目录,服务端磁盘,客户端缓存。

Diamond除~ , h了在容灾上做了很多方案,在数据读取P r l 6 q ( ) ~ a方面也有很多特点o + C。客户端采用推拉结合的策略在长连接和短连接之间取得一个平衡,让服务端不用太关注连接的管理,又可以获得长连接的及时性。

使用Diamond的流程S @ J ? R:

发布配置:

微服务全流程各组件详细对比分析

读取配置:

微服务全流程各组件详细对比分析

Diamond server是无中心节点的逻辑集群,这样就能避免单点故障。Diamond的同质节点之间会相互通信以保证数据的一致性,每个节点都有其它节点的地址信息,其中一个节点发g v r ! Y ( W 9生数据变更后会响应的通知其他节点,保证数据的一致性。

为了保证高可用,client还会在app端缓存一个本地文件,这样即使server不A z o : {可用也能保证app可用。 R g + 7 A wClient不断长轮询server,获取最新的配置推送,尽量保证本地数据的时效性。

Client默认启动周期任务对server进行长轮询感知x & K C N sserver的配置变化,server感知到配置变化就发送变更的数据编号,客户端通过数9 } v r据编号再去拉取最新配置数据;否则超时结束请求(默认10秒)。拉取到新配置后,client会通知监听者(MessageListener)做相应处理,用户可以通) ~ ) p过Diamond#addListener监听。

但是Diamond一般用途是做KV存储,如果用来做配置中心,他提供的能力不是太符合。

可以看到早期D M u o o # , x的配置中心处理的东西还是比较简单,那个时候业务没有那么复杂,读取配置和更新配置没有那么多花样,持久化存储和本地缓存,长连接更新就可以。但是现在的配置中心随着技术的发展承担的作用可能更多,

Spri2 3 yng Cloud Config ; - ! z |g

Spring Cloud Config 作为Spring官方提供的配置中心可能比较符合外国人的习惯:

微服务全流程各组件详细对比分析

Spry C @ $ j ring Clm F m #oud Config将不同环境的所有配置存放在git 仓库中,服务启动时通过接口拉取配置。遵循{ServiceID}-{pro_ ~ ~ B ~ Bfile}.h K g ? /properties的结构,按照profile拉取自己所需的配置。

当开发者修改了配置项之后,需要结合spring config bus将配置通知到对应的服务,实现配置的动态更新。

可以Q g l # % b R U 6看到,Spring Cloud Config已经具备了一个配, 4 0 F置中心的雏形,可以满足小型项目对配置的管理,但仍然有着很多局限性。配置使用git库进行管理,那么git库的权限如何来判断?不同环境的安全性也得不到保障。配置的添加和删除,配置项的汇总,也只能通过git命令来实现,对运维人员也并不友好e P g z N q e =。

Apollo

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不B N j 同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

Apollo 支持4个维度管理 Key-Valuer ( N K , 格式的配置:

  • application(应用):实际使用配置的5 1 Q ] h c ^ & F应用,Apollo客户端在运行时需B j D d x }要知道当前应用是谁,从而可以去获取对应的配置;每个应用都需要有唯一的身份标识 – a} 6 ~ppId,应用身份是跟着代码走的,所以需要在代码中配置。

  • environment(环境):配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置。

  • cluster(集群):一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。对不同的cluster,同一个配置可以有不一样的值,如ZooKeeper地址A } r b !。

  • namespace(命名空间):一个应用下不同配置的分组,可以简单地把namb . ~用AdminServ^ 5 F Z : # zice。

微服务全流程各组件详细对比分析

上图简要描述` ) n u了Apollo的总体设计,我们可以从下往上看:

  • ConfN B x kig Serv* L y C Z y g /ice提供配置的读取、推送等功能,服务对象是Apollo客户端;

  • Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面);

  • Config Service和Admin Service都是多y v O Y u O p实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳;

  • 在Eureka之上我们架了一层Meta Server用于封装Eureka的服务发0 O E E P e现接口;

  • Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试;

  • Portal通过域名访问Meta Server获取Admin SY ` K x 3 G s C Mervice服务列表(IP+P? a i Eort),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试;

  • 为了简化部署,我们实际D h z E d :上会把Conf+ J唯一i^ Y G % # 7 ^ D xd

  • pspan_id:父级spl Q m H U D ] s ian_id

  • service_n. i ? $ c / U ~ Eame:服务名称r ~ # 2

  • api:api路径

  • stage:h F t _ 9 O _ % ~阶段/状态

  • timestamp:插入数据时的时间戳

微服务全流程各组件详细对比分析

上表中的stage中的状态解释为:

  • CS(Client Sent 客户端发送):客户端发送一个请求,表示span的开始;

  • SR(Server Re3 N : _ceived 服务端接收):服务端接收请求并开始处理它。(S# X : eR - CS)等于网络的延迟;

  • SS(Servem d 3 $r Sent 服务端发送):服务端处理请求完成,开始返回结束| r g } ` P x给服务端。(SR - SS)表X H . W 6 *示服务端处理请求的时间;O + c b _ B r

  • CR(Cl9 f Q U . m : ^ ~ient Received 客户端接收):客户端完成接受返回结果,此时span结束。(CR - CS)N - Y % u f I f表示客户端接收服务W i : p 9端数据的时间。

根据这个表我们就能很快的分析上面提到的两个问题:

如果以上任何一步有问题,那么当前调用就不是完整的,我们必然能追踪W 0 r + B C出来;

通过每一步的调用时间进行分析,我们也必然知道阻塞在哪一步,从而对调用慢的地方进行优化。

现有的分布式Trace基本都是采用了googleC 7 g 的 Dapper 标准。

标准。

Dapper的思想很简单,就是在每一次调用栈中,使用1 H o q q同一个TraceId将不F F = {同的server联系起来。

一次单独的调用链也可以称3 ? 7 9为一个span,dapper记录的是span的名称,以及每个span的ID和父ID,以重建在一次追踪过程中不同span之间的关系。

对于一个特( Z g Y M 0 A $ I定的span,记录从Start到End,首先经历了客户端发送数据,然后server接收数据,然后server执行内部逻辑,这中间可能去访问另一个应用。执行完了server将数据返回,然后客户端接收到数据。

在整个过程中,TraceId和ParentId的生成至关重要。首先解释下TraceId和ParentId。TraceId是标识这个调用链的Id,整个调用链,从浏览器开始放完,到A到B到C,一直到调用结束,所有应用在这次调用中拥有同一个TraceId,所以才能把R - 9 | g - @这次调用链在一起。

既然知道了这次调用链的整个Id,那么每次查找问题的时候,只要知道某一个调用的TraceId,就能把所有这个Id的调用全部查找出来,能够清w B * ? S楚的知道本地调用链经过了哪些应用,产生了哪些调P z ~ & = X s .用。但是还缺一点,那就是链。

基于这种需求,目前各大厂商都做出了自己的分/ m )布式追踪系统,目前国内开源的2 u G有阿里的鹰眼,美团的CAT,京东t S D的Hydra,还有广为人知的个人开源Apache顶级项目SkyWalking。国外的有Zipkh ` = J I 1in,Pinpoint。

Spring Cloud Sleuth + Zipkin

Spring Cloud Sleuth 实现了一种分布式的服务链路跟踪解决方案,通过使用Sleuth可以让我们快速定位某个服务的问题。简单来说,Sleuth相当于调u * L & q s B用链监控工具的客户端,集成在各个微服务上,负责产生调用链监控数据。

通过SleuA . @ T q P 0 L tth产生# * f Y % ; L的调用链监控信息,让我们可以8 { g q * U G G得知微服务之间的调用链路,但是监控信息只输出到控制台始终不太方便查看。所以我们需要一个图形化的工具,这时候就轮到Zipkin出场F l $ ? I A f ? 1了。Zipkin是Twitter开源的分布式跟踪系统,主要用来收集系统的时序数据,从而追踪系统的调用问题。: + # * d x

Spring Cloud Slueth 聚焦在链路追踪和分析,将信息发送到Zipkin,利用 Zipkin的存储来存储信息,当然,Zipkin也可以使用ELK来记录日志和展; : O . A u s !示,再通过收集服务器性能的脚本把数据存储到ELK,则可以展示服务器状况信息z * l | P 5。

PinPoint

pinpoint数据分析非常完备的。提供代码级别的可见性以便轻松定位失败点和瓶颈,对于执行的sql语句,都进行了记录。还可以配置报警规则等,设置每个应用对应的} . 2 9 ` 2 7 ( e :in)l & W U格式化、不同存储系统以及集群管理、, I p x N & / ? g你甚至还可以使用观测分析语言来进行自定义聚合分析。

存储是开放式的、你可以选择一个既有的存储系统、如 ElasticSearch, H2{ Y u 或 MySQL 集群(Sharding-Sphere 管理)、也可以选择自己实现一个存储系统。

用f I ; ` * l ;户界面对于 SkyWalking 的最终用户来说非常炫酷且强大、同样它也是可定制以匹J 8 T r 0 x W配你已存在的后端的。

总结

以上是微服务过程全链路过程中需要经历的阶4 v Z $ ` f { u S段,当然还不包括发布系统的搭建,底层数据治理能力。所以提倡微服务可以,但是真的做起来不是所有公司都能做得到。小公司能i o p q ^ - X做到服务拆分但t a { S X l 5 C w是相应的配套设施不一定能y a z $跟上,大公司有人有钱有@ 5 c V时间,才能提供这些基础设施。微服务的路任重道远,搭起来一套完整的设施并用于生产环境还是挺有挑战7 F U r F ?,新的一年希望我能够在践行微服务S 0 E S @ n的路上走下去,只有走的完整才是微服务x + m / * 4 v v,走的不完整对于开发人员来说,那就是过度开发/ g R 7 q,* R x 1就是灾难。

作者:rickiyang

出处:https://ww{ ) b v / Aw.cnblogs.com/ric. / *kiyang/p/1r I & . e @ x2153070.html

库存测试项目企业赣州华为无情对华任正非