添加 framework 平台基础设施模块
友情提示 : 推荐使用谷歌浏览器来阅读本专栏,其他浏览器可能存在兼容性问题。
本小节中,我们继续完善后端项目骨架 —— 抽取一个 framework
平台基础设施模块。如下图所示:
为什么要抽取一个 framework 基础设施模块?
- 代码复用和减少重复开发:将通用的功能、组件抽取到一个独立的
framework
模块中,可以实现代码的复用,减少不同业务线之间的重复开发。这样,各个业务线可以专注于自身的业务逻辑实现,而不需要从头开始构建基础功能。 - 统一管理和维护:大一点的公司中,公司内部通常会成立一个基础平台小组,小组中均是经验丰富的高级工程师,由它们来开发并维护相关基础组件,编写使用文档。开发完成后,会将这些组件提交到公司内部的
Maven
私服,可以实现对该模块的统一管理和维护。一旦framework
模块有更新或修复,所有业务线都可以通过更新依赖来获取最新的功能和修复,而不需要每个业务线都单独进行更新。 - 版本控制和依赖管理:
Maven
私服可以提供版本控制和依赖管理的功能。通过在Maven
私服中维护framework
模块的版本信息,可以确保各个业务线使用到的是正确和兼容的版本,避免版本冲突和依赖问题。 - 提高开发效率和质量:通过提供一个稳定、可靠的
framework
模块,可以提高开发效率和质量。业务线开发人员可以更加专注于业务逻辑的实现,而不需要过多关注底层技术的实现细节。
新建 framework 模块
在项目上右键 | New | Module... , 新建一个子模块:
填写相关选项,如下图所示:
解释一下标注的部分:
- ①:选择
Maven Archetype
来创建一个Maven
子模块;- ②:项目名称填写
xiaoha-framework
;- ③:项目使用的
JDK
版本,本项目使用的是JDK 17
;- ④:父模块选择
xiaohashu
;- ⑤:选择
Internal
。- ⑥:选择
maven-archetype-quickstart
。- ⑦:填写 Group 组织名称,通常为公司域名倒写,如
com.quanxiaoha
;- ⑧:项目的唯一标识符;
点击 Create 按钮开始创建 framework
子模块, 成功创建后,查看父模块的 pom.xml
文件,内容如下,可以看到 <modules>
节点中,自动添加上了该模块:
// 省略...
<!-- 子模块管理 -->
<modules>
<!-- 平台基础框架 -->
<module>xiaoha-framework</module>
// 省略...
</modules>
// 省略...
编辑 xiaoha-framework
模块中的 pom.xml
, 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 指定父项目 -->
<parent>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaohashu</artifactId>
<version>${revision}</version>
</parent>
<!-- 多模块项目需要配置打包方式为 pom -->
<packaging>pom</packaging>
<artifactId>xiaoha-framework</artifactId>
<name>${project.artifactId}</name>
<description>平台基础设施层:封装一些常用功能,供各个业务线拿来即用</description>
<modules>
</modules>
</project>
- 指定了父项目是谁;
- 打包方式和父模块一样,都是
pom
形式, 因为后续要在framework
基础设施层中,添加很多个子模(封装各种业务组件)。
项目结构如下图所示:
注意 : 如果自动生成了
/src
目录,需要删除掉。
添加 common 通用子模块
在 xiaoha-framewrok
模块上,继续右键 | New | Module... , 为基础设施层添加第一个子模块 —— xiaoha-common
, 此模块为平台通用模块,主要放置一些通用枚举、工具类等等:
填写相关选项,如下图所示:
解释一下标注的部分:
- ①:选择
Maven Archetype
来创建一个Maven
子模块;- ②:项目名称填写
xiaoha-common
;- ③:项目使用的
JDK
版本,本项目使用的是JDK 17
;- ④:父模块选择
xiaohashu-framework
;- ⑤:选择
Internal
。- ⑥:选择
maven-archetype-quickstart
。- ⑦:组织 ID :
com.quanxiaoha.framework.common
;- ⑧:项目的唯一标识符;
点击 Create 按钮创建子模块。同样的,创建完成以后,查看 xiaoha-framework
模块的 pom.xml
文件,确认一下 <modules>
节点是否有自动添加该通用工具组件:
// 省略...
<modules>
<!-- 通用工具组件 -->
<module>xiaoha-common</module>
</modules>
// 省略...
接着,编辑 xiaoha-common
模块的 pom.xml
, 内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 指定父项目 -->
<parent>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaoha-framework</artifactId>
<version>${revision}</version>
</parent>
<!-- 指定打包方式 -->
<packaging>jar</packaging>
<artifactId>xiaoha-common</artifactId>
<name>${project.artifactId}</name>
<description>平台通用模块,如一些通用枚举、工具类等等</description>
<dependencies>
<!-- 避免编写那些冗余的 Java 样板式代码,如 get、set 方法等 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
- 注意,这里指定了父项目为
xiaoha-framework
, 打包方式为Jar
包,添加一些模块描述性文字;- 然后添加了
Lombok
依赖。
编辑完毕后,将不需要的类删除掉,如 App
、AppTest
:
添加 Response 工具类
在 com.quanxiaoha.framework.common
包下,添加一个封装好的 Response
响参工具类,以及相关异常类:
TIP : 关于自定义响参工具类,可翻阅星球第一个项目 专栏的相关小节,这里不做重复讲解,直接复制,拿过来用了:
定义基础异常接口:
package com.quanxiaoha.framework.common.exception;
public interface BaseExceptionInterface {
// 获取异常码
String getErrorCode();
// 获取异常信息
String getErrorMessage();
}
定义业务异常类:
TIP : Biz 是 Business 英文的缩写,代表业务的意思。
package com.quanxiaoha.framework.common.exception;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BizException extends RuntimeException {
// 异常码
private String errorCode;
// 错误信息
private String errorMessage;
public BizException(BaseExceptionInterface baseExceptionInterface) {
this.errorCode = baseExceptionInterface.getErrorCode();
this.errorMessage = baseExceptionInterface.getErrorMessage();
}
}
封装响参工具类:
package com.quanxiaoha.framework.common.response;
import com.quanxiaoha.framework.common.exception.BaseExceptionInterface;
import com.quanxiaoha.framework.common.exception.BizException;
import lombok.Data;
import java.io.Serializable;
@Data
public class Response<T> implements Serializable {
// 是否成功,默认为 true
private boolean success = true;
// 响应消息
private String message;
// 异常码
private String errorCode;
// 响应数据
private T data;
// =================================== 成功响应 ===================================
public static <T> Response<T> success() {
Response<T> response = new Response<>();
return response;
}
public static <T> Response<T> success(T data) {
Response<T> response = new Response<>();
response.setData(data);
return response;
}
// =================================== 失败响应 ===================================
public static <T> Response<T> fail() {
Response<T> response = new Response<>();
response.setSuccess(false);
return response;
}
public static <T> Response<T> fail(String errorMessage) {
Response<T> response = new Response<>();
response.setSuccess(false);
response.setMessage(errorMessage);
return response;
}
public static <T> Response<T> fail(String errorCode, String errorMessage) {
Response<T> response = new Response<>();
response.setSuccess(false);
response.setErrorCode(errorCode);
response.setMessage(errorMessage);
return response;
}
public static <T> Response<T> fail(BizException bizException) {
Response<T> response = new Response<>();
response.setSuccess(false);
response.setErrorCode(bizException.getErrorCode());
response.setMessage(bizException.getErrorMessage());
return response;
}
public static <T> Response<T> fail(BaseExceptionInterface baseExceptionInterface) {
Response<T> response = new Response<>();
response.setSuccess(false);
response.setErrorCode(baseExceptionInterface.getErrorCode());
response.setMessage(baseExceptionInterface.getErrorMessage());
return response;
}
}
至此,我们已经在 xiaoha-common
通用模块中,成功添加了响参工具类。这个功能是后续各个服务中,都需要用到的。
父模块中管理 common 模块版本号
接下来,我们将在 xiaohashu-auth
认证服务中,引入 xiaoha-common
模块,并测试一下是否能够正常使用 Response
响参工具类。首先,需要在最外层的 pom
文件中,声明一下 xiaoha-common
依赖以及其版本号,如下:
// 省略..
<!-- 统一依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaoha-common</artifactId>
<version>${revision}</version>
</dependency>
// 省略...
</dependencies>
</dependencyManagement>
// 省略..
然后,编辑 xiaohashu-auth
认证服务的 pom.xml
文件,引入该依赖:
<dependencies>
<dependency>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaoha-common</artifactId>
</dependency>
// 省略...
</dependencies>
添加一个测试接口
将认证服务中自动生成的 demos.web
包删除掉,另添加一个 controller
包,并创建一个 TestController
用于测试:
添加一个 /test
接口,并使用 Response
响参工具类进行成功响应,代码如下:
package com.quanxiaoha.xiaohashu.auth.controller;
import com.quanxiaoha.framework.common.response.Response;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: 犬小哈
* @url: www.quanxiaoha.com
* @date: 2024/5/4 12:53
* @description: TODO
**/
@RestController
public class TestController {
@GetMapping("/test")
public Response<String> test() {
return Response.success("Hello, 犬小哈专栏");
}
}
重启认证服务,打开浏览器,访问 localhost:8080/test
接口,可以看到响应参数都是 OK 的:
结语
本小节中,我们继续完善了小哈书的工程骨架,添加了 framework
基础设施模块,接着,在该模块中添加了 xiaoha-common
通用模块,后续如一些业务上通用的枚举、工具类等等,都可以放置此模块中。最后,我们在认证服务的 pom.xml
中,引入了 common
模块,并创建了一个测试接口,通过 Response
工具类,对前端成功返回了响应参数。