Open Feign
OpenFeign是一個聲明式http調用客戶端框架,支持用OpenFeign風格註解、或者Jersey風格註解標註的形式聲明一個http客戶端,這種形式可以簡化客戶端http調用時編程代碼,就像Dubbo一樣,調用遠程服務就像調用一個本地方法一樣簡潔。
spring-cloud-openfeign
模塊對OpenFeign框架進行了集成,並額外支持Spring MVC REST風格註解聲明一個http客戶端。
使用示例
在Spring cloud應用程序中以Feign風格調用http服務,需引入 spring-cloud-starter-openfeign
模塊。
採用Spring MVC REST註解風格聲明一個接口作爲http客戶端:
@FeignClient(name="order-svc", path="/order") // name屬性指定這個FeignClient的名字,對應目標服務的名字,必需配置這個屬性
public interface OrderService {
@GetMapping("/{orderId}")
Order getOrder(@PathVariable String orderId);
@PostMapping
void saveOrder(@RequestBody Order order);
}
項目主配置類需要使用 @EnableFeignClients
開啓對Feign聲明式接口的掃描:
@Configuration
@EnableFeignClients(basePackages={"com..."})
public class Application {
// 使用定義的Feign客戶端調用,就像RPC框架調用本地方法一樣實現遠程調用
@RestController
static class DemoController {
@Autowired
private OrderService feignOrderService; //直接注入
@GetMapping("/order/{orderId}")
public Order getOrder(String orderId) {
return feignOrderService.getOrder(orderId);
}
}
}
配置Feign client
(1)通過@FeignClient註解配置feign客戶端
Feign client的名字是很重要的,對於同一個名字,Spring cloud在背後會創建一組相關的對象,例如feign.Decoder
、 feign.Encoder
、feign.Contract
、Feign.Builder
等,它們共同合作來完成遠程調用,這些對象依據 FeignClientsConfiguration
配置類中的定義進行創建,對每一個命名的Feign client,Spring cloud都會 爲其創建一個ApplicationContext並創建這組對象。
Spring cloud支持我們用戶單獨配置Feign client,自定義的行爲會覆蓋 FeignClientsConfiguration
配置中的 默認定義,通過 @FeignClient#configuration
屬性指定我們自定義配置類即可:
@FeignClient(name="order-svc",
path="/order",
configuration=OrderServiceFeignClientConfiguration.class) //這裏注意OrderServiceFeignClientConfiguration配置類不需要用@Configuration註解聲明
public interface OrderService {
}
@Configuration
public class OrderServiceFeignClientConfiguration {
@Bean
public Contract feignContract() {
// ...
}
}
(2)通過外部化配置定義feign客戶端
feign:
client:
config:
default:
loggerLevel: BASIC
connectionTimeout: 30
readTimeout: 10
<feignName>:
loggerLevel: FULL
encoder:
decoder:
#...
#完整配置請看https://docs.spring.io/spring-cloud-openfeign/docs/3.1.9/reference/html/#spring-cloud-feign-overriding-defaults
feignName
和@FeignClient#name
屬性對應,指定feign客戶端的名字,如果目標服務有多個實例,調用時底層需要 負載均衡策略,那麼feign客戶端名字就應該指定爲目標服務的名字,以便loadbalancer模塊可以解析服務實例。
(3)配置優先級
如果feign客戶端既有@Configuration配置,也通過外部化屬性配置,那麼外部化屬性配置優先級高。如果希望 @Configuration配置的優先級高,可以配置屬性feign.client.default-to-properties=false
。
與熔斷器整合
如果classpath中引入了Spring cloud熔斷器的實現模塊,並且屬性 feign.circuitbreaker.enabled=true
, 則熔斷器會包裝feign client的調用流程。
只需要引入一個具體的熔斷器實現產品即可,Spring cloud對resilience4j和hystrix都提供了集成:
<project>
<!-- 使用resilience4j-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<!-- netflix hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</project>
開關配置(Spring cloud默認其實是開啓熔斷器機制的):
feign:
circuitbreaker:
enabled: true
這樣配置後Feign客戶端自動能夠獲得熔斷降級的能力。