查看原文
其他

SpringCloud使用Feign经验总结(Dalston.SR1)

2017-07-25 Levin SpringForAll社区

主要讲述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


最好的赞赏就是你的关注

 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存