基于华为云的可复用SpringBoot用户服务课程实践

举报
nozuch 发表于 2023/10/08 10:16:52 2023/10/08
【摘要】 探讨SpringBoot微服务的应用场景,逐步总结出可复用SpringBoot微服务用户、通告、日志服务的基础架构。在归纳出来的框架的基础上,小组成员从需求分析开始,通过复杂工程问题体系化归纳,对项目的系统架构设计、核心流程、接口设计、持久化存储设计等规范进行了完善,并开始搭建SpringBoot框架,引入中间件,完成权限设计。在开发过程中基于华为云进行DevOps开发实践,实现了Git协同与流水

摘要

本报告从项目背景出发,探讨SpringBoot微服务的应用场景,逐步总结出可复用SpringBoot微服务用户、通告、日志服务的基础架构。在归纳出来的框架的基础上,小组成员从需求分析开始,通过复杂工程问题体系化归纳,对项目的系统架构设计、核心流程、接口设计、持久化存储设计等规范进行了完善,并开始搭建SpringBoot框架,引入中间件,完成权限设计。在开发过程中基于华为云进行DevOps开发实践,实现了Git协同与流水线自动部署。在开发完成后,完成了项目各接口的测试,并总结经验成功。

Spring Boot微服务设计应用情况

Spring Boot 是一个用于构建微服务应用程序的流行框架之一,它提供了许多功能和工具,使开发人员能够快速构建高效、可伸缩的微服务应用程序。
Spring Boot 可以被用于构建微服务架构,其中应用程序被分解为多个小型、自治的服务,每个服务都专注于执行一个特定的任务。这种微服务架构可以提高应用程序的可伸缩性、可靠性和可维护性。
Spring Boot 可以与云原生技术(如 Kubernetes、Docker 和 Istio)结合使用,构建更高效、可移植的云原生应用程序。利用 Spring Boot 的自动配置和依赖管理功能,开发人员可以更轻松地将应用程序部署到云平台上。
Spring Boot 提供了强大的数据库支持,包括与各种数据库的集成,如 MySQL、PostgreSQL、MongoDB 和 Oracle。开发人员可以使用 Spring Boot 快速地构建数据库应用程序,以便管理和存储数据
Spring Boot 提供了消息传递框架,如 Apache Kafka 和 RabbitMQ,以便构建事件驱动的应用程序。利用 Spring Boot 的自动配置和依赖注入功能,开发人员可以更轻松地将消息传递功能添加到应用程序中。

DevOps发展趋势

DevOps是一套结合了开发、质保、运维的软件开发运维模式,即一套敏捷开发方法论和生态工具集。以提高协作和生产力为目标,以敏捷和精益为基础,DevOps将自动化引入应用开发,采用持续交付的方法,大大缩短应用开发周期。
“DevOps”一词是“Development开发”和“Operations运维”两个词的组合。微软认为,DevOps是人员,流程和产品的结合,使独立的对象更好的协作;谷歌认为,DevOps是一项租着和文化运动,旨在加快软件交付速度,提高服务可靠性。可见,DevOps不是单一的技术或者工具,也不是单一的一个流程,它可以被理解为一系列可以高速、高质量进行软件开发的生态链,这种模式不仅提高了软件开发的效率和最终产品的质量,更是现代IT企业协作及共享文化的体现和应用。
在行业对IT从业人员素质不断提高、企业内开发运维部门不能有效沟通带来的低效能的情况下,具有紧密闭环流程的DevOps显然成为了开发运维的最佳选择。动态的流水线、迭代的开发进程和交互的协作模式,开发人员不仅能够高效的通过微服务架构进行项目开发,还能及时持续地与用户进行对接,在保证了开发质量地同时还给IT从业人员带来了良好地开发体验。
在微服务架构、容器技术等加持下,DevOps已经成为行业内开发运维的不可或缺的开发方法。其更快的开发交付、更高的应用质量和与用户的持续沟通,依托云原生的巨大平台,将逐步发展为行业开发运维的主流。

项目目标

  1. 设计高度可复用的用户管理系统
  2. 建立基于用户服务的消息通告系统
  3. 构建日志管理框架
  4. 设计顶层服务,联合应用上述三个服务
  5. 基于Git的代码版本控制与云协作。
  6. 基于华为DevCloud的DevOps实践。
  7. 通过华为DevCloud的CI/CD敏捷开发模式。

可复用的SpringBoot微服务用户、通告与日志基础设施抽象与归纳

可复用的SpringBoot微服务用户、通告与日志基础架构设施设计

功能需求分析

SpringBoot微服务用户、通告与日志服务需要实现三个主要功能:

  1. 用户管理服务:
    项目核心部分
    主要分为两大模块:
  • 登录注册
    用户注册方面,使用邮箱验证码注册,账户初始状态为禁用,需使用邮箱验证码完成激活才能登陆。
    用户登录方面,提供两种登陆方式:
    1. 用户名密码登录
    2. 邮箱验证码登录(无需提供密码)
      登录凭据可选择邮箱,也可选择用户名。
      提供基本的账户密码管理功能,支持通过邮箱验证码重设密码。
      使用Shiro框架完成登录认证
  • 用户信息管理
    设计可复用的RBAC模型,体现角色、权限的层次性。
    包含对用户的角色、权限、具体信息的管理。
    具体权限认证、拦截等功能由Shiro框架完成。
  1. 消息通告服务:
    使用邮件完成对用户的通告功能,支持邮件的一对多和一对一发送。
  2. 日志管理框架:
    将SpringBoot的日志输出到文件,并使用EFK框架实现对日志的归档整理。
  • Elasticsearch完成对日志的全文检索、分析归档。
  • Kibana实现与Elasticsearch协同的可视化日志查看与分析。
  • Filebeat完成对日志文件的发现。

系统架构、核心流程与关键技术

核心流程(部分)

  • 用户注册、登录
  • 接口鉴权
  • 用户服务具体功能实现

权限体系设计

RBAC模型

核心:将权限赋予角色,再把角色赋予用户
其中,一个用户可对应多种角色,一种角色可对应多种权限。
但用户与角色的关系不应该是随意的一对多的关系,应该有限制条件:

  1. 角色互斥:一个用户不能同时拥有两种对立的角色,如:提交方案的角色与审核方案的角色即为对立角色;
  2. 角色基数约束:某些角色只能由限定数量的用户担任,如系统管理员应只由限定数量的用户担任。

权限层级设置

image.png

核心代码逻辑设计

  • Shiro过滤器配置
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/index.html", "anon");
filterChainDefinitionMap.put("/api/user/login", "anon");
filterChainDefinitionMap.put("/api/user/loginbyemail", "anon");
filterChainDefinitionMap.put("/api/user/register**", "anon");
filterChainDefinitionMap.put("/api/user/sendMsg","anon");
filterChainDefinitionMap.put("/api/user/activate","anon");
filterChainDefinitionMap.put("/api/user/testRegisterUser","anon");
filterChainDefinitionMap.put("/api/user/testResetPasswd","anon");
filterChainDefinitionMap.put("/api/user/resetpasswd","anon");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setLoginUrl("/api/unauth");

登录、注册服务

  • 登录
@PostMapping("url")
public RespResult login(@RequestBody SysUser sysUser) {
    try {
        // Shiro鉴权
        Subject subject  = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(sysUser.getUsername(), sysUser.getPassword());
        subject.login(token);
    } catch (IncorrectCredentialsException e) {
        ... //异常处理
    }
    // 正确登录,生成token并返回
    return RespResult.success("登录成功", data);
}
  • 注册
@PostMapping("url")
public RespResult registerByEmail(@RequestBody Vo vo) {
    Boolean status = userService.registerByEmail(reqVo); // 具体注册服务
    if (status) {
        // 注册成功
    } else {
        // 注册失败
    }
}
用户管理服务
- 用户修改个人信息
@PostMapping("url")
@RequiresPermissions("user")
public RespResult modifyUsernameAndNickname(@RequestBody ModifyOwnInfoReqVo reqVo){
    //请求数据处理
    if (status) {
        //发送成功
    } else {
        //发送失败
    }
}
  • 获取个人权限列表
@GetMapping("url")
@RequiresPermissions("perm")
public RespResult getOwnPermByUserId() {
    //数据查找
    for (SysRole role : roleList) {
       ....
    for (Long id : roleId) {
       ....
       
    }
    if(permList != null){

        //删除重复Perm
        //发送成功和data
    }else if(permList == null){
        //发送失败
    }else{
        //发送失败
    }

}
  • 删除角色
@DeleteMapping("url")
@RequiresPermissions("role")
public RespResult deleteRole(@PathVariable Long id) {
    //数据处理
    if (status) {
       //发送成功 
    } else {
       //发送成功
    }
}

消息通告服务

@PostMapping("url")
@RequiresPermissions("perm") // Shiro鉴权
public RespResult sendByGroup(@RequestBody MsgNotificationReqVo reqVo) {
    // 请求数据处理
    }
    for (String username : tUsername) {
        ...
        // 邮件发送服务
        if (!status) {
            // 发送成功
        }
    }
    // 发送失败
}

系统开发DevOps实践

DevOps开发环境配置

Git仓库

  • 华为云CodeArts代码托管

ECS

两台ECS云服务器:

  • 一台开发服务器,用于实现流水线自动部署,实现敏捷开发。
  • 一台生产服务器,用于实现自动部署,便于新版本发布
  • 配置
    开发服务器:
    系统:Ubuntu 22.04 64位
    CPU:2 vCPUs
    内存:4GiB
    生产服务器:
    系统:Ubuntu 22.04 64位
    CPU:2 vCPUs
    内存:4GiB

流水线

为了实现敏捷开发的目标,降低开发过程中重复部署测试的时间消耗,采用了华为云流水线实现自动部署。
流水线配置

  • 流水线基础配置


  • 流水线部署结果

流水线功能验证

  • 测试登录接口

  • 修改登录成功返回信息,并push到对应分支

  • 流水线部署完成

  • 再次访问相同接口,返回内容变化
    证明流水线自动部署成功,自动部署过程中无需手动上传服务器和重启程序,实现了持续交互与持续部署。

总结

项目成果

在本次项目实践的过程中,我们小组从需求分析开始,通过复杂工程问题体系化归纳,逐步完成了一个基于SpringBoot的可复用用户管理、通告、日志微服务项目,我们了解了有关SpringBoot编写的方法与逻辑,深入研究了RBAC模型,并学习了Apache Shiro这一重要中间件的使用,并对用于数据分析处理的EFK框架进行了实践。

解决思路

通过本次项目实践,我们掌握了开发一个项目的基本流程,我们首先对项目进行需求分析,完成复杂工程问题的体系化归纳,并根据我们的需要选择了对应的中间件引入。在完成基础设计和中间件引入后,我们基于MVC模型,将接口访问使用对应的Controller负责路由,在Service服务中完成具体业务逻辑,使用对应的Repository类完成数据库交互,每个部分彼此独立,层次明确。

团队协作

在团队协作的过程中,我们有效避免了分工不均和重复造轮子的问题,在进行任何工作之前都会提前进行任务分配,或者主动承担任务。我们还充分利用了各个队员的特长,安排代码能力较强的队员更多地完成代码编写工作,代码能力较弱的队员侧重于其他工作。

问题与不足

  • 团队协作能力还有待提高。
  • 日志收集服务可使用Kafka进一步优化。
  • 消息通告、验证码的形式还能有所丰富,可考虑支持短信等形式。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。