发表于: 2020-02-25 23:13:17
1 1232
今天做了什么
学习ribbon、Feign、断路器Hystrix
Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是Feign。
Ribbon负载均衡
代码就不贴了:demo参考:https://www.fangzhipeng.com/springcloud/2018/08/02/sc-f2-ribbon.html
Spring Cloud Ribbon
是基于Netflix Ribbon
实现的一套客户端 负载均衡工具
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等.简单的说,就是在配置文件中列出Load Balancer
(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器.我们也很容易使用Ribbon实现自定义的负载均衡算法.
LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用.负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用).创建的负载均衡有软件Nginx
,LVS
,硬件F5
等,相应的在中间件如:dubbo和SpringCLoud中均给我们提供了负载均衡(其中SpringCloud的负载均衡算法可以自定义).
集中式LB
即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5
,也可以是软件,如Nginx
),由该设施负责把访问请求通过某种策略转发至服务的提供方
进程内LB
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器.
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址.
Ribbon在工作时分成两步:
- 第一步选择
Eureka Server
,它优选选择在同一个区域内负载较少的server. - 第二步再根据用户指定策略,从server取到的服务注册列表中选择一个地址.
其中Ribbon提供了多种策略:比如轮询,随机,根据响应时间加权.其中轮询是用户不指定策略时的默认执行策略。
Ribbon核心组件IRule
IRule:根据特定算法中从服务列表中选取一个要访问的服务
RibbonRibbon实现好的算法:
- RoudRobinRule,轮询
- RandomRule,随机
- AvailabilityFilteringRule,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
- WeightResponseTimeRule,根据平均响应时间算所有服务的权重,响应时间越快服务权重越大被选中 的概率越高.刚启动时如果统计信息不足,则使用RoudRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule
- RetryRule,先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
- 例如,当 provider、provider2、provider3正常运行时,采用轮询策略。此时如果 provider2宕机了, provider2还是会被轮询到(客户端会抛异常),但是在指定时间内发现多次重试均失败之后,会将 provider2从轮询列表中剔除。
- BestAvailableRule,会过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- ZoneAvoidanceRule,默认规则,复合判断server所在区域的性能和server的可用性选择服务器
Spring Cloud Ribbon默认为我们装载了轮询策略,如果我们没有显示的声明,则采取轮询策略,如果需要更换成以上策略中的任意一个,则只需声明对应的 bean纳入Spring 管理即可:
Feigh
代码参考:https://www.fangzhipeng.com/springcloud/2018/08/03/sc-f3-feign.html
Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后再上面添加注解即可
使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后再上面添加注解,用时
- -也支持JAX-RS标准的注解.Feign
- -也支持可拔插式的编码器和解码器,
- -Spring CLoud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters.
- -Feign可以与Eureka和RIbbon组合使用以支持负载均衡.
Feign旨在使编写Java HTTP客户端变得更容易.
前面在使用Ribbon+RestTemplate
时,利用RestTemplate
对http请求的封装处理,形成了一套模板化的调用方法,但在实际开发中,由于对依赖服务的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用.所以,Feign
在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义.在Feign
的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前是Dao
接口上面标注Mapper
注解,现在是一个微服务接口上面标注一个Feign
注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon
时,手动封装服务调用客户端的开发量.
这也是为了满足社区广大开发者面向接口编程的习惯。
简而言之:
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon,具有负载均衡的能力
- 整合了Hystrix,具有熔断的能力
Hystrix断路器
参考:https://zhenganwen.top/posts/135dd0c3/
分布式系统面临的问题-雪崩效应
分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应.
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的”扇出“.如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用会占用越来越多的系统资源,进而引起系统崩溃,所谓的”雪崩效应”.
服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息.当检测到该节点微服务调用响应正常后恢复调用链路.在SpringCloud
框架里熔断机制通过Hystrix
实现.Hystrix
会监控微服务调用的状况,失败的调用会启动熔断机制.熔断机制的注解是@HystrixCommand
.
触发熔断的条件可以是响应过长、服务提供者抛出异常、服务不可用等。
服务降级
整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来
与服务熔断的区别:服务降级处理是在客户端实现完成的,与服务端没有关系。
服务降级的作用:即使此时服务端已经down了,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器
Hystrix(Netflix的产品)是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性.
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩.
Hystrix能干什么
- 服务熔断
- 服务降级
- 服务限流
- 接近实时的监控系统
服务监控HystrixDashboard
除了隔离依赖服务的调用以外,Hystrix
还提供了准实时的调用监控(Hystrix Dashboard
),Hystrix
会持续地记录所有通过Hystrix
发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等.
Netflix通过hystrix-metrics-event-stream
项目实现了对以上指标的监控。Spring Cloud
也提供了Hystrix Dashboard
(对hystrix-metrics-event-stream
的封装).将监控内容转化成可视化界面.
要使用 Hystrix Dashboard
必须满足一下条件:
- 服务端引入了
spring-boot-starter-actuator
依赖 - 服务端启动类必须添加
@EnableCircuitBreaker
,因为Hystrix Dashboard
监测的是服务端的/hystrix.stream
(hystrix
通过actuator
提供的一个端点,用来记录通过断路器circuit breaker
发送的请求) Hystrix Dashboard
工程需要添加hystrix
、hystrix-dashboard
依赖,并在启动类上添加@EnableHystrixDashboard
注解- 如果服务端出于刚启动状态,则需访问以下服务端url如
/dept/get/1
,否则/hystrix.stream
不会显示data
信息 - 在
Dashboard
工程填写服务端hostname:port/hystrix.stream
Dashboard说明
Delay
:该参数用来控制服务器上轮询监控信息的延迟时间,默认是2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗.Title
:该参数对应了监控面板头部标题Hystrix Stream
之后的内容,默认会使用具体监控实例的URL,可以通过配置该信息来展示更合适的标题
今日收获:
学习了ribbon、Feign、断路器Hystrix的基本使用
学习了idea单个工程开启多实例的方法 https://blog.csdn.net/forezp/article/details/76408139
明天要做什么:
学习路由网关Zuul和分布式配置管理Config
评论