Spring Cloud Feign 使用方法与性能优化
1. feign自定义Configuration和root 容器有效隔离。
- 用@Configuration注解
- 不能在主@ComponentScan (or @SpringBootApplication)范围内,从其包名上分离
- 注意避免包扫描重叠,最好的方法是明确的指定包名
2. 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
3. Spring Cloud Netflix没有提供默认值,但仍然可以在feign上下文配置中创建:
- Logger.Level
- Retryer
- ErrorDecoder
- Request.Options
- Collection
4. 自定义feign的消息编码解码器:
不要在如下代码中getObject方法内new 对象,外部会频繁调用getObject方法。
1 |
ObjectFactory<HttpMessageConverters> messageConvertersObjectFactory = new ObjectFactory<HttpMessageConverters>() { |
5. 注意测试环境和生产环境,注意正确使用feign日志级别。
6. apacheHttpclient或者其他client的正确配置:
- apacheHttpclient自定义配置放在spring root context,不要在FeignContext,否则不会起作用。
- apacheHttpclient 连接池配置合理地连接和其他参数
7. Feign配置
1 |
#Hystrix支持,如果为true,hystrix库必须在classpath中 # 日志支持 |
8. 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
异常。
例子:
1 |
@FeignClient(name = "hello", fallback = HystrixClientFallback.class) public class HystrixClientFallback implements HystrixClient { @Configuration |
10. 使用Feign Client 和@RequestMapping时,注意事项
当前工程中有和Feign Client中一样的Endpoint时,Feign Client的类上不能用@RequestMapping注解否则,当前工程该endpoint http请求且使用accpet时会报404.
下面的例子:
有一个 Controller
1 |
@RestController @PostMapping("balance") |
有一个Feign Client
1 |
@FeignClient( @RequestMapping(value = "/balance", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) } |
if @RequestMapping is used on class, when invoke http /v1/card/balance, like this :
如果 @RequestMapping注解被用在FeignClient类上,当像如下代码请求/v1/card/balance时,注意有Accept header:
1 |
Content-Type: application/json POST http://localhost:7913/v1/card/balance |
那么会返回 404。
如果不包含Accept header时请求,则是OK:
1 |
Content-Type:application/json |
或者像下面不在Feign Client上使用@RequestMapping注解,请求也是ok,无论是否包含Accept:
1 |
@FeignClient( public interface CardFeignClient { @RequestMapping(value = "/v1/card/balance", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) } |
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 树莓派基础实验4:继电器实验
- 树莓派基础实验5:激光传感器实验
- 树莓派基础实验6:轻触开关按键实验
- 从 lsof 开始,深入理解 Linux 虚拟文件系统!
- 原来 8 张图,就可以搞懂「零拷贝」了
- 构造函数没有返回值是怎么赋值的?
- 高频手撕算法合集来了!
- 面试官:兄弟,说说 ArrayList 和 LinkedList 有什么区别
- 开源中文关系抽取框架,来自浙大知识引擎实验室
- EAST+CRNN银行卡号识别,附数据集
- 绝了!搜狗输入法这骚操作!
- Linux 中几个正则表达式的用法
- 产品级垃圾文本分类器
- 突发!Windows XP 源码泄露!
- GitHub 神器:写代码、搜问题,全部都在「终端」完成!