springcloud 实战 feign使用中遇到的相关问题

 springcloud 实战 feign使用中遇到的相关问题


1.使用feign客户端调用其他微服务时,session没有传递成功,sessionId不一样。

/**
 * @author xbchenf
 * @date 2018-10-27 16:35:52
 * @description 通过拦截器,将head补上,避免session丢失
 */
@Configuration
public class FeignConfiguration implements RequestInterceptor{
    private final Logger logger = LoggerFactory.getLogger(FeignConfiguration.class);
    @Override
    public void apply(RequestTemplate template) {

        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            return;
        }
        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                Enumeration<String> values = request.getHeaders(name);
                while (values.hasMoreElements()) {
                    String value = values.nextElement();
                    logger.warn("name:"+name+";value:"+value);
                    template.header(name, value);
                }
            }
        }

    }
}

  


2.使用feign客户端调用其他微服务时,发送POST请求时,对象信息没有传递成功。

关键在于加上注解:@RequestBody

feign客户端:

@FeignClient(name = "mpmt-user")
public interface PersonFeignClient {

  @GetMapping("/feign/testGet/{id}")
  public ResponseEntity<JsonResult> testGet(@PathVariable(value = "id") Integer id);

  @PostMapping("/feign/testPost")
  public ResponseEntity<JsonResult> testPost(@RequestBody Person person);
}

  

微服务服务端:mpmt-user

@RestController
@RequestMapping("/feign")
public class FeignController {

    private final Logger logger = Logger.getLogger(FeignController.class);

    @GetMapping("/testGet/{id}")
    public ResponseEntity<JsonResult> testGet(@PathVariable(value = "id") Integer id,HttpServletRequest request) {
        JsonResult r = new JsonResult();
        try {
            logger.info("sessionid:"+request.getSession().getId());
            User user = (User)request.getSession().getAttribute("sessionUser");
            logger.info("userId:"+user.getId());
            r.setResult(user);
            r.setStatus("200");
        } catch (Exception e) {
            r.setResult(e.getClass().getName() + ":" + e.getMessage());
            r.setStatus("error");
            e.printStackTrace();
        }
        return ResponseEntity.ok(r);
    }

    /**
     * 添加用户
     * 提供给后端feign调用的接口,post请求都要使用@RequestBody ,包括feign中定义的接口
     * @param person
     * @return
     */
    @PostMapping("/testPost")
    public ResponseEntity<JsonResult> testPost(@RequestBody Person person,HttpServletRequest request) {
        JsonResult r = new JsonResult();
        try {
            logger.info("sessionid:"+request.getSession().getId());
            User user = (User)request.getSession().getAttribute("sessionUser");
            logger.info("userId:"+user.getId());
            r.setResult(person);
        } catch (Exception e) {
            r.setResult(e.getClass().getName() + ":" + e.getMessage());
            r.setStatus("error");

            e.printStackTrace();
        }
        return ResponseEntity.ok(r);
    }

}


3.使用feign客户端调用其他微服务时,报错超时:e=feign.RetryableException: Read timed out executing POST

ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
原文地址:https://www.cnblogs.com/brant/p/9864813.html