一点项目设计问题的感悟


因为一直比较忙,所以在项目创建以后一直在些业务部分,没有关注过项目架构本身的问题,今天抽时间记录一下,博主的项目采用的是基于springcloud的前后端分离的微服务项目,因为也是第一次搞这样的项目,经验不足,在前后端交互问题上没有涉及的很好,导致项目成员在编写代码时总会遇到下面的这些问题,接下来一一介绍.

我的公众号

一点项目设计问题的感悟_第1张图片

前后端项目的好处不用多说,前端与后端约定好接口参数,这样前后端只需要完成业务以后测试就可以了,前端不需要等待后端的接口完成,前后端可以同步工作,大大提高了开发效率,但是在后端接口定义的时候,一般会有一些基类,这些基类如果设计的比较好的话,可以大大的节省开发时间,减少bug的产生,我们项目的接口定义主要由两部分组成,一部分是响应码,响应内容,一部分是返回的数据,下面是一些基类

因为接口定义状态码与状态文本全都返回,而枚举值只能返回name属性的值,原始基类是这样定义的:

  • BaseResponse 类
    public class BaseResponse<T,D> extends BaseResult<T,D> {}
  • BaseResult
    public class BaseResult<T, D>{

    /**
     * 响应状态以及状态文本
     */
    private T resStatus;
    /**
     * 响应数据
     */
    private D data;

    public T getResStatus() {
        return resStatus;
    }

    public void setResStatus(T resStatus) {
        this.resStatus = resStatus;
    }

    public D getData() {
        return data;
    }

    public void setData(D data) {
        this.data = data;
    }
}

我们的泛型T中放的是枚举类型Enum,但是在微服务feign调用的时候一直是解析失败,不能按照要求返回,所以对基类进行了改造

  • BaseResponse 不需要改
    public class BaseResponse<T,D> extends BaseResult<T,D> {

}

  • BaseResult基类进行改造
   public class BaseResult<T, D>{

    /**
     * 响应状态以及状态文本
     */
   private EnumResult resStatus = new EnumResult();

    /**
     * 响应数据
     */
    private D data;

    public EnumResult getResStatus() {
        return resStatus;
    }

    public void setResStatus(T t) {
        IResStatus iResStatus = (IResStatus)t;
        resStatus.setStatusText(iResStatus.getStatusText());
        resStatus.setStatus(iResStatus.getStatus());
    }

    public D getData() {
        return data;
    }

    public void setData(D data) {
        this.data = data;
    }

}

  • 新增 IResStatus,并添加Enum需要返回的类的属性方法

public interface IResStatus {

    String getStatus();

    String getStatusText();

}

  • 新增EnumResult,并实现IResStatus

public class EnumResult implements IResStatus {
    /**
     * 响应状态
     */
    private String status;
    /**
     * 状态文本
     */
    private String statusText;

    @Override
    public String getStatus() {
        return status;
    }
    
    public void setStatus(String status) {
        this.status =status;
    }

    @Override
    public String getStatusText() {
        return statusText;
    }

    public void setStatusText(String statusText) {
        this.statusText = statusText;
    }
}

  • 这样设计的好处就是比原来更加灵活,而且可以返回自己想要的数据,再来看一段,前端微服务用feign调用基础服务时没改之前的demo段,服务之间调用增加了很多逻辑上的判断,很容易引入bug
   UserResponse userResponse = userDemoFacede.getUser(param);
        String resStatusJson = JsonUtils.obj2json(userResponse.getResStatus());
        Map<String, String> resStatusMap = JsonUtils.json2pojo(resStatusJson, HashMap.class);
        EnumResultCode enumGeneralResultCode = EnumResultCode.getUsersResultCodeByCode(resStatusMap.get("statusText"));
        if (enumGeneralResultCode.equals(EnumGeneralResultCode.OK)) {
            String url = (String) userResponse.getData();
        }

  • 再看改造后的方法,代码简化了很多,EnumResult巧妙的通过接口找到实现类,并返回实现类里的真实数据,是不是感觉顿时清爽了很多,既极少了代码量,降低bug率,而且提升了开发效率,项目速度也得到了提升,一举多得
   UserResponse<EnumResult,String> userResponse = userDemoFacede.getUser(param);
   EnumResult resStatus = userResponse.getResStatus();
        if (resStatus.getStatus().equals(EnumResultCode.OK.getStatus())) {
            String url = (String) userResponse.getData();
        }

  • 如果有朋友还在疑惑springcloud中使用feign出现LinkedHashMap can not be cast to xxx ,看我上一篇文章,有提供解决方案,好了结束,下次再会

你可能感兴趣的:(java,springcloud微服务)