An de Arms

Back

Devops Code PrepareBlur image

1、系统拓扑#

image-20250208001433721

该实验由简单的5个微服务组成,麻雀虽小,五脏俱全,包含完整的RBAC授权模型和完整的认证登录授权。

核心微服务分为3类:

  • 非业务类:网关(gateway-service)、认证中心(iam-service)
  • 业务类-聚合服务:仅对其他原子微服务进行远程调用,组装业务逻辑。聚合中心(mgmt-application)
  • 业务类-原子服务:仅针对某个业务逻辑提供简单的CRUD功能,通过Feign向上提供能力,用户服务(user-service)、课程服务(course-service)

2、项目代码#

系统拓扑中涉及的5个微服务模块均是独立的代码仓库实现,方便多人协作与部署。

项目源码:https://github.com/aires-iris/hiseas

image-20250208002940217

子模块说明:

  • 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

    <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>
    
    xml

    父项目中除了定义子模块需要的依赖版本,还统一制定了私服配置。包括:仓库地址、插件地址、发布部署地址信息

  • hiseas-sa-token

    image-20250208003742096

该服务主要提供Sa-Token运行相关配置,并以SpringBoot自动装配方式注入,其他所有需要认证、鉴权的微服务都需要引入该模块。

  • hiseas-center-course

    image-20250208004144557

    上述2个服务都是作为被依赖项引入到其他服务,而所有包含center的服务都是自身需要启动运行的服务,这些服务主要包括以下内容:

    • api子模块:Feign接口生命与定义(原子服务才有api模块)
    • service模块:业务模块
    • SpringBoot的多环境配置
    • Dockerfile:Dockerfile定义
    • .gitlab-ci.yml:GitLab流水线定义文件
    • hiseas-center-course-dev.yml:该服务在Kubernetes集群中的Deployment配置文件

    这里简单说明一下Dockerfile文件,每个服务的内容都是类似的,举一反三。

    #非 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}
    shell

    由于第一阶段实验中,像Redis、Seata、Mysql等基础设施暂时不是在原生集群中提供,而是在一台单独的服务器中部署,这里将这些服务所属服务器ip和SpringBoot的active profile作为2个配置项,以参数的形式在Docker镜像打包的时候提供,方便实验阶段部署,如果是在正式项目中有了固定的服务ip也可以直接写死

    # Docker镜像打包时使用的环境变量
    ARG PROFILE
    ARG SERVER_URL
    shell

    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网页端查看各服务的情况。

    image-20250208005919565

3.1 尝试接口访问#

  • 登录

    ## 登录
    POST localhost:8431/auth/api/auth/login
    Content-Type: application/json
    
    {
      "username": "zed",
      "password": "5566"
    }
    shell

    登录成功后,查看iam认证中心日志可以得到token

    image-20250208010642855

  • 聚合服务接口测试

    使用登录获取的token调用接口

    ### 通过聚合服务(mgmt-application)查询课程信息
    GET localhost:8431/mgmt-application/api/courses/3
    Access-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOjEsInJuU3RyIjoiZGlwZW5sMDdpREhoRENzYnNDak5rNHpraXpPMnJwd1QiLCJmdWxsTmFtZSI6Imhpc2VhcyJ9.qm-TKQHtN4cwAdsh85TH0YmS84YeOR50pz8SccztHRU
    
    shell

    image-20250208014615490

  • 分布式事务测试

    ### 通过聚合服务(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
    }
    shell

    该接口:通过mgmt-application服务,分别调用了user服务向user_points表中写入评分用户以及分数,在course服务中记录本次评分的数据记录

    image-20250208015943557

在该方法中加上断点,程序执行到断电时可以检查Seata控制台可以看到相关的分布式事务状态

从程序日志也可以直观看到各个RM和TM的状态

image-20250208020607772

Devops Code Prepare
https://www.zhengxiang.fan/blog/02-devops-code-prepare/devops-code-prepare
Author Arms
Published at October 2, 2024
Comment seems to stuck. Try to refresh?✨