feign-入门使用及基础配置

最近在优化性能,之前是拿过来就用的,基本上不怎么了解,这篇是记录了在使用时的方法和一些遇到的问题

入门使用

1.引包

<dependency>
            <groupId>org.springframework.cloud</groupId>
    		<artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>

2.启动类使用注解 @EnableFeignClients

3.创建及实现

fallback
@FeignClient(name="SituationService", url = "",
		fallback = VhcCurrentSituationFallback.class)
public interface SituationFeginClient {

@RequestMapping(method = RequestMethod.POST, value = "/getRoutesInfo")
Map<String,Route> queryRoutesInfo(@RequestBody List<String> routeNos);
	
}


@Component
@Slf4j
class VhcCurrentSituationFallback implements SituationFeginClient{

	@Override
	public SituationResponse getSituationInfo(List<String> routeNos) {
		log.info("调用查询公交信息接口失败!");
	SituationResponse data = VhcCurrentSituationResponse.builder()
				.routeName("未知")
				.busName(busName)
				.build();
		return data;
	}
}
fallbackFactory(使用工厂可以了解调用的错误信息)
@FeignClient(name = "route-resource", url = "${urls.api}/v1/routes",fallbackFactory = RouteServiceFallback.class)
public interface RouteService {

    @RequestMapping(method = RequestMethod.POST, value = "/getRoutesInfo")
    Map<String,Route> queryRoutesInfo(@RequestBody List<String> routeNos);

}


@Component
@Slf4j
public class RouteServiceFallback implements FallbackFactory<RouteService> {

      @Override
      public RouteService create(Throwable throwable) {
            return new RouteService() {
              @Override
                  public Map<String, Route> queryRoutesInfo(List<String> routeNos) {
                        log.info("调用getRoutesInfo失败!");
                        log.info("错误信息={}",throwable.getMessage());
                        Map<String, Route> routeMap = new HashMap<>();
                        routeMap.put("K1", toBuildRoute());
                        routeMap.put("K2", toBuildRoute2());
                        return routeMap;
                  }

            };
      }

toBuildRoute返回的是 Route实体

fallback实现类 需要注册到容器内(使用@Component)

HystrixTargeter.targetWithFallback方法实现了@FeignClient.fallback处理逻辑(需要看源码)

注:

1.GetMapping不支持

2. @PathVariable(value = "name") String name

基础配置

超时的配置(默认1s)

原因:

1.在项目中主要是各个系统之间的调用有时间上的延迟,所以配置了超时;还有就是使用熔断时偶尔会出现第一次超时的问题。

feign client 超时配置(未开启熔断时有效,开启熔断后没有作用 ,见例3

例1:

调用方法4s

feign:
  hystrix:
    enabled: false

没有超时配置

不会报超时异常

例2

调用的方法4秒

feign:
  hystrix:
    enabled: false


feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 2000

超时异常

调用的方法4秒

feign:
  hystrix:
    enabled: false


feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 7000

不会报超时异常

例3:

调用方法时间4s

验证1:

feign:
  hystrix:
    enabled: true

feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 2000

请求后会抛出timeout

验证2:
feign:
  hystrix:
    enabled: true

feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 7000

请求后会抛出timeout

 

这个配置不起作用(在网上找得例子,但是应该不是feign-client的配置)

feign:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000

 

熔断没有开启feign的超时配置是可用的,但是熔断开启后feign的超时配置不可用,因为hytrix的默认超时配置生效了,有冲突。


熔断开启的配置

feign:
  hystrix:
    enabled: true

熔断开启后 hystrix的超时配置(二选一,首选方法2)

方法1

hystrix:
  command:
      default:
        execution:
           timeout:
             enabled: false

方法2

hystrix:
  command:
      default:
        execution:
          isolation:
            thread:
              timeoutInMilliseconds: 5000

 

感:用了两天测试超时配置的各种情况,挺浪费时间的;然后还没有看源码,啊,源码的重要性;下一篇应该是对熔断的局部关闭还有主要的性能配置

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值