概述

以微服务项目的方式,对软件体系进行一个简单的探究,简略说明,为什么这样做,软件中这样做的原因是什么,结合一定的案例给出。

父工程

对于父工程模块中重要的是其中的pom文件,在微服务体系下,不能够过多,比如在子模块中会自己引入的,就不要在父工程的pom文件中引入,避免父工程承担过多的责任,更多的引入权应该交给子模块,让子模块更能自治。

父工程pom文件

在pom文件中便是简单的引入一些必须的依赖,过多、繁杂的依赖并没有引入。项目是基于springboot的,而springboot一些基础jar包是在一个叫parent标签的依赖中配置的。所以,springboot的parent是必须的。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
</parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

子工程pom文件

在子工程中会引入common模块,及工程所需要的依赖。一般来说,必须的依赖有,mysql连接驱动jar包,dao层所用框架的jar包,及common包,这里使用的是mysql、mybatis-plus,所以,引入了mysql驱动包,mybatis-plus相关jar包。要是不知道mybatis-plus的需要什么jar包,可以到mybats-plus官网上自行查找。

建议的话使用官网上的jar依赖,有时候可能会导致,org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 问题

对于子工程模块的构建,一般生成完Module后,一般要做的事是引入pom文件、配置application.yml、使用easycode等自动生成代码、在启动类中@MapperScan(“com.tensquare.recruit.dao”)配置接口扫描。

<dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--简化代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <artifactId>tensquare_common</artifactId>
            <groupId>com.itctest</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

common模块

对于common模块,也是公共模块,和父工程有着较多的相似性,其较大的作用在于为其他模块提供 共用 类,但不牵扯到其他模块的具体业务逻辑。如果在一开始模块划分的时候并未划分出common模块,那么可以将全部模块中共用的类抽取出来,放入到common模块中,然后在各个模块引入common模块jar包。完成对项目工程的改造。

在前后端分离的微服务中,公共模块,大多承担的角色是,根据前端所需返回的数据类型,定义出一个或几个共同的类,满足前端类型所需,那么在controller层对数据进行返回的时候,根据所需返回相应类型即可。

通常来说,前端需要返回的类型有状态码code–用于标识状态成功、失败等状态,提示信息message–用于说明状态码怎样,比如添加成功、查询成功等,以及返回数据data,需要返回的数据。

那么要怎么选择数据的具体类型呐?一般来说,code可以选用数据Integer,message选String,而data因为要保存各种对象的数据,为此可以考虑泛型或者所有类的父类Object,使用泛型的时候记得在类上加声明。

在创建类的时候可对code、message提供一个构造函数,对code、message、data提供一个构造函数,方便返回调用。

目录结构

在这里插入图片描述

说明:
pageResult:用于返回分页对象
Result:通用分页对象
StatusCode:定义状态码,可对项目代码进行解耦

后端代码

public class Result {

    private boolean flag;
    private Integer code;
    private String message;
    private Object data;

    public Result() {
    }

    //增删改
    public Result(boolean flag, Integer code, String message) {
        this.flag = flag;
        this.code = code;
        this.message = message;
    }

    //
    public Result(boolean flag, Integer code, String message, Object data) {
        this.flag = flag;
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public void setMessage(String message) {
        this.message = message;
    }

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

    public boolean isFlag() {
        return flag;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public Object getData() {
        return data;
    }
}

前端的可能代码

没有data的Result对象

{
  "code": 0,
  "flag": true,
  "message": "string"
}

有data的Result对象

{
  "code": 0,
  "flag": true,
  "message": "string",
  "data": [
    {
      "id": "string",
      "labelname": "string",
      "state": "string",
      "count": 0,
      "recommend": "string"
    }
  ]
}

有分页的Result对象,通常可以PageResult可以配合Result对象使用

{
  "code": 0,
  "flag": true,
  "message": "string",
  "data": {
    "total": 0,
    "rows": [
      {
        "id": "string",
        "labelname": "string",
        "state": "string",
        "count": 0,
        "recommend": "string"
      }
    ]
  }
}

ps:以上代码均非原创,仅供学习使用,如有侵权请联系删除

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐