草庐IT

PowerDotNet平台化软件架构设计与实现系列(01):基础数据平台

努力,天赋,笑容,自信 2023-03-28 原文

本系列我将主要通过图片和少许文字讲解通过个人自研的PowerDotNet进行快速开发平台化软件产品。

PowerDotNet不仅仅是包含像Newtonsoft.Json、Dapper、Quartz、Redis、ZooKeeper、ElasticSearch、ETCD、Autofac、JWT、MyBatis、EF、RabbitMQ、ObjectPool、Hessian、Thrift、gRPC、SuperSocket等流行的类库和组件,像ABP、SpringBoot之类的开发框架套件和工具,它还是一整套完善的前后端(支持传统BS和CS结构,也支持H5和APP)快速开发和简易运维解决方案。它的最大优势是深刻理解了一线平台开发和业务开发人员的核心诉求,在此基础上进行提取和抽象,并且实现了公共组件核心功能开发,提供了良好的操作UI界面,对开发和运维人员非常友好。

PowerDotNet致力于系统应用开发服务化、平台化、自动化和产品化,到目前为止已成功开发出服务治理、配置中心、监控管理、任务调度、CRM、应用和系统管理、集群管理、服务器管理、域名管理、数据同步、日志管理、文件管理、消息管理、支付平台、财务平台等公共服务产品,开箱即用。整个代码实现都朝着“简单高效”、“高内聚”、“低耦合”、“兼具功能和性能”、“优雅漂亮有品位”的方向努力,所有核心逻辑都有单元测试覆盖 ,不拘泥于语法糖和框架,务实不炫技,面向接口编程 ,可扩展性非常强。

PowerDotNet是我个人多年软件开发实践和架构设计经验的汇总,很多都经过生产环境的考验,我认为还是相当靠谱的,敝帚自珍,与同道中人分享,不亦乐乎。

第一篇从最简单的基础数据平台开始说起。

一、需求来源

现代软件基本离不开各种各样的基础数据。比如全局都可以使用的区域、证件类型、二字码、三字码、通用字典等数据;和业务有点关联的公司、组织、级别等数据;和业务紧密关联的业务基础数据,如商品主数据等。

对这些数据的管理,是非常费力不讨好的事情,因为很多人,主要就是各种高大上的管理人士,认为这些对提升业务没啥价值。

但是,设计和管理不好,后期又会造成开发难题。很多公司基础数据散布在各种子系统中,连保证数据的基本正确统一都做不到,所以必须重视这些基础但是看上去没啥技术含量的东西。

二、系统抽象

平台,可以理解为一个完备的业务系统,而系统由单个或多个应用(独立进程)构成。

本文不讨论系统和应用的关系,只按照自己的正常理解来开发业务系统。

具体到基础数据平台的开发,业务功能看上去比较简单,主要就是数据的CRUD而已。

按照正常需求理解,我们可以肯定至少需要开发两个应用:

1、带界面的管理后台

2、不带界面的对外开放的接口

不需要复杂冗余的架构设计,简易分层架构如下(截图只是冰山一角,实际项目比这复杂多了):

三、管理后台

具体CRUD实现就不看了,本文技术选型为Asp.Net MVC,看几个截图就好。

1、区域管理

区域管理支持大洲、国家或地区、省、市、区县、乡镇或街道、社区或居委会或村委会这几级,满足了大部分公司常见的区域功能需求。

 2、IP地址

3、证件类型

4、通用字典

四、WebApi接口

接口也好说,简单定义几个查询接口,集成流行的Swagger。

有人可能会说,你这个WebApi接口命名很不讲究,不规范,应该多用名词少用动词,应该注意区分GET、POST、PUT、DELETE等方法,还要注意缓存blablabla。

本文不讲WebApi命名,后续文章将介绍服务治理,到时候你会发现WebApi起名真的不重要,服务治理平台彻底解决REST API命名难题,开发人员只需要关心业务逻辑实现就好。

WebApi还可以开发成使用OWIN或者其他非IIS形式的宿主,截图里WinService目录使用的是Windows服务实现webapi宿主。下面示例截图是WinForm宿主的WebApi:

注意,真正的基础数据平台功能比这个复杂太多太多了,单纯一个业务主数据就够喝一壶的,本文截图只做讲解用。

五、其他RPC协议接口

在.NET开发框架下,我们基本都会熟练写出基于HTTP协议的WebApi、WebService、WCF甚至上古时期的.NET Remoting接口,以及个人实现的RPC项目Power.Apix,咩哈哈。

随着.NET Core的大流行,很多其他RPC协议的接口被广泛使用,如Hessian、Thrift、gRPC等。

PowerDotNet自动集成了Hessian、Thrift、gRPC协议的接口解决方案,实现起来几个模板类就可以搞定。

PowerDotNet让不同协议的接口开发变得无比简单易用。配合后续要讲到的服务治理,你就知道PowerDotNet的优秀设计与实现是多么的富有创新,咩哈哈哈,有点过分自信了。

本文重点不是讲这些协议如何集成,后续有时间再说。

六、.NET Core实现

.Net Core已经越来越成为.Net开发者的首选开发平台,作为资深开发人员,当然更要积极拥抱.Net Core。虽然PowerDotNet积累的历史比较久远,但是在.Net Core1.0时代就有一个.NET Core实现计划PowerDotNetCore,目前主要实现是基于.NET Core2.0,正在开发完善当中。

实现WebApi接口或者管理后台页面非常轻松。

后续有机会再介绍PowerDotNetCore。

七、提取可复用功能

除了WebApi,我们还可以开发其他形式的API服务,比如WCF、WebService、.Net Remoting、Thrift、gRPC等。

开发不同形式的应用时,我们发现,还可以抽象出应用(进程)上公共的可复用的部分。比如,这些应用都需要连接数据库,都需要读取配置文件,都需要部署至测试、生产等环境,以及无处不在的日志记录等。

那么这些应用上公共可复用的部分是否能够抽象出来,供更多的应用开发复用?答案是显而易见的。

PowerDotNet在复用公共功能、可维护性、可扩展性上有更高级别的抽象。

下面几篇文章将介绍PowerDotNet实现的应用可高度复用的模块和组件,这些模块和组件将独立设计成为公共服务系统。

有关PowerDotNet平台化软件架构设计与实现系列(01):基础数据平台的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  6. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  9. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  10. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

随机推荐