当前位置: 首页 > 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;非常拉胯&#…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...