某人事系统架构搭建设计记录
首发博客地址
https://blog.zysicyj.top/
先大致列一下基础情况
-
架构必须是微服务 -
场景上涉及大量查询操作,分析操作 -
存在临时大量写入的场景 -
并发并不高 -
对高可用要求较高,不能挂掉 -
对安全要求高 -
要能过等保测试等三方测试 -
使用人数并不多,十万内 -
涉及很多在线编辑,预览等操作 -
对大屏展示有需求 -
数据库还不确定,如果要求高的话mysql必须换成达梦 -
中间件也不确定,要求高的话必须换成东方通 -
加密必须是国密
前言
好的代码,肯定最基本的有一套开发规范去约束的,不然堆砌的代码肯定成”屎山“。扩展性,性能啥的先不谈,单单维护代码成本就会很高,也很容易出BUG。
所以呀,我们必须先有一套开发规范,我这里拟了一套规范供内部使用:
-
MySQL开发规范 -
后台开发规范 -
前端开发规范 -
代码提交规范
架构
这里微服务框架我推荐直接使用Spring Cloud Alibaba体系组件,原因如下:
-
Spring Cloud Alibaba 已经是国内实际上微服务标准 -
服务于阿里集团大大小小各种业务,生产使用稳定 -
社区庞大,遇到问题容易解决 -
文档齐全,中文文档详细,方便查阅 -
与 Spring Cloud 集成,可以充分使用 Spring Cloud 特性 -
组件丰富
高清大图地址:https://www.processon.com/view/link/64ef11baa8c890267a8a023d
聊聊组件选型
那么,具体我们需要哪些组件呢?这里的组件并不是必须的,需要后续综合考虑
-
ES:数据检索 -
Redis:缓存 -
JetCache:多级缓存 -
MySQL,如果有国产化需求,考虑 达梦数据库 -
Druid:数据源管理框架 -
ShardingSphere:对数据库进行增强,比如 分库分表,加密的支持 -
Minio:文件存储 -
Seata:分布式事务 -
Spring Cloud Gateway:由于并发量并不大,所以我们可以不需要 Nginx网关 -
Sentinel: 熔断限流 -
Spring Cloud Alibaba Sidecar:项目中很有可能涉及其他非 Spring Cloud 应用,此时就需要将其接入 Spring Cloud -
引入 GraalVM,可以看到,对比 JVM 启动速度提升
-
JimuReport+EasyExcel:报表设计 -
KkFileView:在线预览各种文件 -
Activity:工作流支持 -
Hutool:最全工具类库 -
Nacos:服务注册和配置中心 -
RocketMQ:消息队列,削峰填谷 -
Docker:使用 Docker 进行容器化部署 -
GitLab:源码管理 -
Nexus:构建仓库 -
Jenkins:部署平台 -
SkyWalking:链路追踪 -
SaToken 或 Spring Cloud Security+Oauth:授权 -
Leaf:分布式 ID 生成器 -
MybatisFlex:ORM 框架 -
Dubbo 或 Feign:服务间通信
一些细节
再次声明一点,业务上是读多写少,分析报表多,所以很多设计上要优化
-
MySQL:读写分离,分库分表 -
Redis:主从从架构,哨兵集群 -
项目使用多级缓存 -
数据国密加密 -
账号最小权限分配,严格限制超级管理员账号 -
统一线程池使用
打任务量导入导出
-
通过优化线程池提高效率 -
通过逻辑过滤重复任务 -
使用消息队列削峰 -
使用缓存优化查询速度
查询流程
-
客户端发送请求 -
前端请求加密 -
请求发送到网关 -
网关校验请求合法性 -
网关根据路由规则转发到具体的服务器上处理 -
服务器解密请求数据 -
查询本地缓存 -
若无则查询 Redis -
若无则进行业务流转,最终查询 MySQL -
根据路由规则,查询只读 MySQL 节点并返回数据 -
数据本地缓存,然后 Redis 缓存 -
返回响应数据 -
对响应加密,转发到网关 -
网关转发给客户端 -
客户端解密,展示数据
部署流程
开发环境
-
开发提交代码 -
基于 GitLab CI/CD 自动拉取代码生成 Docker 镜像并提供服务
测试环境
-
合并代码到测试分支 -
基于 GitLab CI/CD 自动拉取代码生成 Docker 镜像并提供服务
生产环境
-
合并代码到生产分支 -
基于 GitLab,手动用 Jenkins 部署项目
详细部署策略
如果中台能提供,那肯定是最好的,不用考虑那么多了
现在假设有10台服务器
-
服务器1和服务器2:MySQL数据库服务器,部署主从复制架构。
-
服务器1作为主数据库(Master),负责写入操作和部分读取操作。 -
服务器2作为从数据库(Slave),负责复制主数据库的数据,并提供读取操作,实现读写分离。 -
主从复制可以提高数据库的可用性和性能,当主数据库出现故障时,可以快速切换到从数据库。
-
-
服务器3和服务器4:Redis缓存服务器,部署主从架构。
-
服务器3作为主节点(Master),负责处理写入和读取操作。 -
服务器4作为从节点(Slave),复制主节点的数据,并提供读取操作。 -
Redis主从架构可以提高缓存的可用性和读取性能。
-
-
服务器5:Minio文件存储服务器,用于存储上传的文件。
-
Minio是一个开源的对象存储服务器,提供高可用性和可扩展性的存储解决方案。
-
-
服务器6和服务器7:Nacos服务注册和配置中心,用于服务的注册和配置管理。
-
Nacos提供了服务注册、发现和配置管理的功能,支持高可用和可靠的服务部署。
-
-
服务器8:RocketMQ消息队列服务器,用于削峰填谷,异步处理导入任务。
-
RocketMQ提供了高吞吐量、低延迟的消息传递能力,可以将导入任务放入消息队列中,由异步消费者进行处理。
-
-
服务器9和服务器10:用于部署应用程序和其他中间件,如Spring Cloud Gateway、Sentinel、SkyWalking等。
-
这些服务器用于部署应用程序和其他中间件,如API网关、熔断限流、链路追踪等,提供服务的访问和监控。
-
将MySQL数据库和Redis缓存部署为主从架构的原因如下:
-
高可用性:主从复制可以提供故障容错能力,当主节点出现故障时,可以快速切换到从节点,保证服务的连续性和可用性。 -
读写分离:通过将读操作分发到从节点,可以减轻主节点的负载,提高数据库的读取性能。同时,从节点的复制过程对主节点的影响较小,不会对主节点的写入操作产生影响。
本文由 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号端口拒绝连接的问题,您可以尝试以下几个步骤来解决问题: 确认SSH服务已启动: 确保Ubuntu服务器上的SSH服务已经正确启动。您可以在服务器上运行以下命令来检查SSH服务的状态:…...
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 ,请你找出其中不含有重复字符的 最长子串 的长度 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…...
【SQL】关系模型与查询和更新数据
一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键,但联合主键并不常用。 1.2 外键 FOREIGN KEY …...
【Centos8_配置单节点伪分布式Spark环境】
安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接: jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk(java8) # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …...
【软考】系统集成项目管理工程师(三)信息系统集成专业技术知识①【16分】
一、系统集成的特点 官方解释: 1、信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等; 2、信息系统集成是指将计算机软件、硬件、网络通信、信息安全等技术和产品集成为能够满足用户特定需求的信息系统;显著特点如下&am…...
揭秘特权账号潜在风险,你中招了吗?
什么是特权账号? 特权账号指在企业运营过程中,为相关业务运营、系统管理、系统运维等人员赋予的系统维护、权限增加、数据修改删除、导出等高级权限的系统账号。这些账号多数连接企业核心资源,保障企业内部各项业务正常运作。然而࿰…...
线性代数的学习和整理13: 定义域,值域,到达域 和单射,满射,双射,反函数,逆矩阵
目录 1 函数与 向量/矩阵 2 初等数学的函数 2.1 函数 2.2 函数的定义:定义域 →映射→ 值域 3 高等数学里的函数:定义域和陪域/到达域(非值域)的映射关系 3.1 函数 3.2 单射,满射,双射等都是针对…...
深入MaxCompute -第十一弹 -QUALIFY
简介: MaxCompute支持QUALIFY语法过滤Window函数的结果,使得查询语句更简洁易理解。Window函数和QUALIFY语法之间的关系可以类比聚合函数GROUP BY语法和HAVING语法。 MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分…...
Mysql定时备份事件
创建了一个名为backup_database的定时任务,每天自动在当前时间的后一天开始执行。备份数据库的代码使用mysqldump命令将数据库导出为sql文件保存在指定的备份目录中。 需要注意的是,上述代码中的用户名 (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: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…...
小兔鲜儿 - 微信登录
目录 微信登录 登录方式 静态结构 获取登录凭证 获取手机号码 微信登录接口(生产环境) 模拟手机登录(开发环境) 用户信息持久化存储 涉及知识点:微信授权登录,文件上传,Store 状态管理等。 微信登录 微信小程序的开放…...
C++ Primer阅读笔记--对象移动(右值引用、移动迭代器和引用限定符的使用)
目录 1--右值引用 2--std::move 3--移动构造函数 4--移动赋值运算符 5--移动迭代器 6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用,通过 && 获得右值引用; 右值引用只能绑定到临时对象(即将被销毁的对象)…...
【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)
背景需求: 2023年第一学期(2023年9-2024年1月),我又被安排为“机动班”,根据新学期的校历,手动推算本学期的机动班的带班表 排版原则 1、班级数量:共有6个班级,循环滚动 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库】 前言: 本人需要用C写代码,调用OpenCV库,且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本,所以apt安装OpenCV的版本始终是3.2.0,非常拉胯&#…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
