200702-OpenFeign详解

OpenFeigin详解

作为Spring Cloud的子项目之一,Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式,为微服务架构下服务之间的调用提供了解决方案。首先,利用了OpenFeign的声明式方式定义Web服务客户端;其次还更进一步,通过集成Ribbon或Eureka实现负载均衡的HTTP客户端。

Spring Cloud OpenFeign的最新版本是2018.8发布的2.0.1.RELEASE。

在Spring Cloud OpenFeign中,除了OpenFeign自身提供的标注(annotation)之外,还可以使用JAX-RS标注,或者Spring MVC标注。

OpenFeign提供了两个重要标注@FeignClient和@EnableFeignClients。

@FeignClient

@FeignClient标注用于声明Feign客户端可访问的Web服务,FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上

1
2
3
4
5
@FeignClient(name = "github-client", url = "https://api.github.com", configuration = GitHubExampleConfig.class)
public interface GitHubClient {
@RequestMapping(value = "/search/repositories", method = RequestMethod.GET)
String searchRepo(@RequestParam("q") String queryStr);
}

@FeignClient标注的参数

  • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现,默认””)
  • url:url一般用于调试,可以手动指定@FeignClient调用的地址,默认””
  • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract,FeignClientsConfiguration.class
  • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口,默认Void.class
  • fallbackFactory:工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码,默认Void.class
  • path: 定义当前FeignClient的统一前缀
1
feign.hystrix.enabled=true #开启该功能

定制@FeignClient标注的configuration类

  1. @FeignClient标注的默认配置类为FeignClientsConfiguration,我们可以定义自己的配置类如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Configuration
    public class MyConfiguration {
    @Bean
    public Contract feignContract(...) {...}

    @Bean
    public Encoder feignEncoder() {...}

    @Bean
    public Decoder feignDecoder() {...}

    ...
    }
  2. 然后在使用@FeignClient标注时,给出参数如下:

    1
    2
    3
    4
    5
    6
    @FeignClient(name = "myServiceName", configuration = MyConfiguration.class, ...)
    public interface MyService {
    @RequestMapping("/")
    public String getName();
    ...
    }
  3. 定制@FeignClient标注的configuration类还可以有另一个方法,直接配置application.yaml

1
2
3
4
5
6
7
8
9
10
feign:
client:
config:
feignName: myServiceName
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
encoder: com.example.MyEncoder
decoder: com.example.MyDecoder
contract: com.example.MyContract

@EnableFeignClients

@EnableFeignClients标注的参数

  1. value, basePackages (默认{})
  2. basePackageClasses (默认{})
  3. defaultConfiguration (默认{})
  4. clients (默认{})

使用OkHttpClient作为client的Feign客户端

在FeignAutoConfiguration的预配置基础上,要使用OkHttpClient作为client的Feign客户端非常简单,步骤如下:

  1. pom.xml中,加入对OkHttp的依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.10.0</version>
    </dependency>
  2. application.yaml中

    1
    2
    3
    feign:
        okhttp:
            enabled: true
  3. ,还可以在Spring配置类中定义一个Spring Bean方法,返回OkHttpClient对象,以定制OkHttpClient

使用Apache HttpComponents HttpClient作为client的Feign客户端

在FeignAutoConfiguration的预配置基础上,要使用Apache HttpComponents HttpClient作为client的Feign客户端非常简单

  1. pom.xml中,加入对Apache HttpClient的依赖 (略)

  2. application.yaml中,

    1
    2
    3
    feign:
        httpclient:
            enabled: true
  3. 必要时,定义Spring Bean定制返回一个ClosableHttpClient对象

参考资料

  1. FeignClient注解及参数
  2. Spring Cloud OpenFeign详解
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×