package com.commonality.http.fallback;
import feign.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.HttpHeaders;
/**
* @Description:
* @Author: l
* @Date: 2022/2/24 15:01
**/
@FeignClient(name = "dynamicFeign",fallbackFactory = DynamicFallBackFactory.class)
public interface DynamicFeign {
/**
* POST 请求
* @param body
* @return
*/
@RequestLine("POST ")
@Body("{body}")
String postReq(@Param("body") String body,@HeaderMap HttpHeaders headerMap);
/**
* GET 请求
* @return
*/
@RequestLine("GET")
String getReq(@HeaderMap HttpHeaders headerMap);
}
package com.commonality.http.fallback;
/**
* @Description:
* @Author: l
* @Date: 2022/3/1 15:13
**/
public interface HystrixFallbackFactory extends DynamicFeign {
}
package com.commonality.http.fallback;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import java.net.URI;
/**
* @Description:
* @Author: l
* @Date: 2022/3/1 15:13
**/
@Slf4j
@Component
public class DynamicFallBackFactory implements FallbackFactory<DynamicFeign> {
@Override
public DynamicFeign create(Throwable throwable) {
log.info("fallback异常"+throwable);
return new HystrixFallbackFactory(){
@Override
public String postReq(String body, HttpHeaders headerMap) {
log.info("进入fallback");
return "进入fallback";
}
@Override
public String getReq(HttpHeaders headerMap) {
return null;
}
};
}
}
/**
* @Description:
* @Author: l
* @Date: 2022/2/24 15:29
**/
@Component
@Slf4j
public class HttpUtils {
private static final String HTTP_POST="POST";
private static final String HTTP_GET="GET";
/**
*
* @param reqType HTTP_POST,HTTP_GET
* @param url 请求地址
* @param httpHeaders 请求头
* @param params 请求入参
* @return
*/
private String http(String reqType,String url,HttpHeaders httpHeaders,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,false))
// .retryer(new Retryer.Default(period,maxPeriod,maxAttempts))
// .target(DynamicFeign.class,url);
DynamicFeign target = HystrixFeign.builder()
.encoder(new Encoder.Default())
.decoder(new Decoder.Default())
.target(DynamicFeign.class, url, new DynamicFallBackFactory());
switch (reqType){
case HTTP_POST:
result = target.postReq(params,httpHeaders);
break;
case HTTP_GET:
result = target.getReq(httpHeaders);
break;
default:
throw new Exception(-1, "请检查入参'reqType'");
}
}
/**
* 拼接URL参数
* @param params
* @return
* @throws BusinessException
*/
private String jointUrl(String url,Map<String, String> params) throws BusinessException{
log.info("请求的参数 params=" + params);
String allUrl = url;
Iterator<String> it = params.keySet().iterator();
StringBuffer sb = null;
while (it.hasNext()) {
String key = it.next();
String value = null;
try {
value = params.get(key) == null ? "" : URLEncoder.encode(params.get(key), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (sb == null) {
sb = new StringBuffer();
sb.append("?");
} else {
sb.append("&");
}
sb.append(key).append("=").append(value);
}
return allUrl += sb.toString();
}
}
feign:
hystrix:
enabled: true
client:
config:
default:
# default context 连接超时时间
connectTimeout: 50000
#default context 读超时时间
readTimeout: 50000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 25000
circuitBreaker:
endabled: true
requestVolumeThreshold: 200 #请求次数
sleepWindowInMilliseconds: 100000 #休眠时间
errorThresholdPercentage: 80 #设定错误百分比