Feign & Ribbon开发配置
- 聊聊如何根据环境动态指定feign调用服务名 - 云+社区 - 腾讯云
- Spring Cloud如何解决开发人员调试过程服务冲突和实例乱窜?
eureka:
client:
register-with-eureka: false
fetch-registry: false
ribbon.eureka.enabled: false
[feign服务].ribbon.listOfServers: [feign-hostname1]:[port1]
[feign服务].ribbon.listOfServers: [feign-hostname2]:[port2]
Feign
Feign的组成
【坑】Feign和Ribbon的超时配置
《Java 业务开发常见错误 100 例》-极客时间
还有hystrix超时设置。熔断根据hystrix和feign超时时间最小值。Feign的日志级别
Feign日志级别配置【注意log级别要配置为debug】
Java代码配置
Feign配置
Feign中的RequestParam,RequestBody,SpringQueryMap
- @RequestParam:get传参,只能基本类型
- @SpringQueryMap:get传参,对象类型
- @RequestBody:post传参
【Feign优化】Feign默认是URLConnection可替换为HttpClient
URLConnection没有连接池。
- 加依赖
- 写配置
默认的defaultMaxPerRoute=2,maxTotal=20
【Spring Cloud】详解Feign常用配置 - SegmentFault 思否
Feign的性能优化 - 简书
【Feign优化】Feign压缩
推荐
Feign整合Hystrix
- 配置feign.hystrix.enabled:true
- 设置@FeignClient注解的fallback和fallbackFactory
fallbackFactory优点就是可以获得异常Exception。
Feign配置HystrixProperty
@HystrixProperty only works with @HystrixCommand, not @RequestMapping and @FeignClient. Generally setting hystrix properties in application.properties works
Feign整合Sentinel
@FeignClient(name = "user-center",
// fallback = UserCenterFeignClientFallback.class,
fallbackFactory = UserCenterFeignClientFallbackFactory.class
)
fallback不可以接收异常,fallbackFactory可以
【坑】Feign传递token【RequestInterceptor】
- @RequestHeader
- RequestInterceptor
@Slf4j
@Configuration
public class FeignConfig {
/**
* <h2>给 Feign 配置请求拦截器</h2>
* RequestInterceptor 是我们提供给 open-feign 的请求拦截器, 把 Header 信息传递
* */
@Bean
public RequestInterceptor headerInterceptor() {
return template -> {
ServletRequestAttributes attributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (null != headerNames) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
// 不能把当前请求的 content-length 传递到下游的服务提供方, 这明显是不对的
// 请求可能一直返回不了, 或者是请求响应数据被截断
if (!name.equalsIgnoreCase("content-length")) {
// 这里的 template 就是 RestTemplate
template.header(name, values);
}
}
}
}
};
}
}
- CodeRepo/FeignConfig.java at main · 4rnold/CodeRepo
- 【复制Header Content-Length的坑】【原创】经验分享:一个Content-Length引发的血案(almost….)_一枝花算不算浪漫_InfoQ写作平台
- 发给feign的request Content-Length和feign发送给server的Request Content-Length往往是不一样的(比如feign将原来的post变为了get请求)
feign原生api
CodeRepo/UseFeignApi.java at main · 4rnold/CodeRepo【坑】Feign Post变get
使用的是 2.1.1 版本的 feign,进过大量的测试,无论是标准是 @PostMapping 还是 @GetMapping,只要参数标注 @RequestParam,调用的时候就一律都用 Get 请求,也就是说把参数拼接到 URL 上。如果想使用Post 请求,需要在参数标记@RequestBody,这样无论是 Get 还是 Post 都一律使用 Post。
- 发给feign的request Content-Length和feign发送给server的Request Content-Length往往是不一样的(比如feign将原来的post变为了get请求)