

Devops Code Prepare
微服务各项目模块说明
1、系统拓扑#
该实验由简单的5个微服务组成,麻雀虽小,五脏俱全,包含完整的RBAC授权模型和完整的认证登录授权。
核心微服务分为3类:
- 非业务类:网关(gateway-service)、认证中心(iam-service)
- 业务类-聚合服务:仅对其他原子微服务进行远程调用,组装业务逻辑。聚合中心(mgmt-application)
- 业务类-原子服务:仅针对某个业务逻辑提供简单的CRUD功能,通过Feign向上提供能力,用户服务(user-service)、课程服务(course-service)
2、项目代码#
系统拓扑中涉及的5个微服务模块均是独立的代码仓库实现,方便多人协作与部署。
项目源码:https://github.com/aires-iris/hiseas ↗
子模块说明:
- hiseas-cloud:maven父项目,无代码,统一管理版本依赖,私服地址,仓库地址等。
- hiseas-common:通用模块,定义所有项目谁用的公共内容。包括:枚举、常量、工具类等。
- hiseas-sa-token:Sa-Token ↗相关配置类,以SpringBoot自动装配方式加载。
- hiseas-center-gateway:网关
- hiseas-center-iam:基于Sa-Token ↗实现的认证、鉴权中心。
- Hiseas-mgmt-application: 非业务聚合服务,主要负责调用其他原子微服务Feign接口,进行业务组装。
- Hiseas-center-user: 用户原子微服务,针对用户模块的CRUD。
- Hiseas-center-course: 课程原子微服务,针对课程模块的CRUD。
其中每个原子服务内部存在一个api子模块,主要定义Feign接口和DTO,用以提供给上层服务调用
3、部分模块说明#
-
hisea-cloud
xml<repositories> <!-- 发布版本库 --> <repository> <id>nexus-releases</id> <url>http://nexus.hiseas.com:8081/repository/maven-releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> <!-- 快照版本库 --> <repository> <id>nexus-snapshots</id> <url>http://nexus.hiseas.com:8081/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <!-- 插件发布版本库 --> <pluginRepository> <id>nexus-releases</id> <url>http://nexus.hiseas.com:8081/repository/maven-releases/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> <!-- 插件快照版本库 --> <pluginRepository> <id>nexus-snapshots</id> <url>http://nexus.hiseas.com:8081/repository/maven-snapshots/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> <distributionManagement> <!-- 发布版本部署位置 --> <repository> <id>nexus-releases</id> <url>http://nexus.hiseas.com:8081/repository/maven-releases/</url> </repository> <!-- 快照版本部署位置 --> <snapshotRepository> <id>nexus-snapshots</id> <url>http://nexus.hiseas.com:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
父项目中除了定义子模块需要的依赖版本,还统一制定了私服配置。包括:仓库地址、插件地址、发布部署地址信息
-
hiseas-sa-token
该服务主要提供Sa-Token运行相关配置,并以SpringBoot自动装配方式注入,其他所有需要认证、鉴权的微服务都需要引入该模块。
-
hiseas-center-course
上述2个服务都是作为被依赖项引入到其他服务,而所有包含center的服务都是自身需要启动运行的服务,这些服务主要包括以下内容:
api子模块
:Feign接口生命与定义(原子服务才有api模块)service模块
:业务模块- SpringBoot的多环境配置
Dockerfile
:Dockerfile定义.gitlab-ci.yml
:GitLab流水线定义文件hiseas-center-course-dev.yml
:该服务在Kubernetes集群中的Deployment配置文件
这里简单说明一下Dockerfile文件,每个服务的内容都是类似的,举一反三。
shell#非 root 用户:创建并使用非 root 用户提升安全性。 FROM eclipse-temurin:21-jre-alpine # 设置工作目录 WORKDIR /app # 复制打包好的应用到镜像 COPY hiseas-center-course-service/target/hiseas-center-course-service-*-SNAPSHOT.jar app.jar # 创建非 root 用户 RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser # Docker镜像打包时使用的环境变量 ARG PROFILE ARG SERVER_URL # 设置时区和 Java 启动参数以及环境 ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m" ENV PROFILE=${PROFILE} ENV SERVER_URL=${SERVER_URL} # 暴露应用运行端口 EXPOSE 9000 # 启动应用 CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -DSERVER_URL=${SERVER_URL} -jar app.jar --spring.profiles.active=${PROFILE}
由于第一阶段实验中,像Redis、Seata、Mysql等基础设施暂时不是在原生集群中提供,而是在一台单独的服务器中部署,这里将这些服务所属服务器ip和SpringBoot的active profile作为2个配置项,以参数的形式在Docker镜像打包的时候提供,方便实验阶段部署,如果是在正式项目中有了固定的服务ip也可以直接写死
shell# Docker镜像打包时使用的环境变量 ARG PROFILE ARG SERVER_URL
3、项目本地运行#
各个服务端口说明:
- user-service:8000
- course-service: 9000
- center-gateway: 8431
- center-iam:15000
- mgmt-application:10000
添加启动参数
-DSERVER_URL=10.211.55.10
运行所有服务,注意:iam由于在启动时需要缓存所有的角色-权限列表,所以存在依赖项:iam-service依赖user-service,启动完成后可以在Nacos网页端查看各服务的情况。
3.1 尝试接口访问#
-
登录
shell## 登录 POST localhost:8431/auth/api/auth/login Content-Type: application/json { "username": "zed", "password": "5566" }
登录成功后,查看iam认证中心日志可以得到token
-
聚合服务接口测试
使用登录获取的token调用接口
shell### 通过聚合服务(mgmt-application)查询课程信息 GET localhost:8431/mgmt-application/api/courses/3 Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjEsInJuU3RyIjoiZGlwZW5sMDdpREhoRENzYnNDak5rNHpraXpPMnJwd1QiLCJmdWxsTmFtZSI6Imhpc2VhcyJ9.qm-TKQHtN4cwAdsh85TH0YmS84YeOR50pz8SccztHRU
-
分布式事务测试
shell### 通过聚合服务(mgmt-application)添加课程评论(跨服务调用) POST localhost:8431/mgmt-application/api/courseReview Content-Type: application/json Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjEsInJuU3RyIjoiZGlwZW5sMDdpREhoRENzYnNDak5rNHpraXpPMnJwd1QiLCJmdWxsTmFtZSI6Imhpc2VhcyJ9.qm-TKQHtN4cwAdsh85TH0YmS84YeOR50pz8SccztHRU { "courseId": 3, "userId": 1, "rating": 5 }
该接口:通过mgmt-application服务,分别调用了user服务向user_points表中写入评分用户以及分数,在course服务中记录本次评分的数据记录
在该方法中加上断点,程序执行到断电时可以检查Seata控制台可以看到相关的分布式事务状态
从程序日志也可以直观看到各个RM和TM的状态