首发博客地址
先大致列一下基础情况
- 架构必须是微服务
- 场景上涉及大量查询操作,分析操作
- 存在临时大量写入的场景
- 并发并不高
- 对高可用要求较高,不能挂掉
- 对安全要求高
- 要能过等保测试等三方测试
- 使用人数并不多,十万内
- 涉及很多在线编辑,预览等操作
- 对大屏展示有需求
- 数据库还不确定,如果要求高的话mysql必须换成达梦
- 中间件也不确定,要求高的话必须换成东方通
- 加密必须是国密
前言
好的代码,肯定最基本的有一套开发规范去约束的,不然堆砌的代码肯定成”屎山“。扩展性,性能啥的先不谈,单单维护代码成本就会很高,也很容易出BUG。
所以呀,我们必须先有一套开发规范,我这里拟了一套规范供内部使用:
架构
这里微服务框架我推荐直接使用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 多平台发布