Spring Cloud OpenFeign整合了Spring Cloud Ribbon、Spring Cloud Hystrix,同时还实现重试机制。
maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
例子
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args){
SpringApplication.run(ConsumerApplication.class, args);
}
}
@FeignClient(value = "hello-service")
public interface HelloWorld {
@RequestMapping("/hello")
String remoteSayHello();
@PostMapping("/printAddr")
String remotePrintAddr(@RequestParam("province") String provinceName, @RequestParam("city") Long cityName);
@GetMapping("/get-one-student/{id}")
StudentBO remoteGetStudent(@PathVariable("id") Long id);
}
@RestController
public class ConsumerController {
@Autowired
private HelloWorld helloWorld;
@GetMapping(value="/remoteSayHello")
public String remoteSayHello() {
return helloWorld.remoteSayHello();
}
}
使用@EnableFeignClients 开启Spring Cloud OpenFeign
使用@FeignClient 声明服务
@FeignClient的常用属性
value: 指定服务名,不区分大小写
path: 指定请求路径的前缀
url: 指定请求的绝对路径,不会使用负载均衡,直连,本地调试时或其它不需要负载均衡的场景下可使用
configuration: 为单个服务指定配置(注:当同一个服务有多个FeignClient时,configuration配置可能无法生效,需要注意版本)
FeignClientsConfiguration 是Feign默认的全局配置
@Bean
@ConditionalOnMissingBean
public Retryer feignRetryer() {
return Retryer.NEVER_RETRY;
}
默认不进行重试
底层支持 HttpURLConnection 、HttpClient、OkHttp 三种
默认为HttpURLConnection 其中 connectTimeoutMillis默认为10s readTimeoutMillis 默认为60s
可通过下列方式修改默认值
@Bean
public Requst.Options options(){
Request.Options options = new Request.Options(10000, 60000);
return options;
}
若需要使用HttpClient、OkHttp 则需要导入相应的依赖
httpClient maven依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
feign.httpclient.enabled 表示开启HttpClient的支持 当该属性不存在或属性值为true时为开启
okHttp maven依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
feign.okhttp.enabled 表示开启OkHttp的支持 当该属性值为true时为开启
主要类
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration
org.springframework.cloud.openfeign.FeignClientsConfiguration
org.springframework.cloud.openfeign.FeignAutoConfiguration
org.springframework.cloud.openfeign.FeignClientsRegistrar
FeignRibbonClientAutoConfiguration 会在FeignAutoConfiguration 前执行
当存在ILoadBalancer
时会创建带负载均衡的FeignClient
@ConditionalOnClass({ ILoadBalancer.class, Feign.class })
@Configuration
@AutoConfigureBefore(FeignAutoConfiguration.class)
@EnableConfigurationProperties({ FeignHttpClientProperties.class })
//Order is important here, last should be the default, first should be optional
@Import({ HttpClientFeignLoadBalancedConfiguration.class,
OkHttpFeignLoadBalancedConfiguration.class,
DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration {
//...
}
使用案例
Spring Cloud OpenFeign 入参对象、返回值对象 无需和提供者一致
Spring Cloud OpenFeign 文件上传