springcloud 动态feign请求

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 #设定错误百分比 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值