其他
SpringCloud使用Feign经验总结(Dalston.SR1)
主要讲述SpringCloud在使用Feign经验总结(Dalston.SR1),如何优雅的使用GET/POST/PUT/DELETE等等,以及为什么别人使用的都是POST?
为什么要改成POST?
用户服务
1.使用Feign遇到问题的时候,老司机第一句话就是改成POST试试,我很纳闷,直到我撸了半天代码测试了不同情况得出以下几个结论!!!
/**
* 提取用户服务的会员信息
*
* @author Levin
*/@FeignClient(name = "commerce-user-service", fallback = UserServiceFallback.class)public interface BodyImageService {
① @RequestMapping(value = "/query",method = RequestMethod.GET) PageInfo<BodyImage> query(String name);
② @RequestMapping(value = "/query",method = RequestMethod.POST) PageInfo<BodyImage> query(@PathVariable("name") String name);
③ @GetMapping("/query/{name}") PageInfo<BodyImage> query(@PathVariable("name") String name); /**
* 这边采取了和Spring Cloud官方文档相同的做法,<br>
* 将fallback类作为内部类放入Feign的接口中,当然也可以单独写一个fallback类。
*
* @author Levin
*/
@Component
static class UserServiceFallback implements BodyImageService { private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceFallback.class); @Override
public PageInfo<BodyImage> query(String name) {
UserServiceFallback.LOGGER.info("[请求错误,请稍后在试...]"); return new PageInfo<>();
}
}
}
@RestControllerpublic class BodyImageServiceImpl implements BodyImageService { private static final Logger LOGGER = LoggerFactory.getLogger(BodyImageServiceImpl.class); @Autowired
BodyImageMapper imageMapper;
① @RequestMapping(value = "/query",method = RequestMethod.GET) @Override
public PageInfo<BodyImage> query(String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> { this.imageMapper.queryBodyImageForList();
}); return info;
}
② @RequestMapping(value = "/query",method = RequestMethod.POST) @Override
public PageInfo<BodyImage> query(String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> { this.imageMapper.queryBodyImageForList();
}); return info;
}
③ @GetMapping("/query/{name}") @Override
public PageInfo<BodyImage> query(@PathVariable("name") String name) {
LOGGER.debug("[name] - [{}]", name);
PageInfo<BodyImage> info = PageHelper.startPage(1, 20).doSelectPageInfo(() -> { this.imageMapper.queryBodyImageForList();
}); return info;
}
}
订单服务
@RestControllerpublic class OrderServiceImpl { @Autowired
BodyImageService bodyImageService; @GetMapping("/query") public PageInfo<BodyImage> getBodyImage() { return bodyImageService.query("bbbb");
}
}
结论
① 你会发现项目Run一切正常,但是请求只会进入 UserServiceFallback.java 中去,并输出Log(如果不指定GET那么你会发现请求报错,说Method Get Not…)
② 第二种是可行的 但是试想一下我对外写的查询数据接口还要POST有点说不过去吧?
③ 第三种就是解决方案,以Restful风格的方式,这里的猜想是Feign集成的是Ribbon和Hystrix那么Ribbon里面的是RestTemplate,还有一个可能就是Feign接口在预处理的时候不知道你的GET方式有那些参数需要传递,他并不像简单的MVC框架可以自动装配和映射(个人猜想,打脸轻点),同理PUT/DELETE/PATH只要按照restful规范就可以使用而不一定要post
最好的赞赏就是你的关注