package com.lf.utils.commonality.http;
import com.alibaba.fastjson.JSONObject;
import feign.Feign;
import feign.Request;
import feign.Retryer;
import feign.Target;
import feign.codec.Decoder;
import feign.codec.Encoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class HttpUtils {
@Value("${feignOptions.connectTimeout}")
private Long connectTimeout;
@Value("${feignOptions.readTimeout}")
private Long readTimeout;
@Value("${feignRetryer.period}")
private Long period;
@Value("${feignRetryer.maxPeriod}")
private Long maxPeriod;
@Value("${feignRetryer.maxAttempts}")
private Integer maxAttempts;
private String http(String url,String contentType,String params){
//超时时间和重试直接的关系N=maxAttempts(次数)O=options, R=retryer 超时时间=N(O+R)-R
DynamicFeign target = Feign.builder().encoder(new Encoder.Default())
.decoder(new Decoder.Default())
.options(new Request.Options(connectTimeout,
TimeUnit.MILLISECONDS,readTimeout,
TimeUnit.MILLISECONDS,true))
.retryer(new Retryer.Default(period,maxPeriod,maxAttempts))
.target(DynamicFeign.class,url);
String result = target.reqMethod(contentType,params);
return result;
}
@RestController
public class FeignApi {
@Autowired
private HttpUtils httpUtils;
@Override
@PostMapping("/getTest")
@ApiOperation(value = "测试动态url地址请求")
public String getWard() {
httpUtils.http("http://ip:8882/test",""application/json",JSONObject.toJSonString(args));
return "成功";
}
}
@FeignClient(name = "dynamicFeign",fallback = DynamicFeignFallBack.class)
public interface DynamicFeign {
@RequestLine("POST ")
@Headers("Content-Type: {contentType}")
@Body("{body}")
String reqMethod(@Param("contentType") String contentType,@Param("body") String body);
}