spring cloud 组件3

feign简介

Feign是一个声明式 WebService 客户端,使用Feign能够让编写Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可插拔式的编码器和解码器。

Spring Cloud 对 Fiegn 进行了封装,使其支持了Spring MVC 标准注解和HttpMessageConverts。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

前面使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法,但是在实际的开发中,由于对服务依赖的调用可能不止一处。往往一个接口会被多处调用,所以通常会对每个微服务自行封装一些客户端类来包装依赖服务的调用,所以Feign在此基础上做了进一步封装,有他来帮助我们自定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置他(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成服务提供放的接口绑定,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。

Fegin支持什么?

可插拔的注解支持
支持Hystrix和Fallback
支持Ribbon的负载均衡
支持请求/响应的压缩

Fegin的工作原理

  • 主程序入口添加了@EnableFeignClients注解开启对FeignClient扫描加载处理。根据Feign Client的开发规范,定义接口并加@FeignClientd注解。

  • 当程序启动时,回进行包扫描,扫描所有@FeignClients的注解的类,并且讲这些信息注入Spring IOC容器中,当定义的的Feign接口中的方法呗调用时,通过JDK的代理方式,来生成具体的RequestTemplate.当生成代理时,Feign会为每个接口方法创建一个RequestTemplate。当生成代理时,Feign会为每个接口方法创建一个RequestTemplate对象,改对象封装可HTTP请求需要的全部信息,如请求参数名,请求方法等信息都是在这个过程中确定的。

  • 然后RequestTemplate生成Request,然后把Request交给Client去处理,这里指的时Client可以时JDK原生的URLConnection,Apache的HttpClient,也可以时OKhttp,最后Client被封装到LoadBalanceClient类,这个类结合Ribbon负载均衡发器服务之间的调用。

Feign注解

@FeignClient注解主要被@Target({ElementType.TYPE})修饰,表示该注解主要使用在接口上。它具备了如下的属性:

  • name:指定FeignClient的名称,如果使用了Ribbon,name就作为微服务的名称,用于服务发现。

  • url:url一般用于调试,可以指定@FeignClient调用的地址。

  • decode404: 当发生404错误时,如果该字段为true,会调用decoder进行解码,否则抛出FeignException.

    扫描二维码关注公众号,回复: 8911447 查看本文章
  • configuration:Feign配置类,可以自定或者配置Feign的Encoder,Decoder,LogLevel,Contract。

  • fallback:定义容错的处理类,当调用远程接口失败或者超时时,会调用对应的接口的容错逻辑,fallback指定的类必须实现@Feign标记的接口。

  • fallbacjFactory:工厂类,用于生成fallback类实例,通过这个属性可以实现每个接口通用的容错逻辑们介绍重复的代码。

  • path:定义当前FeignClient的统一前缀。

Feign开启GZIP压缩

Spring Cloud Feign支持对请求和响应的进行GZIP压缩,以提高通信效率。 在yml文件需要如下的配置

feign:
compression:
request:
enabled: true #开请求压缩
mimeTypes: #媒体类型 text/xml,application/xml,application/json
minRequestSize: 2048 #最小的请求大小
response:
enabled: true #开启响应的压缩
需要注意的是,在采用了压缩之后,需要使用二级制的方式进行数据传递,所有返回值就需要使用 ResponseEntity<byte[]> 接收.

@FeignClient(name = “github-client”,url = “https://api.github.com”,configuration = HelloFeignServiceConfig.class)
public interface HelloFeignService {

/*
这个返回类型如果采用了压缩,那么就是二进制的方式,就需要使用ResponseEntity<byte[]>作为返回值
 */
@RequestMapping(value = "/search/repositories",method = RequestMethod.GET)
ResponseEntity<byte[]> searchRepositories(@RequestParam("q")String parameter);

}

Feign的超时设置

Feign的调用分两层,即Ribbon层的调用和Hystrix的调用,高版本的Hystrix默认是关闭的。

如果出现上述的错误,那么就需要添加如下的配置

#请求处理的超时时间 ribbon.ReadTimeout: 12000 #请求链接超时时间 ribbon.ConnectionTimeout: 30000

如果开启了Hystrix,Hystrix的超时报错信息如下:

此时可以添加如下配置:

hystrix:
  command:
    default:
      circuitBreaker:
        sleepWindowInMilliseconds: 30000
        requestVolumeThreshold: 50
      execution:
        timeout:
          enabled: true
        isolation:
          strategy: SEMAPHORE
          semaphore:
            maxConcurrentRequests: 50
          thread:
            timeoutInMilliseconds: 100000
发布了12 篇原创文章 · 获赞 0 · 访问量 318

猜你喜欢

转载自blog.csdn.net/qq_41970133/article/details/104095115