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