接口化请求调用----->Feigin----->Hystrix----->Ribbon----->Http Client(apache http components 或者 okhttp)
具体流程如下
1、当加了@FeignClient注解的接口被调用时,在框架内部会把请求转换为Feign的请求实例feign.Request,交给Feign框架管理。
2、根据调用接口的注解@FeignClient后面的注册名称,找到注册中心的功能模块,然后根据调用的接口的方法声明该功能模块寻找相应的方法体,此时并未执行。
3、在寻找方法体的过程中,如果上述功能模块服务突然挂掉了,此时就会使用Hystrix组件,请求被Hystrix代理拦截,判断请求是否需要进行熔断,若需要进行熔断,则熔断后快速返回错误的响应信息;否则传递给Ribbon组件。
4、Ribbon组件的主要作用是来根据请求的特点,对请求进行负载均衡处理,寻找合适服务提供者。
5、最后将Ribbon传过来的请求(此时该请求已经指定了服务地址)包装成Http Client客户端框架做真实的通信请求。
使用Feign来实现调用
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
@EnableFeignClients
@Component
@FeignClient("service-vod")
public interface VodClient {
@DeleteMapping("/vodService/vod/video/deleteByVoId/{videoId}")
R deleteByVoId(@PathVariable("videoId") String videoId);
}
@PathVariable(“videoId”) 必须绑定videoId
@FeignClient(“service-vod”) 指定模块其中service-vod为模块名称,但不能有_
/vodService/vod/video/deleteByVoId/{videoId} 路径不能错
容错组件
客户端处理
服务降级
服务器是有限的而请求是无限的,在用户使用高峰期,会影响服务整体的性能,甚至宕机,为了避免一些重要的服务不可用,就需要对一些非核心的服务进行降级处理,舍小保大
考虑的问题
区分哪些服务是核心,哪些是非核心
降级策略(处理方式,一般指如何给用户友好提示或操作)
自动降级,还是手动降级
服务熔断
熔断机制是对应雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况, 当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。
服务熔断解决如下问题:
1、当所依赖的对象不稳定时,能够起到快速失败的目的;
2、快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复。
熔断机制的注解是@HystrixCommand.
异同点:
熔断是客户的请求或数据出现问题,为避免用户等待及不友好体验,进行熔断并给出提示或操作。
降级是服务端请求量太多,为避免核心服务出现问题,关闭一些非核心服务,且给出提示或操作。
都是为了用户体验。
Hystrix使用:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>
#开启openfeign熔断支持
feign:
hystrix:
enabled: true
@Component
public class Aimpl implements A {
//重写方法,给出提示
}
@Component
@FeignClient(value = "service-vod" , fallbackFactory = Aimpl.class)
public interface A {
}
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
dependency>
ribbon是什么
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目, 主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间层服务连接在一起。 Ribbon的客户端组件提供一系列完整的配置项如:连接超时、重试等等。简单的说,就是在配置文件中列出LoadBalancer (简称LB: 负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法!
ribbon能干什么?
LB,即负载均衡(Load Balance) ,在微服务或分布式集群中经常用的一种应用。
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用) .
常见的负载均衡软件有 Nginx,Lvs等等