spring feign 调用

通用应用程序属性
可以在应用程序中指定 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)
HttpURLConnectionfeign.client.[default|<feignClientName>].connect-timeout
默认值:10秒
eign.client.[default|<feignClientName>].read-timeout
默认值:60秒
N/AN/AN/A
HttpClientfeign.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
OkHttpfeign.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);

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值