通用应用程序属性
可以在应用程序中指定 application.properties 中配置
配置项 | 默认值 | 描述 |
---|---|---|
feign.client.config | ||
feign.client.default-config | default | |
feign.client.default-to-properties | true | |
feign.compression.request.enabled | false | 配置请求GZIP压缩。 |
feign.compression.request.mime-types | [text/xml, application/xml, application/json] | 配置压缩支持的MIME TYPE |
feign.compression.request.min-request-size | 2048 | 配置压缩数据大小的下限 |
feign.compression.response.enabled | false | 配置响应GZIP压缩。 |
feign.compression.response.useGzipDecoder | false | 启用默认的gzip解码器。 |
feign.httpclient.connection-timeout | 2000 | 连接超时时间(单位:秒) |
feign.httpclient.connection-timer-repeat | 3000 | |
feign.httpclient.disable-ssl-validation | false | |
feign.httpclient.enabled | true | 开启(true)/关闭(false) Apache HTTP请求方式 |
feign.httpclient.follow-redirects | true | |
feign.httpclient.max-connections | 200 | 线程池最大连接数(全局) |
feign.httpclient.max-connections-per-route | 50 | 线程池最大连接数(单个HOST) |
feign.httpclient.time-to-live | 900 | 线程存活时间(单位:秒) |
feign.httpclient.time-to-live-unit | ||
feign.hystrix.enabled | false | 开启(true)/关闭(false)Hystrix功能 |
feign.okhttp.enabled | false | 开启(true)/关闭(false) OK HTTP请求方式 |
Feign提供了两大类配置属性来配置上述三种HTTP客户端,feign.client.*和feign.httpclient.*,前者支持按实例进行配置(注解-1),后者全局共享一套配置,包含线程池配置,但只影响HttpClient和OkHttp,不影响HttpURLConnection,具体关系见下表。
注解-1:所谓按实例进行配置,就是指每个FeignClient实例都可以通过feign.client.<feignClientName>.*来单独进行配置,注意首字母小写。而feign.client.default.*表示默认配置。
HTTP客户端 | 连接超时时间 | 请求超时时间 | 线程存活时间 | 线程池最大连接数(全局) | 线程池最大连接数(单个HOST) |
---|---|---|---|---|---|
HttpURLConnection | feign.client.[default|<feignClientName>].connect-timeout 默认值:10秒 | eign.client.[default|<feignClientName>].read-timeout 默认值:60秒 | N/A | N/A | N/A |
HttpClient | feign.httpclient.connection-timeout 默认值:2秒 | 默认值: -1(RequestConfig.Builder.socketTimeout) | feign.httpclient.time-to-live 默认值:900秒 | feign.httpclient.max-connections 默认值:200 | feign.httpclient.max-connections-per-route 默认值:50 |
OkHttp | feign.httpclient.connection-timeout 默认值:2秒 | feign.client.[default|<feignClientName>].read-timeout 默认值:10秒 | feign.httpclient.time-to-live 默认值:900秒 | feign.httpclient.max-connections 默认值:200 | N/A |
其他:
1.feign关闭重发机制:
ribbon:
MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
OkToRetryOnAllOperations: false #是否所有操作都重试
注:
可参考:https://blog.csdn.net/milugloomy/article/details/102460706?spm=1001.2014.3001.5506
额外理解重试:
#hystrix的超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 9000
#ribbon的超时时间
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
一般情况下 都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制)
因为ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制,
要开启Feign的重试机制如下:(Feign默认重试五次 源码中有)
ribbon的重试机制 :设置重试次数:
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
OkToRetryOnAllOperations: false #是否所有操作都重试
根据上面的参数计算重试的次数:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用
如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义
hystrix超时时间的计算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 (1+1+1)*3=9秒
当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重试次数,默认会重试一次
注意:
默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试
非GET方式请求,只有连接异常时,才会进行重试
2.@FeignClient标签的常用属性如下:
name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
url: url一般用于调试,可以手动指定@FeignClient调用的地址
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
path: 定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用
1.feign远程调用
@FeignClient(name="custorm",fallback=Hysitx.class)
public interface IRemoteCallService {
@RequestMapping(value="/custorm/getTest",method = RequestMethod.POST)
List<String> test(@RequestParam("names") String[] names);
}
2.编写熔断类,发生错误时回调:
import java.util.List;
import org.springframework.stereotype.Component;
@Component
public class Hysitx implements IRemoteCallService{
@Override
public List<String> test(String[] names) {
System.out.println("接口调用失败");
return null;
}
}
3.如何给@FeignClient添加Header信息
a:
@RequestMapping(value="/custorm/getTest",method = RequestMethod.POST,
headers = {"Content-Type=application/json;charset=UTF-8"})
List<String> test(@RequestParam("names") String[] names);
b:
@RequestMapping(value="/custorm/getTest",method = RequestMethod.POST,
headers = {"Content-Type=application/json;charset=UTF-8"})
List<String> test(@RequestParam("names")@RequestHeader("Authorization") String[] names);
c:设置多个属性时,可以使用Map,
@RequestMapping(value="/custorm/getTest",method = RequestMethod.POST,
headers = {"Content-Type=application/json;charset=UTF-8"})
List<String> test(@RequestParam("names") String[] names, @RequestHeader MultiValueMap<String, String> headers);
d:使用@Header注解
@RequestMapping(value="/custorm/getTest",method = RequestMethod.POST)
@Headers({"Content-Type: application/json;charset=UTF-8"})
List<String> test(@RequestParam("names") String[] names);