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 | "github-client", url = "https://api.github.com", configuration = GitHubExampleConfig.class) (name = |
@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 | true #开启该功能 = |
定制@FeignClient标注的configuration类
@FeignClient标注的默认配置类为FeignClientsConfiguration,我们可以定义自己的配置类如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyConfiguration {
public Contract feignContract(...) {...}
public Encoder feignEncoder() {...}
public Decoder feignDecoder() {...}
...
}然后在使用@FeignClient标注时,给出参数如下:
1
2
3
4
5
6"myServiceName", configuration = MyConfiguration.class, ...) (name =
public interface MyService {
"/") (
public String getName();
...
}定制@FeignClient标注的configuration类还可以有另一个方法,直接配置application.yaml
1 | feign: |
@EnableFeignClients
@EnableFeignClients标注的参数
- value, basePackages (默认{})
- basePackageClasses (默认{})
- defaultConfiguration (默认{})
- clients (默认{})
使用OkHttpClient作为client的Feign客户端
在FeignAutoConfiguration的预配置基础上,要使用OkHttpClient作为client的Feign客户端非常简单,步骤如下:
pom.xml中,加入对OkHttp的依赖
1
2
3
4
5<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>application.yaml中
1
2
3feign:
okhttp:
enabled: true,还可以在Spring配置类中定义一个Spring Bean方法,返回OkHttpClient对象,以定制OkHttpClient
使用Apache HttpComponents HttpClient作为client的Feign客户端
在FeignAutoConfiguration的预配置基础上,要使用Apache HttpComponents HttpClient作为client的Feign客户端非常简单
pom.xml中,加入对Apache HttpClient的依赖 (略)
application.yaml中,
1
2
3feign:
httpclient:
enabled: true必要时,定义Spring Bean定制返回一个ClosableHttpClient对象