外观模式Facade-实战dubbo rpc接口
Posted 长城守卫队长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外观模式Facade-实战dubbo rpc接口相关的知识,希望对你有一定的参考价值。
1.什么是外观设计模式:
外观模式(Facade):其中Facade是外观角色,也叫门面角色,客户端可以调用这个接口的方法(客户端并不需要知道这个接口怎么实现的),此接口知晓子系统的所有功能和责任,将客户端的请求代理给适当的子系统对象;Subsystem是子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在。
2.什么时候使用外观设计模式:
根据我10 多年的互联网开发经验:外观设计模式主要使用在dubbo 的rpc接口,或者springCloud的Feign接口,比如我们调用 dubbo rpc接口,或者是springCloud的feign接口,我们只需要知道这个接口返回的信息,并不关心接口里面的实现,实现类里面调用了那个service和是否调用其他的系统或者是第三方接口。
3.以dubbo为例带你实战外观设计模式:
以上传文件为案例:
首先我们定义一个dubbo的api接口,此接口在api包,供其他工程使用:
public interface IUploadFileFacade {
/**
* 上传附件
*
* @param fileName
* 文件的真实名字
* @param ossFileName
* oss的文件名称
* @param filePath
* oss的文件地址
* @param source
* 文件来源
* @return
*/
CommonResult<UploadFileDto> upload(String fileName, String ossFileName, String filePath, EnumUploadFileSource source);
}
接下来我们来编写dubbo-api接口的实现,就是业务逻辑层,我们发现facade的实现层是 调用了其他的service:
看一下包目录结构:
@Service//dubbo 的@Service注解
public class UploadFileFacade implements IUploadFileFacade {
private static final Logger LOGGER = LoggerFactory.getLogger(UploadFileFacade.class);
@Resource
private IUploadFileService uploadFileService;
@Override
public CommonResult<UploadFileDto> upload(String fileName, String ossFileName, String filePath,
EnumUploadFileSource source) {
CommonResult<UploadFileDto> result;
try {
UploadFileEntity entity = new UploadFileEntity(source.getCode(), fileName, ossFileName, filePath);
uploadFileService.insert(entity);
result = new CommonResult<>(build(entity));
} catch (Exception e) {
LOGGER.error("upload-->params: fileName={}, filePath={}, source={}", fileName, filePath, source, e);
result = new CommonResult<>(SysExceptionMessage.SYS_ERROR);
if (e instanceof CommonException) {
result = new CommonResult<>(CommonMessage.getEnum(((CommonException) e).getStatus()));
}
}
return result;
}
}
此时我们发现,调用这个在使用 api接口的时候,只需要注入:IUploadFileFacade ,并不关心,UploadFileFacade 的具体实现,调用了那些service接口:
@Resource
private IUploadFileFacade uploadFileFacade;
public CommonResult<UploadFileDto> uploadFile(MultipartFile file,
Integer source, String key) throws Exception {
// 1.上传oss,返回filePath
String fileName = XXX;
String prefix = XXX;
String ossFileName = XXX;
EnumUploadFileSource enumUploadFileSource = EnumUploadFileSource.getEnumByCode(source);
String url = ossService.fileUpload(enumUploadFileSource.getOssPath() + ossFileName, file.getInputStream());
// 2.调用uploadFileFacade,存储数据
CommonResult<UploadFileDto> apiResult = uploadFileFacade.upload(fileName, ossFileName, url.replaceAll(INTERNAL, ""), enumUploadFileSource);
UploadFileDto dto = ResultCheckUtil.check(apiResult);
return new CommonResult<>(dto);
}
以上是关于外观模式Facade-实战dubbo rpc接口的主要内容,如果未能解决你的问题,请参考以下文章