今天开始研读nacos 代码,学习一下。
读到 com.alibaba.nacos.client.config.http.HttpAgent 时发现一个特点,该接口有两个实现类。
MetricsHttpAgent:
度量类,实现了父类的方法,重新调用当前方法。在掉用当前方法前做一些异常处理及参数获取
@Override
public HttpResult httpGet(String path, List<String> headers, List<String> paramValues, String encoding, long readTimeoutMs) throws IOException {
Histogram.Timer timer = MetricsMonitor.getConfigRequestMonitor("GET", path, "NA");
HttpResult result = null;
try {
result = httpAgent.httpGet(path, headers, paramValues, encoding, readTimeoutMs);
} catch (IOException e) {
throw e;
} finally {
timer.observeDuration();
timer.close();
}
return result;
}
ServerHttpAgent:
实际的业务逻辑的实现类,类中同样出现异常时同样会进行捕获,但对于出现业务逻辑不符合预期时会直接抛出异常
我的的感受:
最近在写公司代码的时候有点难受,针对于微服务的方法调用的时候,会对返回的实体进行封装,组成规范的返回对象实体。
但是服务调用本身从封装实体再去获取实际想要的实体,中间多了一层逻辑,我个人觉得很变扭。
跟同事沟通后,赞同当前做法,对查询出的实体进行封装成对边的标准实体 即 有返回code,result,success 一些列值的实体
针对于服务调用,对方更喜欢你返回结果带有编码,我只需要根据你返回的编码进行判断即可。
同样在 服务调用的API实现类中 我们需要进行异常捕获 保证返回给业务方式一个实体对象,不是一对乱七八糟的异常编码。
这里就涉及到了业务异常的抛出,我相信很多人都跟我一样喜欢直接抛出业务异常,而不是封装一个对象。然后在最外层直接进行异常的捕获,代码简洁明了,很舒适。
针对于当前nacos的编码规范:
总结,服务的调用的实现方法必须异常捕获,保证使用者的用户体验,针对不同的业务异常进行捕获返回对象。