一、Sleuth与Zipkin整合
Zipkin简介
Zipkin是Twitter的开源项目,致力于服务器间的链路追踪,它通过RESTAPI接口来辅助我们查询跟踪链路,以实现对分布式系统的服务链路监控,从而找到延迟高等问题。
它的一大特点是自带图形化界面,像Hystrix的Hystrix-dashboard一样,很直观的查看和搜索链路间的明细。
上图就是Zipkin的基础架构,分为四大组件:
学习 笔记
在上面,我们可以看到,在配置文件中配置路由,或者注册到注册中心中,就可以获取路由配置。
那么问题来了,这是如何做到的呢?
我们带着问题,可以先看下RoutesEndPoint
这个类
1 | @ManagedResource(description = "Can be used to list the reverse proxy routes") |
在之前,我们学习了Ribbon
和Hystrix
。微服务的负载均衡器以及服务熔断措施,大大稳定了微服务应用。
在使用Spring Cloud Ribbon
的时候,是配合RestTemplate
与@LoadBalanced
使用的,RestTemplate
封装了http
请求,提供了一套模板化调用方法。这时我们会发现,在实际开发中,对于更多的应用以及接口的调用,要写大量的RestTemplate
模板化内容。
这时SpringCloud
为了方便开发,实现了Feign
这一组件,它简化了Ribbon
,我们只需要创建接口并使用注解配置,即可完成对服务提供方的接口绑定。它具备可插拔的注解支持,包括Feign
注解、JAX-RS
注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign
还扩展了对Spring MVC
注解的支持,同时还整合了Hystrix
来提供服务熔断。
在微服务架构中,各个服务的消费提供都是依赖远程调用的方式,这样便会因为网络,服务故障等问题出现请求超时,延迟。若此时服务调用数量增加,导致请求累计,最终会导致系统瘫痪。
举个例子:以淘宝为例,创建订单业务需要先查询库存,库存 > 0才允许创建,如果此时库存服务因某些问题故障,导致无法被访问,那么创建订单的线程会一直等待,最终导致创建失败,如果这是在双十一的时候,那么大量并发冲击,导致无数线程等待库存服务,最终会导致订单服务挂掉。
在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就会因依赖关系形成故障蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构就更加的不稳定。为了解决这样的问题,因此产生了断路器模式。
对于下面介绍的接口,都很重要,他们组合在一起,就是负载均衡实现的原理,所以我们先来研究他们的接口,最后再看实现的步骤
Spring对于命名非常灵性,对于负载均衡客户端,我们就可以在源码中搜索Load Balance Client即可,即可搜到LoadBalancerClient
,即我们想要的接口,主要作用为:执行调用
这里我们简单放出源码,并进行一些转变,比如去掉注解,把父类的方法也拿进来之类的:
1 | public interface LoadBalancerClient extends ServiceInstanceChooser { |