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<>();
}
}

}

 
@RestController
public 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;
}

}

 
- 订单服务
 
@RestController
public 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
 
 
原文地址:http://blog.battcn.com/2017/07 ... ysis/
 
 
 
 
 
 

0 个评论

要回复文章请先登录注册