集成方式
支持多种三方系统的接入和集成方式
单点登录方式接入其他已有系统
通过SCO-IDaaS认证服务的Token与三方系统的认证服务进行接入,实现单点登录。并保证本系统中用
户权限和数据使用/操作的独立性。
数据接口方式与三方系统进行数据交互
本系统多种数据接口定义和解析方式
支持RestAPI(Http协议)
支持WebService接口集成
支持经过认证的第三方数据源等。
消息通信机制
消息通信由消息中间件RocketMQ完成,具体通信机制如下图
Name Server
Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
Broker
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只
能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同的Broker Id来定
义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时(每隔30s)注册Topic信息到所有Name
Server。Name Server定时(每隔10s)扫描所有存活broker的连接,如果Name Server超过2分钟没有收
到心跳,则Name Server断开与Broker的连接。
Producer
Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic
路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状
态,可集群部署。
Producer每隔30s(由ClientConfig的pollNameServerInterval)从Name server获取所有topic队列的
最新情况,这意味着如果Broker不可用,Producer最多30s能够感知,在此期间内发往Broker的所有消
息都会失败。
Producer每隔30s(由ClientConfig中heartbeatBrokerInterval决定)向所有关联的broker发送心跳,
Broker每隔10s中扫描所有存活的连接,如果Broker在2分钟内没有收到心跳数据,则关闭与Producer
的连接。
Consumer
Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic
路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。
Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
Consumer每隔30s从Name server获取topic的最新队列情况,这意味着Broker不可用时,Consumer
最多最需要30s才能感知。
Consumer每隔30s(由ClientConfig中heartbeatBrokerInterval决定)向所有关联的broker发送心
跳,Broker每隔10s扫描所有存活的连接,若某个连接2分钟内没有发送心跳数据,则关闭连接;并向该
Consumer Group的所有Consumer发出通知,Group内的Consumer重新分配队列,然后继续消费。
当Consumer得到master宕机通知后,转向slave消费,slave不能保证master的消息100%都同步过来
了,因此会有少量的消息丢失。但是一旦master恢复,未同步过去的消息会被最终消费掉。
消费者队列是消费者连接之后(或者之前有连接过)才创建的。IP、消费者group、topic、tag,任何
一个元素不同,都认为是不同的消费端,每个消费端会拥有一份自己消费队列(默认是broker队列数量
*broker数量)。新挂载的消费者队列中拥有commitlog中的所有数据。
技术架构
整体技术栈用途
用途 | 名称 | 版本 |
---|---|---|
基础框架 | SpringBoot | 2.4.4 |
数据存储 | MySQL | 8.0/5.7 |
消息中间件 | rabbitmq | 4.8.0 |
缓存数据存储 | Redis | 6.0.6 |
JSON序列化框架 | FastJSON-Alibaba | 1.2.75 |
反向代理服务 | Nginx | 1.21 |
ORM中间件 | MyBatis-plus | 3.4.2 |
Http框架 | OkHttp | 4.0.0 |
日志引擎 | Kibana | 7.7.1 |
注册中心 | nacos | 2.0.0 |
接口平台 | yapi | 1.9.2 |
文件服务 | VsFTP | - |
搜索引擎 | Elasticsearch | 8.0 |
主要组件介绍
SpringBoot
使用该框架用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式
来进行配置,从而使开发人员不再需要定义样板化的配置。
Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,
在BSD-like 协议下发行。其特点是占有内存少,并发能力强,nginx的并发能力在同类型的网页服务器
中表现非常优秀,在SCO方案中,Nginx作为反向代理服务器和负载均衡服务器使用。
RabbitMQ
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳
定性。主要用于解决流量的削峰填谷、程序应用的系统解耦、提升响应性能、处理蓄流压测四大主要功
能;
削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)
MySQL
MySQL 是最流行的开源关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的
RDBMS
(Relational Database Management System:关系数据库管理系统)应用软件之一。
Redis
redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类
key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。SCO方案中使用Redis作为
缓存数据的数据存储服务组件使用。
性能说明
安全性
使用SpringSecurity安全框架,基于JWT的Token验证。支持多种认证架构模式的灵活切换,满足集中部
署和分级部署情况下的认证需求。
数据存储兼容性
支持多种数据库,系统开发期间,使用了数据存储层面的中间件。大幅度降低了对某一种特定数据的依
赖。在进行少量配置调整的情况下,可以快速切换底层数据库(需满足支持SQL92/99标准)。可支持
国际国内的多款主流数据库,如:达梦数据库、TiDB、GBase(南大通用)、Oracle、Microsoft SQL
Serever、IBM DB2等。
高可用与负载均衡
基于容器云的容器调度,实现容器应用服务动态伸缩、弹性拓展、滚动更新。保障应用程序能够7*24小
时全天运行。
微服务列表
服务名 | 用途 |
---|---|
Inovat-stockcalculate | 计算服务 |
Inovat-dataplatform | 基础数据服务 |
Inovat-dataclean | 数据清洗服务 |
Inovat-auth | 登录认证服务 |
Inovat-crontab | 定时任务 |
Inovat-api | 调用转发服务 |
Inovat-zuul | 网关路由服务 |
Inovat-web | web服务 |
Inovat-python-prediction | 预测服务 |
标准&可选软件架构方案
说明:必选架构方案在图中由实心线框标出、可选架构方案及组件由虚线框标出
基于容器云的必选架构组件
- 负载均衡服务容器
- 日志和搜索引擎应用服务容器
- 关系型数据库容器
- 缓存服务容器
- 事件总线MQ消息中间件容器
- 文件中间件
- 注册中心
基于容器云的可选架构组件
- SCO-Idaas门户集成
应用层级架构图
技术优势
- 采用国家密码管理局认可的算法,并符合密码行业标准和技术规范;
- 支持符合国密标准的硬件密码设备,完善的密钥保护机制,多级密钥管理,密钥永不以明文出现在
密码卡外,加解密在密码设备内进行; - 支持本地事务及分布式事务,保证全局事务一致性的前提下,提高事务处理性能;4. 单机支持TB级、分布式支持PB级数据高效管理,支持上千应用连接的大规模并发访问;具备完善
的数据分区技术和数据并行访问能力; - 数据接口集成标准化,具有SAP集成认证证书;
API说明文档
程序编程接口的使用说明
软件安装手册
环境要求、安装步骤
K8s容器云环境、Docker、Gitlab容器(需要李剑涛老师帮助完善)
技术选型
微服务or单应用
开发围绕着是搭建微服务架构还是单应用架构的讨论不曾停止,单应用运维方便,注意力更集中在单一的服务上;而微服务是对于逻辑层面或是业务层面的解耦,虽然运维成本增加,但是后期的维护方面具备一定的优势。
团队基于采用新的架构体系融入到产品中的思想,从业务层面对于服务间进行解耦,搭建数据中台,权限中台,计算服务,定时服务等,采用微服务设计方案。
注册中心
开源网关有consul、Eureka、nacos等,Eureka由于不会再有后续更新而不作为选择目标。开始选择了consul,但是稳定性在使用过程中出现问题,之后将注意力聚焦在nacos上,nacos引起团队的注意主要有几点,一是nacos是阿里团队开发,版本稳定性和对于国内开发人员使用更加习惯;再一个就是nacos集注册中心和配置中心于一身,起到节省资源开资的效果;最后一点,是nacos更为稳定。
网关
网关选择了zuul,产品本身对于转发等要求不高,就使用了springcloud的zuul作为网关
数据库的选取
业务数据的数据库选取mysql,因为普及率最高,且免费,团队开发人员对mysql更为熟练掌握;elasticsearch作为数据匹配的工具来使用,本身es就是作为搜索引擎而生,对于数据的相似度匹配或是查询方面有着强大优势;redis进行如字典数据、用户token、常访问数据的数据缓存,因频繁访问mysql对于其压力较大,缓存到redis会减轻mysql的压力,并且redis基于内存的机制,其访问速度很快。
CI/CD如何实施
使用k8s+docker+jenkins+maven相结合的方式进行,因为整体架构采用的微服务,运维和部署面临着问题,所以采用k8s+docker的镜像部署管理,使用jenkins+maven实现提交代码后自动发版,减轻运维压力,使团队能将更多注意力转移到开发本身上来
前后端接口协议
采用前后端分离的开发方式,前端和后端约定了一套合理的响应规范,定义ResponseModel对象来承载返回数据。
代码规范
使用阿里代码规约
代码结构
|- inovat-server-api 调用转发转接微服务
|- feign 微服务转发模块
|- controller 网关请求接收模块
|- inovat-server-auth 登录认证微服务
|- auth 登录认证
|- menu 菜单
|- role 角色识别
|- inovat-server-crontab 定时任务微服务
|- Requisitions 领用预测,领用量计算
|- inovat-server-dataclean 数据清洗微服务
|- category 分类清洗
|- funclocation 功能位置清洗
|- inovat-server-dataplatform 主数据微服务
|- CalWatching 计算日志
|- DataFactory 工厂
|- DataOrderHistory 历史订单
|- DataRepairOutline 维修工单
|- DataUpload 数据上传模块
|- Dictionary 字典
|- File 文件管理模块
|- MaterialBatchInfo 物料批次
|- MaterialCategoryTree 物料分类树
|- Material 物料
|- MaterialFunclocation 物料功能位置
|- MatParChildRlat 物料父子码
|- MatReplace 物料父子码关系
|- SystemConfig 系统设置
|- inovat-server-framework 主干微服务
|- commondb 通用主数据处理模块
|- exception 异常封装模块
|- log 日志封装模块
|- util 工具包
|- inovat-server-stockcalculate 计算微服务
|- cache 缓存
|- feign AI调用
|- hanlder 个性导入处理
|- impl 接口实现模块
|- CalculatePlatformGenerate 计算平台
|- MaterialCalculateProcess 计算过程
|- MaterialCalculateStoreAdvice 计算结果存储
|- MaterialPurchaseParam 计算参数
|- MaterialPurchasePlanHistoryRelation 计算历史
|- MaterialPurchasePlan 采购计划
|- PredictionMonth 月份预测
|- PurPlanExecute 采购计划执行
|- jobs 定时任务执行
|- timer 定时任务触发
|- inovat-web web微服务
|- inovat-zuul 网关微服务
|- inovat-python-prediction 智能预测微服务