feign
为了解决服务间调用的问题,springCloud默认提供了feign
feign使用示例
springBoot启动类添加注解@EnableFeignClients
,HZERO的各个服务注解默认都包含了该注解。例如文件服务注解:@EnableHZeroFile
添加接口声明API参数及路径
// 接口添加注解 @FeignClient ,指定要调用的服务名,指定失败回调
@FeignClient(value = "hzero-file", fallback = FileRemoteServiceFallback.class)
public interface FileRemoteService {
/**
* 上传文件
*
* @param organizationId 租户ID
* @param bucketName 桶名
* @param directory 目录
* @param fileName 文件名
* @param byteFile 文件byte
* @return URL地址
*/
@PostMapping("/v1/{organizationId}/files/byte")
ResponseEntity<String> uploadByteFile(@PathVariable("organizationId") Long organizationId,
@RequestParam("bucketName") String bucketName,
@RequestParam(value = "directory", required = false) String directory,
@RequestParam("fileName") String fileName,
@RequestBody byte[] byteFile);
}
注意:
- 声明接口时需要注意,@PathVariable、@RequestParam声明参数的注解value值是必输的,若参数不加注解,feign默认会使用@RequestBody注解处理。
- 建议统一使用String来接收response,使用objectMapper转换为Java对象。这样在接口返回的数据异常时,可以显式地捕获异常。平台提供了ResponseUtils作为响应处理工具类。
- 若feign调用的接口为get请求,但controller使用对象接收参数。在feign的声明中,不可使用对象传参,要把对象拆开写。平台不推荐使用feign调用这种接口
实现接口的失败回调
// 类实现对应的feign接口
@Component
public class FileRemoteServiceFallback implements FileRemoteService {
@Override
public ResponseEntity<String> uploadByteFile(Long organizationId, String bucketName,
String directory, String fileName, byte[] byteFile) {
// feign调用的失败补偿执行方法,可以在这里进行事务的一致性控制
throw new CommonException("File service is not available, please check");
}
}