Spring Cloud Alibaba-Feign(十四)

簡介

Feign makes writing java http clients easier(聲明式http客戶端)官方文檔java

整合Feign

  • 加依賴
<!--version由父工程定義-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
複製代碼
  • 寫註解
@EnableFeignClients
複製代碼
  • 寫配置
複製代碼

使用

package com.virgo.user.feignclient;

import com.virgo.entity.TblCar;
import com.virgo.user.configuration.GlobalFeignConfiguration;
import com.virgo.user.feignclient.fallbackFactory.LockCenterFeignClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author zhaozha
 * @date 2019/10/11 下午12:52
 */
@FeignClient(name = "lock-center", configuration = GlobalFeignConfiguration.class,fallbackFactory = LockCenterFeignClientFallbackFactory.class)
public interface LockCenterFeignClient {
    // 自動構建http://lock-center/lock/test/{id}
    @GetMapping("/lock/test/{id}")
    TblCar findById(@PathVariable(value="id") Long id);
}

// Controller
...
private final LockCenterFeignClient lockCenterFeignClient;
...
TblCar tblCar = lockCenterFeignClient.findById(4000002L);
...

複製代碼

組成

接口 做用 默認值
Feign.Builder Feign的入口 Feign.Builder
Client Feign底層用什麼去請求 LoadBalancerFeignClient(整合Ribbon)/fengn.Client.Default(不整合Ribbon)
Contract 契約,註解支持 SpringMvcContract
Encoder 編碼器,用於將對象轉換成HTTP請求消息體 SpringEncoder
Decoder 解碼器,將響應消息體轉換成對象 ResponseEntityDecoder
Logger 日誌管理器 Slf4jLogger
RequestInterceptor 用於爲每一個請求添加通用邏輯

日誌級別

級別 打印內容
NONE(默認值) 不記錄任何日誌
BASIC 僅記錄請求的方法/URL/響應狀態碼/執行時間
HEADERS BASIC+請求和響應的header
FULL 記錄請求和響應的header/body/元數據

日誌配置

  • 細粒度代碼git

    • yml
    Feign日誌級別設置(代碼)
    logging:
      level:
        com.virgo.user.feignclient.LockCenterFeignClient: debug
    複製代碼
    • 代碼
    package com.virgo.user.feignclient;
    
    import com.virgo.entity.TblCar;
    import com.virgo.user.configuration.GlobalFeignConfiguration;
    import com.virgo.user.feignclient.fallbackFactory.LockCenterFeignClientFallbackFactory;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    /**
     * @author zhaozha
     * @date 2019/10/11 下午12:52
     */
    @FeignClient(name = "lock-center", configuration = GlobalFeignConfiguration.class,fallbackFactory = LockCenterFeignClientFallbackFactory.class)
    public interface LockCenterFeignClient {
    
        @GetMapping("/lock/test/{id}")
        TblCar findById(@PathVariable(value="id") Long id);
    }
    
    GlobalFeignConfiguration.class
    package com.virgo.user.configuration;
    
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    
    /**
     * @author zhaozha
     * @date 2019/10/11 下午1:18
     */
    public class GlobalFeignConfiguration {
        @Bean
        public Logger.Level level(){
            // 讓feign打印全部請求的細節
            return Logger.Level.FULL;
        }
    }
    
    複製代碼
  • 細粒度配置github

feign:
  client:
    config:
      lock-center:
        loggerLevel: FULL
複製代碼
  • 全局代碼
@EnableFeignClients(defaultConfiguration = GlobalFeignConfiguration.class)
複製代碼
  • 全局配置
feign:
  client:
    config:
      default:
        loggerLevel: FULL
複製代碼

配置項

代碼web

配置項 做用
Logger.Level 指定日誌級別
Retryer 指定重試策略
ErrorDecoder 指定錯誤解碼器
Request.Options 超時時間
Collection 攔截器
SetterFactory Hystrix相關

配置spring

feign:
  client:
    config:
      # 全局
      default:
        # 日誌級別
        loggerLevel:
        # 鏈接超時時間
        connectTimeout:
        # 讀取超時時間
        readTimeout:
        # 錯誤解碼器
        errorDecoder:
        # 重試策略
        retryer:
        # 攔截器
        requestInterceptors:
        # 404錯誤碼解碼
        decode404:
        # 編碼器
        encoder:
        # 解碼器
        decoder:
        # 契約
        contract:
複製代碼

繼承

todoapache

多參數

@GetMapping("/lock/car/{carId}/user/{userId}")
TblCar findById(@PathVariable(value="carId") Long carId,@PathVariable(value="userId") Long userId);
複製代碼

脫離ribbon

@FeignClient(name="",url="")
複製代碼

feign & restTemplate

  • 性能:restTemplate
  • 可讀性:feign

優化

feign:
  httpclient:
    # 讓feign使用apache httpclient作請求;而不是默認的urlconnection
    enabled: true
    # feign的最大鏈接數
    max-connections: 200
    # feign單個路徑的最大鏈接數
    max-connections-per-route: 50
複製代碼

fallback & fallbackFactory

  • fallback
// 1註解
@FeignClient(....,fallback=xxx.class)

// 2代碼
package com.virgo.user.feignclient.fallback;

import com.virgo.entity.TblCar;
import com.virgo.user.feignclient.LockCenterFeignClient;
import org.springframework.stereotype.Component;

/**
 * @author zhaozha
 * @date 2019/10/16 下午3:36
 */
@Component
public class LockCenterFeignClientFallback implements LockCenterFeignClient {
    @Override
    public TblCar findById(Long id,Long userId) {
        return TblCar.builder().level(1).build();
    }

    @Override
    public TblCar testPost(String params) {
        return null;
    }
}



複製代碼
  • fallbackFactory(強於fallback,能夠打印異常)
// 1註解
@FeignClient(....,fallbackFactory=xxx.class)

// 2代碼
package com.virgo.user.feignclient.fallbackFactory;

import com.virgo.entity.TblCar;
import com.virgo.user.feignclient.LockCenterFeignClient;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author zhaozha
 * @date 2019/10/16 下午4:02
 */
@Component
@Slf4j
public class LockCenterFeignClientFallbackFactory implements FallbackFactory<LockCenterFeignClient> {
    @Override
    public LockCenterFeignClient create(Throwable throwable) {
        return new LockCenterFeignClient() {
            @Override
            public TblCar findById(Long id,Long userId) {
                log.info("限流/降級",throwable);
                return TblCar.builder().level(1).build();
            }

            @Override
            public TblCar testPost(String params) {
                return null;
            }
        };
    }
}

複製代碼
相關文章
相關標籤/搜索