专栏目录

四、IDEA 搭建 Spring Cloud Alibaba 微服务项目骨架试读

专栏目录

四、IDEA 搭建 Spring Cloud Alibaba 微服务项目骨架试读

添加 framework 平台基础设施模块

作者头像 犬小哈
2,232字
8分钟
11张图
6,305

友情提示 : 推荐使用谷歌浏览器来阅读本专栏,其他浏览器可能存在兼容性问题。

本小节中,我们继续完善后端项目骨架 —— 抽取一个 framework 平台基础设施模块。如下图所示:

为什么要抽取一个 framework 基础设施模块?

  1. 代码复用和减少重复开发:将通用的功能、组件抽取到一个独立的 framework 模块中,可以实现代码的复用,减少不同业务线之间的重复开发。这样,各个业务线可以专注于自身的业务逻辑实现,而不需要从头开始构建基础功能。
  2. 统一管理和维护:大一点的公司中,公司内部通常会成立一个基础平台小组,小组中均是经验丰富的高级工程师,由它们来开发并维护相关基础组件,编写使用文档。开发完成后,会将这些组件提交到公司内部的 Maven 私服,可以实现对该模块的统一管理和维护。一旦 framework 模块有更新或修复,所有业务线都可以通过更新依赖来获取最新的功能和修复,而不需要每个业务线都单独进行更新。
  3. 版本控制和依赖管理Maven 私服可以提供版本控制和依赖管理的功能。通过在 Maven 私服中维护 framework 模块的版本信息,可以确保各个业务线使用到的是正确和兼容的版本,避免版本冲突和依赖问题。
  4. 提高开发效率和质量:通过提供一个稳定、可靠的 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 依赖。

编辑完毕后,将不需要的类删除掉,如 AppAppTest :

添加 Response 工具类

com.quanxiaoha.framework.common 包下,添加一个封装好的 Response 响参工具类,以及相关异常类:

TIP : 关于自定义响参工具类,可翻阅星球第一个项目 专栏的相关小节,这里不做重复讲解,直接复制,拿过来用了:

定义基础异常接口:

package com.quanxiaoha.framework.common.exception;

public interface BaseExceptionInterface {

	// 获取异常码
    String getErrorCode();

	// 获取异常信息
    String getErrorMessage();
}

定义业务异常类:

TIP : BizBusiness 英文的缩写,代表业务的意思。

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 工具类,对前端成功返回了响应参数。

本小节源码下载

https://t.zsxq.com/2DtdH

添加小哈私人微信

已加入星球的小伙伴,记得添加小哈私人微信,拉你进 VIP 讨论群

一定要备注 “星球” 哟,不然通过率极低

分享有赏

打开星球 APP,操作图如下

觉得星球还不错的话,可邀请好友加入呀

通过星球 APP 专属的分享链接加入,分享者将获得票价的 40% 分成,同时可获得大量积分,每月积分靠前者,可获取小哈赠书哟,一波赢回票价~

微信扫一扫,加入星球

领券加入,超便宜~

专属的项目实战 / 1v1 提问 / Java学习路线

社群讨论 / 每月赠书 / 学习打卡

👉星球介绍