feign基础
feign基础
feign是一个声明试web服务客户端,是一个便利的rest框架,简化了http的调用。
集成
在pom文件中引入feign依赖,
org.springframework.cloud spring-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.
- 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,否则饥饿加载机制可能会不起作用。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
