用户微服务编码
下面改造用户微服务中的业务代码,把原单体项目 newbee-mall-api
中的功能模块一点一点地整合到这个工程里,开发出一个微服务架构项目。
引入业务依赖
原来的单体 API
项目中有 MyBatis
、Swagger
等依赖项,在改造时需要一一引入微服务架构项目,在 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_user
和 tb_newbee_mall_admin_user_token
,在开发过程中均会用到。

建表语句如下:
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.0
与 Swagger 2.8.0
在整合时的区别还是挺大的,依赖项和配置类的写法、默认接口的访问地址都有变化,这里需要注意,在实现编码时直接参考或使用笔者提供的源代码即可。
编码完成后,准备好数据库和表就可以进行功能测试了。当然,在项目启动前需要启动 NacosServer
,之后依次启动这两个项目。启动成功后,打开浏览器并在地址栏中输入如下网址: http://localhost:29000/swagger-ui/index.html 。
响应结果如图 2-5 所示。这样,读者就可以在 Swagger
提供的 UI
页面进行接口测试了。
