kbnet.xaas.papi

一、准备

经过几个月的休养生息,个人的精神状态总算开始好转了,顺势也整理出了papi程序架构。kbnet.view.eap --> kbnet.xaas.papi  --> kbnet.xaas.dapi,papi是整体架构中的核心环节。不仅是papi程序架构,也包括dapi程序架构,早在2018年时就已经初具雏形,只是那时的架构不如当下完备与规范,2018年~2022年之间的技术是基于.net4.x实现,当下则是基于.net6+实现,自然不可同日而语。

本篇文章内容主要讲解kbnet.xaas.papi程序架构,以及使用规范等事项,并不包含kbnet.xaas.dapi程序框架信息,关于kbnet.xaas.dapi框架会专门写一篇文章讲解。

二、程序架构

 

三、程序架构信息

一、解决方案
	1.方案名称:kbnet代指产品或项目名称,xaas表示解决方案为服务程序(如saas\paas等),papi表示为服务程序中的产品服务,p即product首字母缩写。
	2.隶属关系:kbnet.xaas.papi位于view->papi->dapi中间位置,是内外交互的核心节点,对外屏蔽内部实现,对内屏蔽外部请求,发挥承上启下的作用。
	3.介绍信息:
		a.本程序主要实现业务的逻辑运算,不负责业务数据的存储、与增删改查等工作。
		b.本程序基于kbgress进行设计研发,且结构清晰,因此仅需按照程序架构、项目信息和编码规范,便可以实现高效能的程序开发。
		c.本程序架构以提供webapi服务为基准,软件即服务。


二、项目信息
	1.基础项目
		1.1.kbnet.xaas.papi
			a.项目简介:该项目是启动项目,主要负责程序的初始化工作,以及API的定义、使用、权鉴、转发和管理等。
			b.项目结构:无
			c.规则规范:
				1)在项目中不允许编写业务相关代码。
				2)程序初始化相关功能应在kbnet.xaas.services项目中实现,确保本项目作为启动项目的纯粹性。
				3)程序初始化不仅包含自身的初始化,也包含kbnet.xaas.services项目对接kbgress功能的初始化。
				4)Controllers文件夹中所有的类,必须以xxxxController进行命名。
				5)xxxxController类中的方法仅允许对参数进行验证,不允许处理业务逻辑运算。
				6)xxxxController类中的方法可以把请求转发给mqs按照消息队列方式处理,也可以传递给dts处理分布式事务需求,还可以传递给biz直接处理业务逻辑,依据实际需求选择。
				7)权鉴和安全功能,首先由中间件拦截请求,通过kbnet.xaas.services项目转发kbgress.client,最终由kbgress.client实现,并返回结果。
			d.引用关系:
				1.类库引用:
					1)Newtonsoft.Json
				2.项目引用:
					1)kbnet.xaas.models
					2)kbnet.xaas.common
					3)kbnet.xaas.services
					4)kbnet.xaas.xxxx.core.mqs
					5)kbnet.xaas.xxxx.core.dts
					6)kbnet.xaas.xxxx.core.biz
					7)kbnet.xaas.xxxx.models.inner
					8)kbnet.xaas.xxxx.models.product
			e.其他信息:无
		1.2.kbnet.xaas.common
			a.项目简介:该项目是通用项目,主要定义一些功能性的类,比如工具类、网络类、本地类、验证类等通用型的类。
			b.项目结构:无
			c.规则规范:
				1)不允许在此类中定义业务相关的功能类。
			d.引用关系:
				1.类库引用:
					1)Newtonsoft.Json
				2.项目引用:
					1)kbnet.xaas.models
			e.其他信息:无
		1.3.kbnet.xaas.services
			a.项目简介:该项目是基础服务项目,一方面负责为xxxx项目提供基础服务,另一方面负责与kbgress对接,即通过与kbgress对接实现xxxx项目所需的基础服务。
			b.项目结构:
				1)项目引用的SDK由“Microsoft.NET.Sdk”改为“Microsoft.NET.Sdk.Web”。注意,此次项目输出类型会变成“控制台应用程序”,应该回“类库”。
			c.规则规范:
				1)此项目负责中间件的定义与实现。
				2)此项目负责令牌、权限、安全的验证。
				3)此项目管理请求流量的控制与统计。
				4)此项目管理配置文件的解读与更新。
				5)此项目管理请求的定义和维护、以及分发和转发。
				6)此项目管理分布式计算与存储的接口定义和调用。
				7)此项目负责日志和消息记录与发送。
				8)此项目负责运维状态的记录和通信。
				9)此项目负责服务治理相关的事项。
			d.引用关系:
				1.类库引用:
					1)Newtonsoft.Json
				2.项目引用:
					1)kbnet.xaas.models
					2)kbnet.xaas.common
			e.其他信息:无
		1.4.kbnet.xaas.models
			a.项目简介:该项目是基础模型项目,主要定义通用的基础模型类,因此它不引用任何项目和第三方类库,仅提供基础模型类给其他项目引用和使用。
			b.项目结构:无
			c.规则规范:
				1)不允许引用其他项目和第三方类库。
			d.引用关系:
				1.类库引用:无
				2.项目引用:无
			e.其他信息:无
		1.5.kbnet.xaas.tests
			a.项目简介:该项目是测试项目,主要用于编写业务功能的测试类和执行顺序。测试至关重要,既是对自己负责,也是对协同者负责。
			b.项目结构:
				1)本项目是一个控制台程序,所有测试代码均自己动手编码,不依赖任何第三方测试类库和工具。
			c.规则规范:
				1)测试以目录划分顺序、层级和范围,以目录名称创建并命名xxxxTest类,且继承抽象类BaseTest,实现抽象方法ExecTest。
				2)Program启动类,调用以项目命名的顶级xxxxTest类的ExecTest方法,通过层级关系实现所有xxxxTest类的测试。
				3)已经测试过,不需要再测试的xxxxTest类,只需要在上级的ExecTest方法中注释掉即可,或者把自身的ExecTest方法中的内容注释掉。
				4)多个xxxxTest类之间的执行顺序,由程序员依据业务实际需求自行控制。
				5)为避免给数据库留下无用的测试数据,应本着测试结束后,数据库中无测试数据为原则。
			d.引用关系:
				1.类库引用:
					1)Newtonsoft.Json
				2.项目引用:
					1)kbnet.xaas.models
					2)kbnet.xaas.common
					3)kbnet.xaas.services
					4)kbnet.xaas.xxxx.core.mqs
					5)kbnet.xaas.xxxx.core.dts
					6)kbnet.xaas.xxxx.core.biz
					7)kbnet.xaas.xxxx.models.data
					8)kbnet.xaas.xxxx.models.inner
					9)kbnet.xaas.xxxx.models.product
					10)kbnet.xaas.xxxx.api.cache
					11)kbnet.xaas.xxxx.api.data
					12)kbnet.xaas.xxxx.api.file
					13)kbnet.xaas.xxxx.api.local
					14)kbnet.xaas.xxxx.api.tsdata
			e.其他信息:无

	2.模块项目
		2.1.Core项目
			2.1.1.kbnet.xaas.xxxx.core.mqs
				a.项目简介:消息队列项目,此项目负责接收客户端请求,然后存储到消息队列服务器中,最后程序有序取出处理请求,使程序避免因客户端请求过载崩溃。
				b.项目结构:
					1)Producer文件夹负责将客户端请求转化为消息文本,然后存储到消息队列服务器。
					2)Consumer文件夹负责将消息从消息队列服务器读取,然后转交给下一级项目处理。
					3)MQManager负责消息队列的初始化与管理等任务。
				c.规则规范:
					1)本项目为papi提供消息队列服务,其主要目的是确保在高并发时请求被稳定有序接收和处理,以及服务器不会因请求负载超重造成宕机等严重事故。
					2)消息队列主要采用生产者与消费者模式,每个队列的属性定义与管理需要切合实际。
					3)消息生产者类命名以Producer结尾,且继承BaseProducer类,必须保证队列名称唯一。
					4)消息消费者类命名以Consumer结尾,且继承BaseConsumer类,确保与Producer的一致性。
					5)一定要严格测试“生产者-消息队列服务器-消费者”三者之间消息的连通性与稳定性。
					6)本项目主要使用RabbitMQ作为消息队列服务器。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
						2)RabbitMQ.Client
					2.项目引用:
						1)kbnet.xaas.models
						2)kbnet.xaas.common
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.core.dts
						5)kbnet.xaas.xxxx.core.biz
						6)kbnet.xaas.xxxx.models.inner
						7)kbnet.xaas.xxxx.models.product
						8)kbnet.xaas.xxxx.api.cache
						9)kbnet.xaas.xxxx.api.local
				e.其他信息:
					1)并不是所有API都需要使用消息队列通道,所以切勿滥用,避免增加业务复杂度、运维负担和资源浪费等。
			2.1.2.kbnet.xaas.xxxx.core.dts
				a.项目简介:分布式事务项目,此项目主要针对多个数据库写操作提供保障,避免A库数据已更新,B库或C库数据未更新等问题。分布式事务可以简单理解为“先将多个数据库写操作
							编排顺序,然后按照顺序执行,把执行过程记录下来”,如果顺利执行整个过程则成功,否则可以依据记录执行回滚等操作。
				b.项目结构:无
				c.规则规范:
					1)本项目为papi提供分布式事务服务,对于分布式事务,实际应用中基本都采用两阶段提交与最终一致性方案,所以分布式事务要做的事情,更像是工作流从一个节点到一个节点的流转,最后审批结束。
					2)在功能设计时,一定要合理的设计操作流程与步骤,当请求执行过程中出现错误,让使用者决定取消,还是从出现错误的步骤继续重新执行,坚决规避运维人员和开发人员参与错误处理的情景。
					3)由于存在对错误步骤继续重新执行的需求,所以在设计方法时,应增加一个从第几步开始执行的参数。倘若功能不允许在错误步骤处继续执行则免。
					4)所有项目类均以xxxxDTS形式命名,即以DTS结尾。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.models
						2)kbnet.xaas.common
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.core.biz
						5)kbnet.xaas.xxxx.models.inner
						6)kbnet.xaas.xxxx.models.product
						7)kbnet.xaas.xxxx.api.cache
						8)kbnet.xaas.xxxx.api.local
				e.其他信息:
					1)分布式事务会通常会涉及多个数据库的写操作,因此在设计时,应当尽量避免使用分布式事务的功能,从而降低各个系统的负担与功能设计的难度。
			2.1.3.kbnet.xaas.xxxx.core.biz
				a.项目简介:业务逻辑运算项目,此项目就是实现业务逻辑功能的核心项目,如逻辑运算、数据处理、算法实现、整合数据、聚合分析等。
				b.项目结构:无
				c.规则规范:
					1)所有项目类均以xxxxBIZ形式命名,即以BIZ结尾。
					2)由于针对业务功能编码实现,所以必要代码段一定要写注释说明。
					3)业务功能绝对会改变,因此一定不要过度抽象,且要留出扩展接口。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.models
						2)kbnet.xaas.common
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.core.dcs
						5)kbnet.xaas.xxxx.models.converter
						6)kbnet.xaas.xxxx.models.data
						7)kbnet.xaas.xxxx.models.inner
						8)kbnet.xaas.xxxx.models.product
						9)kbnet.xaas.xxxx.api.cache
						10)kbnet.xaas.xxxx.api.file
						11)kbnet.xaas.xxxx.api.local
				e.其他信息:无
			2.1.4.kbnet.xaas.xxxx.core.dcs
				a.项目简介:分布式计算与存储项目,此项目主要负责将数据存储到目标数据库,以及从目标数据库中读取数据,即按照预先设定义的分布式规则管理数据的读写位置。
				b.项目结构:
					1)Cache文件夹表示缓存服务器的分布式服务。
					2)Data文件夹表示数据服务器的分布式服务。
					3)Tsdata文件夹表示时序数据服务器的分布式服务。
				c.规则规范:
					1)所有项目类均以xxxxDCS形式命名,即以DCS结尾。
					2)由于dapi项目仅负责单个数据库的CURD操作,所以需要在此项目完整分布式运算。
					3)对于读取操作,可能会涉及对多个数据库多次查询,然后将结果汇总后输出。
					4)对于写入操作,主要由dapi项目负责,本项目主要负责读取时的分布式运算。
					5)分布式规则需要缓存到缓存服务器中,拒绝直接从数据库中频繁读取。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.models
						2)kbnet.xaas.common
						3)kbnet.xaas.services
						7)kbnet.xaas.xxxx.models.data
						8)kbnet.xaas.xxxx.models.inner
						9)kbnet.xaas.xxxx.models.product
						10)kbnet.xaas.xxxx.api.cache
						11)kbnet.xaas.xxxx.api.data
						12)kbnet.xaas.xxxx.api.file
						13)kbnet.xaas.xxxx.api.local
						14)kbnet.xaas.xxxx.api.tsdata
				e.其他信息:
					1)分布式计算主要针对大数据量的应用程序,倘若预先知晓应用程序的数据量不大,则可以省去本项目。
		2.2.API项目
			2.2.1.kbnet.xaas.xxxx.api.data
				a.项目简介:数据服务项目,此项目是papi的主要数据来源,也是负责存储papi数据的主要通道。
				b.项目结构:无
				c.规则规范:
					1)此项目中会包含一个及以上dapi项目,因此需要合理的设计目录结构管理,坚决保护dapi项目间的独立性。
					2)在底层kbgress.client接管分布式与负载均衡、微服务等操作,因此要设置好配置文件中的信息。
					3)设计编码时,一定要将业务类和功能类做区分与管理,提升和改进代码,确保高可读性与质量。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.common
						2)kbnet.xaas.models
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.models.data
				e.其他信息:无
			2.2.2.kbnet.xaas.xxxx.api.cache
				a.项目简介:缓存服务项目,此项目主要负责与文件服务器进行交互,实现数据的高速读写。
				b.项目结构:
					1)Memcached文件夹表示使用memcached服务器进行数据的缓存。
					2)Redis文件夹表示使用Redis服务器进行数据的缓存。
					3)MyMemory文件夹表示使用框架自带的集合把数据缓存到服务器内存中。
				c.规则规范:
					1)本项目仅限于为papi提供数据的缓存服务,如果对缓存数据设计的等级较高,不建议直接连接Redis服务器,而是在中间建立专门与Redis服务器通讯的服务程序。
					2)使用MyMemory缓存数据时,数据会随着papi服务的启停而销毁。
					3)设计编码时,一定要将业务类和功能类做区分与管理,提升和改进代码,确保高可读性与质量。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.common
						2)kbnet.xaas.models
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.models.data
				e.其他信息:无
			2.2.3.kbnet.xaas.xxxx.api.file
				a.项目简介:文件服务项目,此项目主要负责与文件服务器进行交互,实现文件的存储。文件指文本、图片、音视频等,文件服务器也是多样化的,比如小文件存储系统、大文件存储系统等。
				b.项目结构:
					1)BigFS文件夹表示负责大文件存储,主要负责与Hadoop通讯。
					2)SmallFS文件夹表示负责小文件存储,常用的小文件系统包括:SeaweedFS\MinIO等。
					3)KbFS文件夹是框架自带文件存储功能,DiskFS主要把文件存储到系统硬盘中,ServerFS与文件存储系统通讯,把文件交给系统管理。
				c.规则规范:
					1)本项目仅限于为papi提供文件读写服务,切勿涉及文件管理与维护的功能代码。
					2)如果需要将文件存储在当前服务器硬盘,请务必做好维护工作,避免无效文件占据有限的硬盘空间。
					3)设计编码时,一定要将业务类和功能类做区分与管理,提升和改进代码,确保高可读性与质量。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.common
						2)kbnet.xaas.models
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.models.data
				e.其他信息:无
			2.2.4.kbnet.xaas.xxxx.api.local
				a.项目简介:本地服务项目,此项目主要负责计算机硬盘里文件的读写与维护,比如Sqlite数据库文件、LiteDB、数据文件、文本文件等。
				b.项目结构:
					1)DataJson文件夹表示负责读写与维护数据为Json格式的文件。
					2)DataSqlite文件夹表示负责读写与维护Sqlite数据库文件。
					3)DataText文件夹表示负责读写与维护数据为纯文本的文件。
					4)...
				c.规则规范:
					1)本项目仅限于为papi提供本地化文件存储服务,因此,每一种类型文件均需在配置文件中,设置读写与维护规则。
					2)本地文件的存储管理,如文件大小、保留时长、删除条件、更新步骤、是否会被误删或覆盖掉、文件存储位置等。
					3)设计编码时,一定要将业务类和功能类做区分与管理,提升和改进代码,确保高可读性与质量。
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
						2)Microsoft.Data.Sqlite
					2.项目引用:
						1)kbnet.xaas.common
						2)kbnet.xaas.models
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.models.data
				e.其他信息:
					1)在.netcore中,使用Microsoft.Data.Sqlite不包含SqliteDataAdapter类,意味着DataSet不可用。倘若想使用可以继续使用旧的System.Data.Sqlite,但是不建议使用。
			2.2.5.kbnet.xaas.xxxx.api.tsdata
				a.项目简介:时序数据服务项目,此项目主要负责时序数据的存储,比如物联网IoT、程序运行数据等按照时间顺序写入不进行更新操作的数据。
				b.项目结构:无
				c.规则规范:无
				d.引用关系:
					1.类库引用:
						1)Newtonsoft.Json
					2.项目引用:
						1)kbnet.xaas.common
						2)kbnet.xaas.models
						3)kbnet.xaas.services
						4)kbnet.xaas.xxxx.models.data
				e.其他信息:
		2.3.Models项目
			2.3.1.kbnet.xaas.xxxx.models.product
				a.项目简介:产品模型项目,此项目定义的模型类,专职负责为可视化程序提供数据服务,即对外输出。
				b.项目结构:无
				c.规则规范:
					1)所有模型类均以xxxxPModel形式命名,即PModel结尾。
					2)模型类应当按照api类别进行分类管理,使api调用者能够直观的理解模型类的定义和使用。
					3)模型类和属性均需注释说明其用意。
					4)属性默认值必须注释解释清楚。
					5)由于产品模型类主要对外输出,因此,切勿定义无用的属性,避免开发人员误解,以及网络传输时带宽的占用。
					6)...
				d.引用关系:
					1.类库引用:无
					2.项目引用:
						1)kbnet.xaas.models
				e.其他信息:
					1.因为papi是以产品的概念对外提供服务,所以产品模型类的定义与管理也要遵从产品的概念。
			2.3.2.kbnet.xaas.xxxx.models.data
				a.项目简介:数据模型项目,此项目定义的模型类,严格意义上不允许对外输出,避免数据库表字段名称泄露,在实际开发中可按照安全等级自行抉择。
				b.项目结构:
					1)Cache文件夹定义缓存服务数据模型类。
					2)File文件夹定义文件服务数据模型类。
					3)Local文件夹定义本地服务数据模型类。
					4)Dms文件夹定义数据服务的模型类。
					5)...
				c.规则规范:
					1)所有模型类均以xxxxDModel形式命名,即DModel结尾。
					2)data服务项目需要定义数据模型类,必须按照data服务项目的子项目命名,并在Dms文件夹里新建子项目文件夹,然后在子项目文件夹中定义子项目的模型类。
					3)模型类和属性均需注释说明其用意。
					4)属性默认值必须注释解释清楚。
					5)项目以文件夹方式将数据模型类分割管理,目的是为了清晰化目录结构,因此,切勿在项目内部跨文件夹相互引用。
					6)Dms文件夹中的数据模型类需继承自kbnet.xaas.models项目的DataBaseModel类。
				d.引用关系:
					1.类库引用:无
					2.项目引用:
						1)kbnet.xaas.models
				e.其他信息:
					1.data不仅仅表示dapi,而是表示与dapi同等级的多个服务系统。
			2.3.3.kbnet.xaas.xxxx.models.inner
				a.项目简介:自用模型项目,此项目定义的模型类,仅作用于papi项目内部使用,不允许对外输出。
				b.项目结构:
					1)Cache文件夹定义缓存服务内部模型类。
					2)Common文件夹定义通用内部模型类。
					3)Data文件夹定义数据服务内部模型类。
					4)File文件夹定义文件服务内部模型类。
					5)Local文件夹定义本地服务内部模型类。
					6)...
				c.规则规范:
					1)所有模型类均以xxxxIModel形式命名,即IModel结尾。
					2)不同项目间的模型类存放在自己的文件夹中,原则上不允许在项目A调用项目B的模型类,实际操作中按照项目的规模、复杂度和难度自行掌控。
					3)模型类和属性均需注释说明其用意。
					4)属性默认值必须注释解释清楚。
					5)所有模型类需继承自kbnet.xaas.models项目的BaseModel类。
				d.引用关系:
					1.类库引用:无
					2.项目引用:
						1)kbnet.xaas.models
				e.其他信息:无
			2.3.4.kbnet.xaas.xxxx.models.converter
				a.项目简介:模型转换器项目,负责模型类对象转换,为了各项目保持代码的纯粹性和可读性、可复用性、可维护性,不允许在core和api项目中编写模型对象转换代码,尤其在项目biz中。
				b.项目结构:
				c.规则规范:
					1)类命名:xxxxConverter。
					2)方法命名:inner转换为data,xxxx_IM2DM()。data转换为inner,xxxx_DM2IM()。
					3)方法命名:inner转换为product,xxxx_IM2PM()。product转换为inner,xxxx_PM2IM()。
					4)方法命名:data转换为product,xxxx_DM2PM()。product转换为data,xxxx_PM2DM()。
					5)方法命名:倘若模型转换的是集合(如List,Dictionary等),方法名表示为xxxx_XX2XX_List()。
					6)转换操作:在转换前,必须做非空判断,避免出现空指针异常。
					7)data模型转换说明,由于data项目包含所有api项目的模型,所以DM可能会演变为CDM\DDM\FDM\LDM等,其中DDM也会因api项目的拆分再次演变M(ain)DDM、KB(kbgress)DDM等。
				d.引用关系:
					1.类库引用:无
					2.项目引用:
						1)kbnet.xaas.models
						2)kbnet.xaas.common
						3)kbnet.xaas.xxxx.models.data
						4)kbnet.xaas.xxxx.models.inner
						5)kbnet.xaas.xxxx.models.product
				e.其他信息:无

	3.供应商项目
		3.1.kbnet.xaas.providers.login
			a.项目简介:第三方集成登录服务,主要管理系统账号与第三方账号集成和登录操作,比如微信\支付宝等。
			b.项目结构:无
			c.规则规范:
				1)第三方服务,一定要严格控制项目代码与使用规范。
				2)一定要注意类库代码的更新升级,避免引发安全问题。
				3)一定在使用时保持业务逻辑独立性,防范因第三方服务造成业务逻辑执行混乱。
				4)尽可能保证“在模块的api项目和core项目中不调用此类服务”,将此类服务的调用置于可视化项目中。
				5)以供应商为主建立目录限定范围,不允许对多个供应商进行再抽象设计和编码。
				6)第三方服务,本身就具备不可用风险,所以一定要提前准备应对之策。
			d.引用关系:
				1.类库引用:无
				2.项目引用:无
			e.其他信息:无
		3.2.kbnet.xaas.providers.payment
			a.项目简介:第三方在线支付服务,主要提供第三方在线支付功能,比如wechatpay\alipay等。
			b.项目结构:无
			c.规则规范:
				1)第三方服务,一定要严格控制项目代码与使用规范。
				2)一定要注意类库代码的更新升级,避免引发安全问题。
				3)一定在使用时保持业务逻辑独立性,防范因第三方服务造成业务逻辑执行混乱。
				4)尽可能保证“在模块的api项目和core项目中不调用此类服务”,将此类服务的调用置于可视化项目中。
				5)以供应商为主建立目录限定范围,不允许对多个供应商进行再抽象设计和编码。
				6)第三方服务,本身就具备不可用风险,所以一定要提前准备应对之策。
			d.引用关系:
				1.类库引用:无
				2.项目引用:无
			e.其他信息:无


三、配置规则
	1.说明信息:
		配置规则需要通过kbgress.web设置和定义好,然后下载到本地,或配置好绑定关系,程序在启动时从kbgress直接读取。
	2.规则类别:
		2.1.系统信息
			a.系统所属产品ID:xxxxxxxxxxxxxxxx。
			b.系统所属程序ID:xxxxxxxxxxxxxxxx。
			c.系统所属线路ID:xxxxxxxxxxxxxxxx。
			c.系统ID:xxxxxxxxxxxxxxxx。
			d.系统版本:v1.0.0。
			e.系统状态:可用、不可用/升级中、等待升级。
		2.2.安全权限
			a.令牌信息
			b.权限信息
			c.IP信息
			d.脚本攻击:xss或csrf等。
		2.3.日志信息
			a.是否上传云端:0或1。
			b.上传云端频率:1次/秒。
		2.4.消息信息
		2.5.缓存信息
		2.6.Data信息
		2.7.文件信息
		2.8.本地信息
		2.9.服务信息
			a.状态:
				1.心跳:频率(5s)。
			b.流量:
				1.app信息:
					a)最大允许连接数:5000。
					b)最大连接数:0。
					c)拒绝连接数:0。
					d)当前连接数:0。
				2.api信息:
					a)最大时耗(毫秒):以天为单位。
					b)最小时耗(毫秒):以天为单位。
					c)请求数量(10分钟):以10分钟为单位。
					d)流量上限(0表示不限流量,次数/每秒):0。
					e)最大流量(分钟):
					f)拒绝次数(分钟):
					g)重试次数(0-3):调用链路中api时。
					h)是否熔断(0或1):被调用服务或api故障时。
		2.10.消息队列
			a.是否启用:启用消息队列,请求超载时,系统不再拒绝合法请求。
			b.主题信息:
				1.有效时间:秒,10s。
				2.并发数量:读取数量/每秒,500。
		2.11.DTS信息
		2.12.DCS信息
			a.依据业务对象ID按照粒度和时间定义的规则,执行分布式运算。
		2.13.硬件信息
			a.操作系统:xxxxxxxxxxxxxxx。
			b.内存容量:xxxxxxxxxxxxxxx。
			c.硬盘信息:xxxxxxxxxxxxxxx。
			d.CPU信息:xxxxxxxxxxxxxxx。
			e.网络信息:xxxxxxxxxxxxxxx。


四、编码规范
	1.编码流程:
		a.主流程:是指程序对关系型数据库(Oracle\MSSQL\MySql\Postgresql等)的操作。
			1.kbnet.xaas.papi:此项目是程序的启动项目,定义了外界可以调用访问的WebApi方法。
			2.kbnet.xaas.xxxx.core.dts:分布式事务处理项目,如若实际功能不存在分布式事务需求,可以跳过本项目,直接调用biz项目的方法。
			3.kbnet.xaas.xxxx.core.biz:业务处理项目,本项目是业务数据与逻辑处理的核心项目。
			4.kbnet.xaas.xxxx.core.dcs:分布式存储与计算项目,主要按照分库分表技术定义方案执行数据的存储、查询与聚合。
			5.kbnet.xaas.xxxx.api.data:负责与dapi等程序交互数据。
		b.辅流程:
			1.缓存流程:是指程序从缓存数据库(Memcached\Redis等)中读写数据。
				a)缓存主指kbnet.xaas.xxxx.api.cache项目。
				b)mqs\dts\biz\dcs项目都可以调用本项目公开的方法。
			2.文件流程:是指程序从文件数据库中(大文件存储、小文件存储)读写数据。
				a)文件主指kbnet.xaas.xxxx.api.file项目。
				b)因时间推移增长,dts和biz不直接调用本项目公开的方法,所以需要dcs项目桥接。
			3.本地流程:是指程序从本地数据库(Sqlite)或文件中读写数据。
				a)本地主指kbnet.xaas.xxxx.api.local项目。
				b)mqs\dts\biz\dcs项目都可以调用本项目公开的方法。
		c.消息队列:启用消息队列,papi调用mqs项目的方法,把请求发送到消息队列服务器,不直接调用dts或biz项目的方法。
			1.Producer:发送请求到消息队列服务器。
				a)kbnet.xaas.papi:接收请求。
				b)kbnet.xaas.xxxx.core.mqs:发送请求。
				c)消息队列服务器:接收存储。
			2.Consumer:从消息队列服务器读取请求。
				a)kbnet.xaas.papi:启动服务。
				b)kbnet.xaas.xxxx.core.mqs:读取请求。
				c)kbnet.xaas.xxxx.core.dts:同上。
				d)kbnet.xaas.xxxx.core.biz:同上。
				e)kbnet.xaas.xxxx.core.dcs:同上。
				f)kbnet.xaas.xxxx.api.data:同上。
	2.编码规范:
		由于各团队有自己的编码规范,所以此处便不公开了。
	3.测试流程:
		a.测试分为单元测试和案例测试,前者主要对单个功能进行测试,后者模拟现实业务操作进行测试。
		b.按照项目类别将测试对象分为三类,第一类用户案例测试,第二类api\mqs\dts\biz\dcs项目方法的测试,第三类cache\data\file\local\tsdata项目方法的测试。
		c.在所有测试项目中,api和biz项目测试是必须执行的,其他项目按实际需要自行决定。
		d....
	4.测试规范:
		a.所有成员都必须按照规定对自己编写的代码测试,经验证明几乎没有程序员可以编写出零BUG的方法代码。
		b.测试不仅是对自己编写的代码负责,也是对协同开发的成员负责。
		c.凡是因未测试引发的问题,皆由自己负责。
		d....
	5.发布部署:
		a.部署方式:依据实际情况,程序分为两种部署方式。
					第一种方式,单线路环境,暂停对外提供服务,更新部署程序,影响使用。
					第二种方式,多线路环境,对半暂停线路,一半一半的更新程序,不影响使用(无感更新)。
	6.常用单词:
		1)查询:select\get\find\query
		2)增加:insert\add\new\create
		3)更新:update\modify\edit
		4)删除:delete\remove
		5)对象:info,item\items,list,all
		6)条件:id,code,name,isDelete,isActive,isVisible,typeId,parentId,ownerId,userId\memberId,companyId
		7)时间:date,time,year\month\day,hour\minute\seconds,milliseconds
		8)分页:page\pages,count,index,num\no,size,total
		9)表格:table\row\column\cell
		10)集合:first\last,previous\current\next,above\below,before\after,exist,contains,max\min,sum,average,top,sort,asc\desc
		11)库表:master\slave,sync\async,lock\unlock,isInit,isMain,versionNo
		12)仓库:level层级,dimension维度,granularity粒度,measure度量\metric指标(特殊的度量),scale尺度(度量单位),field字段,caliber口径
		13)词对:start\stop,key\value,upload\download,import\export,encode\decode,encrypt/decrypt,split\join,go\back
		14)比较:+Plus,-Minus,*Multiply,/Divide,%Mod,=Equal,!=NotEqual,>GreatThan,>=GreatOrEqual,<LessThan,<=LessOrEqual,&BinAnd,|BinOr,^BinXor,<<BinShiftLeft,>>BinShiftRight
		15)其他:save,build,batch,copy,set,valid,gen(erate),parse,by,or,in,cut,result

		
五、注意事项
	1.三方服务:严禁擅自引用第三方服务的行为,尤其是在线服务,不论是商业、开源、或其他形式的服务,避免造成程序和产品的依赖性、稳定性、不可控性等风险和问题。
	2.自律习惯:软件产品或项目以更好的服务用户和客户为宗旨,因此,严禁在开发中以锻炼自己技术的思想和行为编写不可控或效率低劣的代码。
	3.自律习惯:团队成员需按照解决方案类型的程序架构进行设计与编码,不可以自我主观意念破坏编码流程与规范。
	4.成本警钟:由于软件设计研发是一门纯脑力劳动,所以一定要时不时的给自己敲一下警钟,测算一下时间周期、团队规模、成员能力等各方面的成本,坚决要避免一根筋的苦思冥想钻牛角尖。
	5....


六、总结
	本文既是对解决方案的介绍,也是编程规范的定义。然而上述内容并不是完全不变的,在实战过程中,如遇到特殊场景,需要与规则制定者或架构师商议,更改或制定合适的规则规范。
	依照上述内容便可完成PAPI项目中功能的设计、开发、测试、发布等工作。

 

四、总结

对于我这只具备十多年研发经验的程序员老鸟来说,编写程序代码已经不能给我带来激动和成就感,反而设计程序架构、编制技术标准更感兴趣。风卷残云,白驹过隙,接下来这段时间里,我会继续一边休养生息,一边把kbnet.xaas.dapi程序架构弄出来。

 

posted @ 2024-01-09 12:14  oO归客Oo  阅读(17)  评论(0编辑  收藏  举报