SpringCloud- 技术专题 -Feign 组件基本使用(2)
前提概要
本章主要介绍相关的 Fegin 的相关配置和更深入一些的使用方式,如果对 Fegin 的不了解的话,可以先了
解一下,基于上一章之后,本章节属于完全不依赖于前一章,请放心观看本章内容。
feign 自定义 Configuration 和 root 容器有效隔离:
用 @Configuration 注解不能在 @ComponentScan or @SpringBootApplication 范围内,从其包名上分离注意避免包扫描重叠,最好的方法是明确的指定包名。
Spring Cloud Netflix 提供了默认的 Bean 类型:
Decoder feignDecoder:ResponseEntityDecoder (which wraps a SpringDecoder)
Encoder feignEncoder:SpringEncoder
Logger feignLogger: Slf4jLogger
Contract feignContract: SpringMvcContract
Feign.Builder feignBuilder: HystrixFeign.Builder
Spring Cloud Netflix 没有提供默认值,但仍然可以在 feign 上下文配置中创建:
Logger.LevelRetryerErrorDecoderRequest.OptionsCollection<RequestInterceptor>
自定义 feign 的消息编码:不要在代码中 getObject 方法内 new 对象,外部会频繁调用 getObject。
注意测试环境和生产环境,注意正确使用 feign 日志级别。
apacheHttpclient 或者其他 client 的正确配置:
apacheHttpclient 配置放在 spring root context,不要在 FeignContext,否则不会起作用。
apacheHttpclient 连接池配置合理地连接和其他参数
Feign 配置对 Hystrix 支持
如果为 true,hystrix 库必须在 classpath 中
feign.hystrix.enabled=false
请求和响应 GZIP 压缩支持
feign.compression.request.enabled=true
feign.compression.response.enabled=true
支持压缩的 mime types
feign.compression.request.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
日志支持
logging.level.project.user.UserClient: DEBUG
Logger.Level 支持必须为每一个 Feign Client 配置来告诉 Feign 如何输出日志,可选:
NONE,No logging (DEFAULT).
BASIC, Log only the request method and URL and the response status code and execution time.
HEADERS, Log the basic information along with request and response headers.
FULL, Log the headers, body, and metadata for both requests and responses.9.
FeignClient.fallback 正确的使用方法配置的 fallback class 也必须在 FeignClient Configuration 中实例化,否则会报 java.lang.IllegalStateException: No fallback instance of type class 异常。
例子
使用 Feign Client 和 @RequestMapping 时,注意事项当前工程中有和 Feign Client 中一样的 Endpoint 时 Feign Client 的类上不能用 @RequestMapping 注解否则,当前工程该 endpoint http 请求且使用 accept 时会报 404.
例子
有一个 Controller
有一个 Feign Client
(1)如果 @RequestMapping 注解被用在 FeignClient 类上,如下代码请求/v1/card/balance 时,注意有,那么会返回 404。
Accept header:
Content-Type:application/jsonAccept:application/json
POST http://localhost:7913/v1/card/balance
(2)如果不包含 Accept header 时请求,则是 OK:
Content-Type : application/json
POST http://localhost:7913/v1/card/balance
或者像下面不在 Feign Client 上使用 @RequestMapping 注解,请求也是 ok,无论是否包含 Accept:
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/4411664d47722bc3a48a18dbd】。文章转载请联系作者。
评论