书籍地址: Spring Cloud 微服务架构开发实战
4.7.1 Feign的参数绑定
Feign支持多种注解,我们可以根据需要使用Feign自带的注解或者JAX-RS注解。此外,Spring Cloud 还对 Feign进行了增强,使得Feign支持了SpringMVC注解。
Feign中我们常用的 SpringMVC 注解有:
- @RequestParam: 绑定单个请求参数值;
- @PathVariable: 绑定URI模板变量值;
- @RequestHeader: 绑定请求头数据。
- @RequestBody: 绑定请求的内容区数据并能进行自动类型转换等。
需要注意的是:
我们在Feign中使用上述注解的时候,value值必须存在。即:
@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
UserDto load(@PathVariable("id") Integer id);
而不能像在controller中那样写:
@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
UserDto load(@PathVariable Integer id){}
这是因为在SpringMVC中这些注解会以参数名称最为默认值,但是 Feign 则不会
在我们进行开发的时候,参数往往是以对象的形式进行传递, 比如注册用户的服务接口如下
User register(User user);
所以微服务中,如何把复杂的用户信息传递过去呢? 答案如下:
@RequestMapping(value="/users/register", method = RequestMethod.POST)
User register(@RequestBody User user);
需要注意的是 User对象必须要有默认构造函数,否则Feign会无法根据传递过来的JSON字符串转换为User对象,从而抛出异常,造成调用不成功.
4.7.2 Feign中的继承
Feign支持继承, 即在我们的示例中, 用户微服务的userService 和 商品微服务的 userService 代码基本一致,类似这种,我们可以单独起一个项目,来封装一个父类, 项目中依赖该jar包,调用或实现该包中UserService的接口方法.这是可以的.
但是,看起来是简化了 Feign的开发, 但是在使用微服务架构进行开发时有一个原则,就是保持各微服务的自治性. 上述的继承, 会造成服务提供方与消费方之间的代码紧耦合.
因此不建议在服务提供方和服务消费方之间共享接口.