feign基础

feign基础

feign是一个声明试web服务客户端,是一个便利的rest框架,简化了http的调用。

集成

在pom文件中引入feign依赖,

org.springframework.cloudspring-cloud-starter-openfeign

在启动类中添加@EnablFeignClients注解开启feigin,

@SpringBootApplication
@EnableFeignClients
public class WebApplication {public static void main(String[] args) {SpringApplication.run(WebApplication.class);}
}

编写feigin客户端

FeignClient必须是接口,否则再生成代理类的时候会抛异常。

@FeignClient(value = "resources",configuration = FeiginConfiguration.class)
public interface ResourceFeiginClient {@PostMapping(value="/role/getAllRoles")ResponseEntityDto> getAllRoles();
}

使用

feign的使用非常简单,只需要将feignclient注入到所需要的类中即可,

    @Autowiredprivate ResourceFeiginClient resourceFeiginClient;@PostMapping(value = "testFeigin")public Object testFeigin() {return resourceFeiginClient.getAllRoles();}

@FeignClient注解

声明feign rest客户端,使用ribbon实现负载均衡,@Feign注解提供了一些个性化属性,具体如下源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {/**服务名,{http://},同name属性。即使配置了url属性,name或value也必须指定。*/@AliasFor("name")String value() default "";/**serviceId,同value*/@AliasFor("value")String name() default "";/*** @Qualifier 值*/String qualifier() default "";/**直连url,协议可选*/String url() default "";/*** 自定义的feign配置** FeignClientsConfiguration提供了默认设置。*/Class[] configuration() default {};/*** 指定feign客户端的熔断降级类,fallback类必须实现@FeignClient标注的接口,且必须是一个有效的Bean,即加入@Component等注解。*/Class fallback() default void.class;/*** 为feign client接口定义fallback工厂,fallback工厂必须提供实现feignClient接口的fal* lback实例,fallbackfactory必须是一个有效的bean。* @see feign.hystrix.FallbackFactory for details.*/Class fallbackFactory() default void.class;/*** 指定path前缀。*/String path() default "";
}

自定义feign配置

FeignClientsConfiguration定义了feign的默认配置,如果@FeignClient没有指定配置类,feign会使用默认的配置。spring cloud允许我们自定义Feign的配置。

1.spring cloud netflix提供了下面的默认配置bean(BeanType beanName: ClassName)::

  • Decoder feignDecoder: ResponseEntityDecoder
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: HystrixFeign.
  1. OkHttpClient 和 ApacheHttpClie

如果想使用 OkHttpClient 和 ApacheHttpClie 等客户端,需要配置如下属性:

feign.okhttp.enabled=true
feign.httpclient.enabled=true

spring cloud 没有提供如下bean的默认配置,但是在生成客户端时仍在ApplicationContext中搜索这些bean:

  • Logger.Level
  • Retryer
  • ErrorDecoder
  • Request.Options
  • Collection
  • SetterFactory

在FeignClient配置类中定义如上bean的实例即可使用,如下:

public class FooConfiguration {@Beanpublic Contract feignContract() {return new feign.Contract.Default();}@Beanpublic BasicAuthRequestInterceptor basicAuthRequestInterceptor() {return new BasicAuthRequestInterceptor("user", "password");}
}

@FeignClient的配置也可以定义在配置文件中:

feign:client:config:feignName:connectTimeout: 5000readTimeout: 5000loggerLevel: fullerrorDecoder: com.example.SimpleErrorDecoderretryer: com.example.SimpleRetryerrequestInterceptors:- com.example.FooRequestInterceptor- com.example.BarRequestInterceptordecode404: falseencoder: com.example.SimpleEncoderdecoder: com.example.SimpleDecodercontract: com.example.SimpleContract

所有feign客户端通用的配置可以在@EnableFeignClients使用defaultConfiguration属性中指,也可以使用配置文件配置全局配置:

feign:client:config:default:connectTimeout: 5000readTimeout: 5000loggerLevel: basic

如果在配置文件中定义了配置,又定义了@Configuration配置,会优先使用配置文件中的配置,可以修改如下属性来改变这一特性:

feign.client.default-to-properties=false

feign hystrix

如果Hystrix存在且feign.hystrix.enabled=true,feign将会使用circuit breaker。

Feign Hystrix Fallbacks

Hystrix支持熔断方法,如果发生错误或熔断器打开会执行默认的方法。
如何定义fallback?提供@FeignClient接口的实现类,且注册到spring容器中,在@FeignClient fallback属性中指定即可。

@FeignClient(name = "hello", fallback = HystrixClientFallback.class)
protected interface HystrixClient {@RequestMapping(method = RequestMethod.GET, value = "/hello")Hello iFailSometimes();
}static class HystrixClientFallback implements HystrixClient {@Overridepublic Hello iFailSometimes() {return new Hello("fallback");}
}

Feign request/response 压缩

feign.compression.request.enabled=true
feign.compression.response.enabled=true
feign.compression.request.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048

Feign 日志

feign默认生成的Log 是FULL,但是feign只能打印DEBUG级别的日志,所以如果想查看feign日志,需要如下配置:

logging.level.project.user.UserClient: DEBUG

同时定义日志bean,在@EnableFeignClients中指定defaultConfiguration属性即可。

@Configuration
public class FooConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

feign重试机制

spring:cloud:loadbalancer:retry:enabled: true #开启服务重试

在feign配置类中定义Retryben,设置重试机制,当然也可以在配置文件中配置。

关于feign重试的使用一定要慎重,对于新增修改的操作要做好幂等操作,否则会出现重复数据。

feign 饥饿加载

feign默认是在第一次调用的时候实例化,这会带来一个问题,如果超时时间设置的太短的话会报超时错误,这不是我们想要的,我们希望在程序启动的时候就实例化feign,幸运的是我们可以通过修改feign的属性来改变这一默认的行为,

# feign饥饿加载配置
ribbon:eager-load:enabled: trueclients: [RESOURCES]

这里必须要同时配置clients,否则饥饿加载机制可能会不起作用。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部