用户微服务编码

下面改造用户微服务中的业务代码,把原单体项目 newbee-mall-api 中的功能模块一点一点地整合到这个工程里,开发出一个微服务架构项目。

引入业务依赖

原来的单体 API 项目中有 MyBatisSwagger 等依赖项,在改造时需要一一引入微服务架构项目,在 pom.xml 主文件中增加依赖配置,代码如下:

<mybatis.starter.version>2.1.3</mybatis.starter.version>
<swagger.version>3.0.0</swagger.version>
<lombok.version>1.18.8</lombok.version>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis.starter.version}</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>${swagger.version}</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    <scope>provided</scope>
</dependency>

打开用户微服务 newbee-mall-cloud-user-service 的工程目录,在 pom.xml 子文件中增加依赖项,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-starter</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

项目所需的 Maven 依赖配置完成。

商城用户模块中的接口改造

打开用户微服务 newbee-mall-cloud-user-service 的工程目录,在 ltd.user.cloud.newbee 包下依次创建 config 包、dao 包、entity 包、service 包和 util 包,在 resources 目录下新增 mapper 文件夹用于存放 Mapper 文件,将原单体 API 项目中与管理员用户相关的业务代码和 Mapper 文件依次复制进来,完成后还需要在主类上添加 MyBatis 的扫描注解,让这些 Mapper 文件能够被正确地扫描和加载。

由于代码量较大,这里就不一一介绍和讲解了,读者按照对应的文件目录将代码从单体项目复制过来即可。

修改 newbee-mall-cloud-user-service 工程的 application.properties 配置文件,添加数据库连接及 MyBatis 扫描配置,代码如下:

# datasource config (MySQL)
spring.datasource.name=newbee-mall-cloud-user-datasource
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/newbee_mall_cloud_user?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.pool-name=hikariCP
spring.datasource.hikari.max-lifetime=600000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

# mybatis config
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

上述工作完成后,目录结构如图 2-4 所示。

本步骤中的源代码,涉及的数据库为 newbee_mall_cloud_user_db,数据库表为 tb_newbee_mall_admin_usertb_newbee_mall_admin_user_token,在开发过程中均会用到。

image 2025 04 23 11 29 24 992
Figure 1. 图2-4 目录结构

建表语句如下:

CREATE DATABASE /*!32312 IF NOT EXISTS*/'newbee_mall_cloud_user_db'/*!40100 DEFAULT CHARACTER SET utf8 */;

USE 'newbee_mall_cloud_user_db';

DROP TABLE IF EXISTS 'tb_newbee_mall_admin_user';

# 创建管理员用户表
CREATE TABLE tb_newbee_mall_admin_user (
  `admin_user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '管理员用户id',
  `login_user_name` varchar(50) NOT NULL COMMENT '管理员用户登录名称',
  `login_password` varchar(50) NOT NULL COMMENT '管理员用户登录密码',
  `nick_name` varchar(50) NOT NULL COMMENT '管理员用户昵称',
  `locked` tinyint(4) DEFAULT '0' COMMENT '是否锁定:0 未锁定,1 已经锁定无法登录',
  PRIMARY KEY (`admin_user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

INSERT INTO `tb_newbee_mall_admin_user` (`admin_user_id`, `login_user_name`, `login_password`, `nick_name`, `locked`)
VALUES
  (1,'admin','e10adc3949ba59abbe56e057f20f883e','十三',0),
  (2,'newbee-admin1','e10adc3949ba59abbe56e057f20f883e','新蜂 01',0),
  (3,'newbee-admin2','e10adc3949ba59abbe56e057f20f883e','新蜂 02',0);

DROP TABLE IF EXISTS `tb_newbee_mall_admin_user_token`;

CREATE TABLE `tb_newbee_mall_admin_user_token` (
  `admin_user_id` bigint(20) NOT NULL COMMENT '用户主键id',
  `token` varchar(32) NOT NULL COMMENT 'token值(32位字符串)',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `expire_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'token过期时间',
  PRIMARY KEY (`admin_user_id`),
  UNIQUE KEY `uq_token` (`token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

用户微服务改造过程中遇到的问题

笔者在用户微服务改造过程中遇到了一个小问题,在这里分享给各位读者。如果读者在实战时遇到这个问题,可以直接参考解决办法。

在把管理员模块的代码按照对应的目录复制到 newbee-mall-cloud-user-service 工程后,无法正常启动项目,而是报告异常,报错日志如下:

org.springframework.context.ApplicationContextException: Failed to start
bean 'documentationPluginsBootstrapper'; nested exception is
java.lang.NullPointerException

这个问题是 Spring Boot 版本与 Swagger 版本不兼容导致的。因为当前工程中使用的是 SpringBoot 2.6.3,开发时引入的是 Swagger 2.8.0,所以报告异常。将 Swagger 2.8.0 改成 Swagger3.0.0 之后就一切正常了。

当然,Swagger 3.0.0Swagger 2.8.0 在整合时的区别还是挺大的,依赖项和配置类的写法、默认接口的访问地址都有变化,这里需要注意,在实现编码时直接参考或使用笔者提供的源代码即可。

编码完成后,准备好数据库和表就可以进行功能测试了。当然,在项目启动前需要启动 NacosServer,之后依次启动这两个项目。启动成功后,打开浏览器并在地址栏中输入如下网址: http://localhost:29000/swagger-ui/index.html

响应结果如图 2-5 所示。这样,读者就可以在 Swagger 提供的 UI 页面进行接口测试了。

image 2025 04 23 11 33 04 055
Figure 2. 图2-5 用户微服务接口文档的响应结果