Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
Feign调用接口时,都是需要进行参数传递的,一般可以分为两类
- 字符串参数传递,比如xml、json、string等
- 对象参数传递
字符串参数传递(@RequestParam)
@RequestParam注解用来接收字符串类型参数,有以下注意点
- 客户端@RequestParam注解的value属性必须指定值,不能为空,且要和服务端接口参数名保持一致
- 如果需要传递多个字符串参数,则使用多个@RequestParam注解与服务端接口参数保持一一对应即可
服务端
@ResponseBody
@PostMapping(value = "check")
public CheckAckVo check(String jsonParam) {
FileCheckVo fileCheckVo = JacksonUtil.jsonToBean(jsonParam, FileCheckVo.class);
return checkAck(taskId, OpStatusEnum.SUCCESS.getCode());
}
客户端
@FeignClient(value = "act-engine-web", fallbackFactory = PlatformUserFeignServiceFallBack.class)
public interface PlatformUserFeignService {
@RequestMapping(value = "/engine/check", method = RequestMethod.POST)
String check(@RequestParam(value = "jsonParam") String jsonParam);
}
对象参数传递(@RequestBody )
@RequestBody注解用来接收字符串类型参数,有以下注意点
- @RequestBody 注解在服务端和客户端都需要使用
- 参数名和参数类型在服务端和客户端需要保持一致
服务端
@ResponseBody
@PostMapping(value = "check")
public CheckAckVo check(@RequestBody FileCheckVo fileCheckVo) {
return checkAck(taskId, OpStatusEnum.SUCCESS.getCode());
}
客户端
@FeignClient(value = "act-engine-web", fallbackFactory = PlatformUserFeignServiceFallBack.class)
public interface PlatformUserFeignService {
@RequestMapping(value = "/engine/check", method = RequestMethod.POST)
String check(@RequestBody FileCheckVo fileCheckVo);
}