当前位置: 首页 > news >正文

某人事系统架构搭建设计记录

首发博客地址

https://blog.zysicyj.top/

先大致列一下基础情况

  • 架构必须是微服务
  • 场景上涉及大量查询操作,分析操作
  • 存在临时大量写入的场景
  • 并发并不高
  • 对高可用要求较高,不能挂掉
  • 对安全要求高
  • 要能过等保测试等三方测试
  • 使用人数并不多,十万内
  • 涉及很多在线编辑,预览等操作
  • 对大屏展示有需求
  • 数据库还不确定,如果要求高的话mysql必须换成达梦
  • 中间件也不确定,要求高的话必须换成东方通
  • 加密必须是国密

前言

好的代码,肯定最基本的有一套开发规范去约束的,不然堆砌的代码肯定成”屎山“。扩展性,性能啥的先不谈,单单维护代码成本就会很高,也很容易出BUG。

所以呀,我们必须先有一套开发规范,我这里拟了一套规范供内部使用:

  1. MySQL开发规范
  2. 后台开发规范
  3. 前端开发规范
  4. 代码提交规范

架构

这里微服务框架我推荐直接使用Spring Cloud Alibaba体系组件,原因如下:

  1. Spring Cloud Alibaba 已经是国内实际上微服务标准
  2. 服务于阿里集团大大小小各种业务,生产使用稳定
  3. 社区庞大,遇到问题容易解决
  4. 文档齐全,中文文档详细,方便查阅
  5. 与 Spring Cloud 集成,可以充分使用 Spring Cloud 特性
  6. 组件丰富
系统架构图
系统架构图

高清大图地址:https://www.processon.com/view/link/64ef11baa8c890267a8a023d

聊聊组件选型

那么,具体我们需要哪些组件呢?这里的组件并不是必须的,需要后续综合考虑

  1. ES:数据检索
  2. Redis:缓存
  3. JetCache:多级缓存
  4. MySQL,如果有国产化需求,考虑 达梦数据库
  5. Druid:数据源管理框架
  6. ShardingSphere:对数据库进行增强,比如 分库分表,加密的支持
  7. Minio:文件存储
  8. Seata:分布式事务
  9. Spring Cloud Gateway:由于并发量并不大,所以我们可以不需要 Nginx网关
  10. Sentinel: 熔断限流
  11. Spring Cloud Alibaba Sidecar:项目中很有可能涉及其他非 Spring Cloud 应用,此时就需要将其接入 Spring Cloud
  12. 引入 GraalVM,可以看到,对比 JVM 启动速度提升 alt
  13. JimuReport+EasyExcel:报表设计
  14. KkFileView:在线预览各种文件
  15. Activity:工作流支持
  16. Hutool:最全工具类库
  17. Nacos:服务注册和配置中心
  18. RocketMQ:消息队列,削峰填谷
  19. Docker:使用 Docker 进行容器化部署
  20. GitLab:源码管理
  21. Nexus:构建仓库
  22. Jenkins:部署平台
  23. SkyWalking:链路追踪
  24. SaTokenSpring Cloud Security+Oauth:授权
  25. Leaf:分布式 ID 生成器
  26. MybatisFlex:ORM 框架
  27. DubboFeign:服务间通信

一些细节

再次声明一点,业务上是读多写少,分析报表多,所以很多设计上要优化

  • MySQL:读写分离,分库分表
  • Redis:主从从架构,哨兵集群
  • 项目使用多级缓存
  • 数据国密加密
  • 账号最小权限分配,严格限制超级管理员账号
  • 统一线程池使用

打任务量导入导出

  • 通过优化线程池提高效率
  • 通过逻辑过滤重复任务
  • 使用消息队列削峰
  • 使用缓存优化查询速度

查询流程

  1. 客户端发送请求
  2. 前端请求加密
  3. 请求发送到网关
  4. 网关校验请求合法性
  5. 网关根据路由规则转发到具体的服务器上处理
  6. 服务器解密请求数据
  7. 查询本地缓存
  8. 若无则查询 Redis
  9. 若无则进行业务流转,最终查询 MySQL
  10. 根据路由规则,查询只读 MySQL 节点并返回数据
  11. 数据本地缓存,然后 Redis 缓存
  12. 返回响应数据
  13. 对响应加密,转发到网关
  14. 网关转发给客户端
  15. 客户端解密,展示数据

部署流程

开发环境

  1. 开发提交代码
  2. 基于 GitLab CI/CD 自动拉取代码生成 Docker 镜像并提供服务

测试环境

  1. 合并代码到测试分支
  2. 基于 GitLab CI/CD 自动拉取代码生成 Docker 镜像并提供服务

生产环境

  1. 合并代码到生产分支
  2. 基于 GitLab,手动用 Jenkins 部署项目

详细部署策略

如果中台能提供,那肯定是最好的,不用考虑那么多了

现在假设有10台服务器

  1. 服务器1和服务器2:MySQL数据库服务器,部署主从复制架构。

    • 服务器1作为主数据库(Master),负责写入操作和部分读取操作。
    • 服务器2作为从数据库(Slave),负责复制主数据库的数据,并提供读取操作,实现读写分离。
    • 主从复制可以提高数据库的可用性和性能,当主数据库出现故障时,可以快速切换到从数据库。
  2. 服务器3和服务器4:Redis缓存服务器,部署主从架构。

    • 服务器3作为主节点(Master),负责处理写入和读取操作。
    • 服务器4作为从节点(Slave),复制主节点的数据,并提供读取操作。
    • Redis主从架构可以提高缓存的可用性和读取性能。
  3. 服务器5:Minio文件存储服务器,用于存储上传的文件。

    • Minio是一个开源的对象存储服务器,提供高可用性和可扩展性的存储解决方案。
  4. 服务器6和服务器7:Nacos服务注册和配置中心,用于服务的注册和配置管理。

    • Nacos提供了服务注册、发现和配置管理的功能,支持高可用和可靠的服务部署。
  5. 服务器8:RocketMQ消息队列服务器,用于削峰填谷,异步处理导入任务。

    • RocketMQ提供了高吞吐量、低延迟的消息传递能力,可以将导入任务放入消息队列中,由异步消费者进行处理。
  6. 服务器9和服务器10:用于部署应用程序和其他中间件,如Spring Cloud Gateway、Sentinel、SkyWalking等。

    • 这些服务器用于部署应用程序和其他中间件,如API网关、熔断限流、链路追踪等,提供服务的访问和监控。

将MySQL数据库和Redis缓存部署为主从架构的原因如下:

  1. 高可用性:主从复制可以提供故障容错能力,当主节点出现故障时,可以快速切换到从节点,保证服务的连续性和可用性。
  2. 读写分离:通过将读操作分发到从节点,可以减轻主节点的负载,提高数据库的读取性能。同时,从节点的复制过程对主节点的影响较小,不会对主节点的写入操作产生影响。

本文由 mdnice 多平台发布

相关文章:

某人事系统架构搭建设计记录

首发博客地址 https://blog.zysicyj.top/ 先大致列一下基础情况 架构必须是微服务 场景上涉及大量查询操作,分析操作 存在临时大量写入的场景 并发并不高 对高可用要求较高,不能挂掉 对安全要求高 要能过等保测试等三方测试 使用人数并不多,十…...

uniapp 实现切换tab锚点定位到指定位置

1.主要使用uniapp scroll-view 组件的scroll-into-view属性实现功能 2.代码如下 <scroll-view:scroll-into-view"intoView"><u-tabsclass"tabs-list"change"tabChange":list"tabList"></u-tabs><view id"1&…...

华纳云:ssh登录22号端口拒绝连接Ubuntu?

如果您在尝试使用SSH登录Ubuntu服务器的时候遇到了22号端口拒绝连接的问题&#xff0c;您可以尝试以下几个步骤来解决问题&#xff1a; 确认SSH服务已启动&#xff1a; 确保Ubuntu服务器上的SSH服务已经正确启动。您可以在服务器上运行以下命令来检查SSH服务的状态&#xff1a…...

python conda实践 sanic框架gitee webhook实践

import subprocess import hmac import hashlib import base64 from sanic.response import text from sanic import Blueprint from git import Repo# 路由蓝图 hook_blue Blueprint(hook_blue)hook_blue.route(/hook/kaifa, methods["POST"]) async def kaifa(req…...

LeetCode——无重复的最长子串(中等)

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…...

【SQL】关系模型与查询和更新数据

一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要&#xff1a;主键不要带有业务含义&#xff0c;而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键&#xff0c;但联合主键并不常用。 1.2 外键 FOREIGN KEY …...

【Centos8_配置单节点伪分布式Spark环境】

安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接&#xff1a; jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk&#xff08;java8&#xff09; # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …...

【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识①【16分】

一、系统集成的特点 官方解释&#xff1a; 1、信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等&#xff1b; 2、信息系统集成是指将计算机软件、硬件、网络通信、信息安全等技术和产品集成为能够满足用户特定需求的信息系统&#xff1b;显著特点如下&am…...

揭秘特权账号潜在风险,你中招了吗?

什么是特权账号&#xff1f; 特权账号指在企业运营过程中&#xff0c;为相关业务运营、系统管理、系统运维等人员赋予的系统维护、权限增加、数据修改删除、导出等高级权限的系统账号。这些账号多数连接企业核心资源&#xff0c;保障企业内部各项业务正常运作。然而&#xff0…...

线性代数的学习和整理13: 定义域,值域,到达域 和单射,满射,双射,反函数,逆矩阵

目录 1 函数与 向量/矩阵 2 初等数学的函数 2.1 函数 2.2 函数的定义&#xff1a;定义域 →映射→ 值域 3 高等数学里的函数&#xff1a;定义域和陪域/到达域&#xff08;非值域&#xff09;的映射关系 3.1 函数 3.2 单射&#xff0c;满射&#xff0c;双射等都是针对…...

深入MaxCompute -第十一弹 -QUALIFY

简介&#xff1a; MaxCompute支持QUALIFY语法过滤Window函数的结果&#xff0c;使得查询语句更简洁易理解。Window函数和QUALIFY语法之间的关系可以类比聚合函数GROUP BY语法和HAVING语法。 MaxCompute&#xff08;原ODPS&#xff09;是阿里云自主研发的具有业界领先水平的分…...

Mysql定时备份事件

创建了一个名为backup_database的定时任务&#xff0c;每天自动在当前时间的后一天开始执行。备份数据库的代码使用mysqldump命令将数据库导出为sql文件保存在指定的备份目录中。 需要注意的是&#xff0c;上述代码中的用户名 (username)、密码 (password)、主机名 (hostname) …...

探索ClickHouse——安装和测试

我们在Ubuntu 20 Server版虚拟机上对ClickHouse进行探索。 安装 检测环境 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"SSE 4.2 supported 可以看到我们的环境支持编译版本的。如果不支持的环境…...

常用的css样式

1&#xff1a;flex布局 .flex-between {display: flex;justify-content: space-between; }.flex-evenly {display: flex;justify-content: space-evenly; }.flex-end {display: flex;justify-content: flex-end; }.flex {display: flex; }.flex-center {display: flex;justify…...

小兔鲜儿 - 微信登录

目录 微信登录​ 登录方式 静态结构​ 获取登录凭证​ 获取手机号码​ 微信登录接口(生产环境) 模拟手机登录(开发环境) 用户信息持久化存储​ 涉及知识点&#xff1a;微信授权登录&#xff0c;文件上传&#xff0c;Store 状态管理等。 微信登录​ 微信小程序的开放…...

C++ Primer阅读笔记--对象移动(右值引用、移动迭代器和引用限定符的使用)

目录 1--右值引用 2--std::move 3--移动构造函数 4--移动赋值运算符 5--移动迭代器 6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用&#xff0c;通过 && 获得右值引用&#xff1b; 右值引用只能绑定到临时对象&#xff08;即将被销毁的对象&#xff09…...

【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)

背景需求&#xff1a; 2023年第一学期&#xff08;2023年9-2024年1月&#xff09;&#xff0c;我又被安排为“机动班”&#xff0c;根据新学期的校历&#xff0c;手动推算本学期的机动班的带班表 排版原则 1、班级数量&#xff1a;共有6个班级&#xff0c;循环滚动 2、每周次…...

ChatGPT HTML JS Echarts实现热力图展示

热力图是一种常用的数据可视化图表,主要用于展示数据的分布和密度情况。它通过使用不同颜色的热点来表示数据在地理或二维空间上的分布情况,从而直观地显示出数据的密集程度和趋势。 热力图的功能和作用如下: 1. 数据分布展示:热力图可以将大量数据以热点的形式展示在地理…...

JavaScript七小知

文章目录 1. == 和 ===区别2. a++ 和 ++a区别3. 创建js对象的三种方式4. 原型与原型链相关4.1 prototype4.2 __proto__4.3 constructor4.4 原型链5. 定时器的两种设置方式6. 时间相关7. axios与axios拦截器1. == 和 ===区别 ​ == 只是判断值是否一致, ​ === 会判断数据类型和…...

Ubuntu【系统环境下】【编译安装OpenCV】【C++调用系统opencv库】

Ubuntu【系统环境下】【编译安装OpenCV】【C调用系统opencv库】 前言&#xff1a; 本人需要用C写代码&#xff0c;调用OpenCV库&#xff0c;且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本&#xff0c;所以apt安装OpenCV的版本始终是3.2.0&#xff0c;非常拉胯&#…...

ESLint-Plugin-Unicorn规则优先级设置终极指南:如何平衡代码质量和开发效率

ESLint-Plugin-Unicorn规则优先级设置终极指南&#xff1a;如何平衡代码质量和开发效率 【免费下载链接】eslint-plugin-unicorn More than 100 powerful ESLint rules 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-unicorn ESLint-Plugin-Unicorn是一个…...

知识获取受限?5款开源工具助你合法解锁付费内容

知识获取受限&#xff1f;5款开源工具助你合法解锁付费内容 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 你是否曾在学术研究关键时刻被期刊付费墙阻挡&#xff1f;是否因新闻网站的…...

终极RPA档案解压指南:快速提取Ren‘Py游戏资源的完整教程

终极RPA档案解压指南&#xff1a;快速提取RenPy游戏资源的完整教程 【免费下载链接】unrpa A program to extract files from the RPA archive format. 项目地址: https://gitcode.com/gh_mirrors/un/unrpa 想要从RenPy视觉小说游戏中提取图片、音频和脚本资源吗&#x…...

动态间隙精准诊断:NHJX-13 型底盘间隙仪机动车底盘安全检测全方案

动态间隙精准诊断&#xff1a;NHJX-13 型底盘间隙仪机动车底盘安全检测全方案在机动车安全环保检测体系中&#xff0c;底盘间隙仪是诊断车辆转向机构、悬挂系统、传动部件间隙状况的核心设备&#xff0c;尤其对大中型客车、重中型货车等营运车辆&#xff0c;其性能直接决定底盘…...

使用Alpine配置WSL ssh门户

1. 哑铃图是什么&#xff1f; 哑铃图&#xff08;Dumbbell Plot&#xff09;&#xff0c;有时也称为DNA图或杠铃图&#xff0c;是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中&#xff0c;我们通常使用两条折…...

Flow.js源码深度解析:分块算法、上传策略与事件系统的实现原理

Flow.js源码深度解析&#xff1a;分块算法、上传策略与事件系统的实现原理 【免费下载链接】flow.js A JavaScript library providing multiple simultaneous, stable, fault-tolerant and resumable/restartable file uploads via the HTML5 File API. 项目地址: https://gi…...

N_m3u8DL-CLI-SimpleG:让M3U8视频下载变得简单高效的图形化工具

N_m3u8DL-CLI-SimpleG&#xff1a;让M3U8视频下载变得简单高效的图形化工具 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 在数字内容日益丰富的今天&#xff0c;我们经常遇到需…...

2027年非全日制国际商务硕士备考规划-暨南大学(珠海研究院)

2027年非全日制国际商务硕士备考规划 一、基本情况与备考总原则 个人时间画像 工作日&#xff1a;19:20到家&#xff0c;19:30-20:00吃饭休息&#xff0c;20:00-23:00为黄金学习时段&#xff08;约2.5-3小时&#xff09;。23:30前入睡&#xff0c;保证7小时睡眠。 周末&#xf…...

intv_ai_mk11部署避坑指南:端口映射失败、响应延迟、乱码重复等问题解决方案

intv_ai_mk11部署避坑指南&#xff1a;端口映射失败、响应延迟、乱码重复等问题解决方案 1. 环境准备与快速部署 1.1 系统要求 操作系统&#xff1a;Ubuntu 20.04/22.04 LTSGPU&#xff1a;NVIDIA显卡&#xff08;至少16GB显存&#xff09;内存&#xff1a;32GB以上存储&…...

小白也能懂:将SPIRAN ART SUMMONER图像生成API封装成IDEA插件

小白也能懂&#xff1a;将SPIRAN ART SUMMONER图像生成API封装成IDEA插件 1. 为什么需要这个插件&#xff1f; 作为一名开发者&#xff0c;我经常遇到这样的场景&#xff1a;正在编写游戏角色设定文档时&#xff0c;突然需要一张概念图&#xff1b;设计UI界面时&#xff0c;想…...