Состав и конфигурация Spring Cloud Feign

Java

Композиция Feign

интерфейс
эффект
По умолчанию
Feign.Builder
Вход в Притворство
Feign.Builder
Client
Что Feign использует внизу, чтобы запросить
При работе с лентой:LoadBalancerFeignClient
Когда вы не работаете с лентой:Fgien.Client.Default
Contract
договор, поддержка аннотаций
SpringMVCContract
Encoder
Декодер для преобразования эксклюзивов в тело сообщения HTTP-запроса
SpringEncoder
Decoder
Кодировщик, который преобразует соответствующее тело сообщения в объект
ResponseEntityDecoder
Logger
менеджер журналов
Slf4jLogger
RequestInterceptor
Используется для добавления общей логики к каждому запросу (например, перехватчик: например, желание услышать каждый запрос)
никто

Уровень журнала Фейна

уровень журнала
распечатать содержимое
НЕТ (по умолчанию)
не записывать никаких
BASIC
Только метод запроса журнала, URL-адрес, код состояния ответа и время выполнения (подходит для производственных сред)
HEADERS
На основе записи БАЗОВОГО уровня записывается заголовок запроса и ответа
FULL
Запись запроса аккорда в начале, теле и метаданных

Как интегрировать Feign в первую очередь

Следуйте за трехконечным топором SpringBootШаг 1: Добавьте зависимости

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

Шаг 2: Пишите заметки

@EnableFeignClients //在启动类上加

Шаг 3: Напишите конфигурацию

Как добавить уровень логирования в Feign

мелкозернистый

Метод 1: реализация кодаШаг 1: Добавьте класс конфигурации Feign, который можно добавить в основной класс, но добавлять его не нужно.@Configuration. если добавлено@ConfigurationИ он помещается в основной класс, тогда все экземпляры клиента Feign будут общими, а конфликт загрузки контекста родитель-потомок такой же, как у класса конфигурации ленты; если его нужно добавить@Configuration, сразу за пакетом загрузки основного класса. Рекомендуется не добавлять@Configuration.

public class FeignConfig {
    @Bean
    public Logger.Level Logger() {
        return Logger.Level.FULL;
    }
}

Шаг 2: Дайте@FeignClientДобавить класс конфигурации

//@FeignClient configuration = GoodsFeignConfig.class 细粒度配置,指定配置类
@FeignClient(name = "goods", configuration = FeignConfig.class)

Шаг 4: Напишите конфигурацию

logging:
  level:
    com.xxx.xxx.FeignAPI: DEBUG #需要将FeignClient接口全路径写上# 开启日志 格式为logging.level.+Feign客户端路径

Способ 2: реализация свойства конфигурации

feign:
  client:
    config:
      #想要调用的微服务名称
      server-1:
        loggerLevel: FULL

Глобальная конфигурация

Метод 1: реализация кодаДобавлен@ConfigurationПоместите его в основной класс, тогда все экземпляры клиента Feign будут общими, а конфликт загрузки контекста между родителем и дочерним элементом будет таким же, как и в классе конфигурации ленты; пусть ComponentScan контекста между родителем и дочерним элементом перекрывается (настоятельно не рекомендуется).единственный правильный путь

//在启动类上为@EnableFeignClients注解添加defaultConfiguration配置
@EnableFeignClients(defaultConfiguration = FeignConfig.class)

Способ 2: реализация свойства конфигурации

feign:
  client:
    config:
      #将调用的微服务名称改成default就配置成全局的了
      default:
        loggerLevel: FULL

Элементы конфигурации, поддерживаемые Feign

Код пути

элемент конфигурации
эффект
Logger.Level
указать уровень журнала
Retryer
Укажите стратегию повтора
ErrorDecoder
Указать декодер ошибок
Request.Options
сверхурочное время
Collection
перехватчик
SetterFactory
Используется для установки свойств конфигурации Hystrix, Fgien будет использоваться только при интеграции Hystrix.

свойства конфигурации

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000  # 相当于Request.Optionsn 连接超时时间
        readTimeout: 5000     # 相当于Request.Options 读取超时时间
        loggerLevel: full     # 配置Feign的日志级别,相当于代码配置方式中的Logger
        errorDecoder: com.example.SimpleErrorDecoder  # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder
        retryer: com.example.SimpleRetryer  # 配置重试,相当于代码配置方式中的Retryer
        requestInterceptors: # 配置拦截器,相当于代码配置方式中的RequestInterceptor
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        # 是否对404错误解码
        decode404: false
        encode: com.example.SimpleEncoder
        decoder: com.example.SimpleDecoder
        contract: com.example.SimpleContract

Feign также поддерживает сжатие GZIP запросов и ответов для повышения эффективности связи.Конфигурация выглядит следующим образом:

# 配置请求GZIP压缩
feign.compression.request.enabled=true
# 配置响应GZIP压缩
feign.compression.response.enabled=true
# 配置压缩支持的MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 配置压缩数据大小的下限
feign.compression.request.min-request-size=2048

Конфигурация ленты VS конфигурация Feign

детализация
Ribbon
Feign
местный код
@RibbonClient(configuration=RibbonConfig.class),RibbonConfigнадо добавить класс@Configuration, и должен быть помещен в пакет, который не может быть просканирован родительским контекстом.
@FeignClient(configuration=FeignConfig.class),FeignConfigКатегория@ConfigurationЕго можно не указывать (необязательно), если он есть, то его необходимо разместить под пакетом, который не может быть просканирован родительским контекстом.
глобальный код
@RibbonClients(defaultConfigurtion=RibbonConfig.class)
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
...
Свойства конфигурации Локальные
.ribbon.NFLoadBalancerClassName
...
feign.client.config..loggerLevel
...
Глобальные свойства конфигурации
никто feign.client.config.default.loggerLevel

Метод фиктивного кода VS метод свойства конфигурации

Метод конфигурации
немного
недостаток
Конфигурация кода
На основе кода, более гибкий
Если класс конфигурации Feign добавлен@ConfigurationОбратите внимание, обратите внимание на контекст родитель-потомок, онлайн-модификации должны быть переупакованы и опубликованы.
конфигурация свойства
легко использовать
Конфигурация более интуитивно понятна
Онлайн-модификацию не нужно переупаковывать, публиковать
более высокий приоритет
Никакая конфигурация кода не является более гибкой в ​​экстремальных сценариях

Приоритет: детальная конфигурация свойств > детальная конфигурация кода > глобальная конфигурация свойств > глобальная конфигурация кода

Личный блог Чжао Сяопана