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