基于华为云的可复用SpringBoot用户服务课程实践
摘要
本报告从项目背景出发,探讨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已经成为行业内开发运维的不可或缺的开发方法。其更快的开发交付、更高的应用质量和与用户的持续沟通,依托云原生的巨大平台,将逐步发展为行业开发运维的主流。
项目目标
- 设计高度可复用的用户管理系统
- 建立基于用户服务的消息通告系统
- 构建日志管理框架
- 设计顶层服务,联合应用上述三个服务
- 基于Git的代码版本控制与云协作。
- 基于华为DevCloud的DevOps实践。
- 通过华为DevCloud的CI/CD敏捷开发模式。
可复用的SpringBoot微服务用户、通告与日志基础设施抽象与归纳
可复用的SpringBoot微服务用户、通告与日志基础架构设施设计
功能需求分析
SpringBoot微服务用户、通告与日志服务需要实现三个主要功能:
- 用户管理服务:
项目核心部分
主要分为两大模块:
- 登录注册
用户注册方面,使用邮箱验证码注册,账户初始状态为禁用,需使用邮箱验证码完成激活才能登陆。
用户登录方面,提供两种登陆方式:- 用户名密码登录
- 邮箱验证码登录(无需提供密码)
登录凭据可选择邮箱,也可选择用户名。
提供基本的账户密码管理功能,支持通过邮箱验证码重设密码。
使用Shiro框架完成登录认证
- 用户信息管理
设计可复用的RBAC模型,体现角色、权限的层次性。
包含对用户的角色、权限、具体信息的管理。
具体权限认证、拦截等功能由Shiro框架完成。
- 消息通告服务:
使用邮件完成对用户的通告功能,支持邮件的一对多和一对一发送。 - 日志管理框架:
将SpringBoot的日志输出到文件,并使用EFK框架实现对日志的归档整理。
- Elasticsearch完成对日志的全文检索、分析归档。
- Kibana实现与Elasticsearch协同的可视化日志查看与分析。
- Filebeat完成对日志文件的发现。
系统架构、核心流程与关键技术
核心流程(部分)
- 用户注册、登录
- 接口鉴权
- 用户服务具体功能实现
权限体系设计
RBAC模型
核心:将权限赋予角色,再把角色赋予用户
其中,一个用户可对应多种角色,一种角色可对应多种权限。
但用户与角色的关系不应该是随意的一对多的关系,应该有限制条件:
- 角色互斥:一个用户不能同时拥有两种对立的角色,如:提交方案的角色与审核方案的角色即为对立角色;
- 角色基数约束:某些角色只能由限定数量的用户担任,如系统管理员应只由限定数量的用户担任。
权限层级设置
核心代码逻辑设计
- 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进一步优化。
- 消息通告、验证码的形式还能有所丰富,可考虑支持短信等形式。
- 点赞
- 收藏
- 关注作者
评论(0)