【springcloud】springcloud的远程接口调用执行过程及使用

接口化请求调用----->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

使用Feign来实现调用

  • 是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
  • 在service中引入依赖

<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} 路径不能错

Hystrix

容错组件

客户端处理

服务降级

  • 服务器是有限的而请求是无限的,在用户使用高峰期,会影响服务整体的性能,甚至宕机,为了避免一些重要的服务不可用,就需要对一些非核心的服务进行降级处理,舍小保大

  • 考虑的问题

区分哪些服务是核心,哪些是非核心

降级策略(处理方式,一般指如何给用户友好提示或操作)

自动降级,还是手动降级

服务熔断

熔断机制是对应雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在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 {
    //重写方法,给出提示
}
  • 添加注解,在加了@FeignClient注解的接口中绑定实现类
@Component
@FeignClient(value = "service-vod" , fallbackFactory = Aimpl.class)
public interface A {

}
ribbon
        <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等等

你可能感兴趣的:(springboot,spring,cloud,okhttp,java)