Spring cloud openfeign 聲明式HTTP調用

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.Decoderfeign.Encoderfeign.ContractFeign.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客戶端自動能夠獲得熔斷降級的能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章