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
