技术框架篇--第4篇

用日志记录“开源软件”的诞生

赤龙ERP开源地址:

点亮星标,感谢支持,加微信与开发者交流 kzca2000

码云:https://gitee.com/redragon/redragon-erp

GitHub:https://github.com/redragon1985/redragon-erp

准备工作

搭建基础框架前,一定要准备好开发环境。先安装软件(以我本地环境为例),包括:

  • IDE(Eclipse最新版)
  • JDK1.8
  • Tomcat8.5
  • MySQL8.0
  • Redis最新版
  • SVN、Git

安装流程不做详细说明。说几个需要注意的地方:

(1)Tomcat安装好后需要对server.xml做一些配置和优化(端口、应用、域名、NIO、线程池、SSL等)

(2)对JVM做必要的内存配置优化

(3)MySQL安装时注意编码UTF-8

(4)Redis需要配置密码和持久化(AOF)

框架的基本要求

搭建应用的底层框架,总是要或多或少的根据情景考虑一些问题,而不能是框架和技术的简单堆砌。那么搭建框架要满足哪些要求呢?

(1)安全性:由于是信息化管理系统,使用的用户是企业内部的职员和高管,那么对于安全性和权限的考虑就要提升一个层次了。比如:谁能访问哪些功能、谁能做哪些操作,谁能看到什么数据、又使用什么方式可以更便捷的实现各种安全性的考虑。

(2)降低信息流的复杂性:简单解释一下,ERP系统是一个很特殊的系统,因为它是企业中复杂管理流程、业务流程、财务流程的实现。所以它有着严密的逻辑与流程,系统中几乎没有独立的模块或功能,系统内部各部分互相依赖的复杂程度难以想象。如何降低这些依赖关系的复杂度,就是框架中迫不及待解决的问题。

(3)提高开发效率:信息化系统开发时的一大特点就是代码复用程度高,无论是重复的增删改查,还是表单处理,设置是各种报表,太多的重复工作会浪费太多的时间。开发人员应该把工作集中在逻辑和算法上面,而不是这些简单的复制粘贴修改上。

(4)灵活的可配置可扩展:信息化系统的另一个特色就是个性化需求非常高,即使对于一个简单的流程,也可能出现多样化的各种要求。这往往根据企业的管理情况而定。如何竭尽所能在减少客户化开发的前提下,满足更多的需求是我们要考虑的问题。

(5)降低学习成本和维护成本:由于这是一款开源软件,我们要考虑的不能仅仅是高大上的技术使用,而是要能让更多的开发者和使用者,可以快速部署,并进行个性化开发。无论在展示层、控制层、持久层,还是在各第三方组件的使用中都要尽量考虑到如何让更多的人可以使用我们的软件。

如何解决问题

针对以上的要求,我们如何设计系统,解决问题,并最终搭建满足我们需求的底层框架呢?我们一起来尝试摸索一下。

  1. 说到安全性,就离不开登陆、权限、加密这些场景。
    (1)登陆我使用了cas,它是一个SSO框架,采用票据验证机制保证了,认证的安全。
    (2)授权我采用了shiro框架与cas无缝整合,根据三类权限的设置,保证了菜单、按钮、数据的精细控制
    (3)加密包括对HTTP头的加密(SSL),对关键业务数据的加密(AES、SHA1)
  2. 降低信息流的复杂性,最核心的是如何梳理,如何切分业务,模块之间如何互相调用。
    (1)梳理和切分业务其实更多的是经验问题,但有个通用的大原则,高内聚;也就是把关联性极高的功能放在一起,而对外暴露必要的接口供调用即可。其中还要考虑到一些基础数据的通用化设计。比如:组织信息、职员信息、主数据、数据字典等,单独设计并对外提供有双层缓存的接口。(其中也要考虑到缓存的更新策略)
    (2)模块间我用Maven父子项目做了划分,也为直接的接口调用和REST风格的API调用做了不同方式的设计
  3. 如何提高开发效率,应该是我们认真思考的话题。因为这真的很重要。如果处理得当甚至会节省30%-40%的研发时间。
    (1)代码自动生成工具:我研发了一套可以自动生成Controller、Service、Dao、Model以及所有配置及注解的工具。当前这是基于我指定的代码规范。只需要修改两到三个配置项,即可一键在项目下生成我们所需的代码。本来至少要编写半小时的代码,现在只需要10秒钟。
    (2)可复用的工具包:十几年积累的所有工具类可提供快速的静态调用方式
    (3)抽丝剥茧,独立的功能设计:很多常用的第三方组件或技术的处理方式,抽象出来,加以复用。比如:线程、Redis、JMS、Socket、Json、Groovy、Mongo等。
    (4)多功能的AOP处理:基本思路是通过AOP及自定义注解灵活加入各种辅助处理功能。比如:方法缓存、自动set基础字段值、日志处理、数据权限控制等。
    (5)必要的通用功能:通过Spring提供的技术,实现异常处理、类型转换、数据验证、API请求拦截等各种处理要求。
  4. 可配置可扩展其实说起来简单做起来难。可能很多软件都是这么宣传的,但真正做到的并不多。其实我认为主要做到如下几点就可以了:
    (1)字段的可扩展,即可以通过配置的方式增加辅助字段,并且能实现1对1结构,和1对多结构的两种方式。
    (2)流程的灵活处理。软件往往设计上会固定某一主流程,只要设计上让这一流程的组织不固定,而相对松散的实现即可。
    (3)功能性模块的高度可配:比如权限系统、报表系统、工作流、数据字典
  5. 最后一个是有关降低学习成本和维护成本的问题。我觉得这更多是因为要匹配开源的要求,开源的使用者多数是个人或小团体,这对于普及一款开源产品显得尤为重要。怎么做呢?
    (1)用最普及的技术、最少的技术种类、实现更多的需求。
    (2)提供最简单的配置文档以实现程序部署。

对未来的考虑

为了考虑单体需求的激增,不得不应对高并发以及高可用的情景。所以现在技术选择以及底层搭建时就一定要有所考量。当前框架一定要可以快速引入新技术并可以高效整合。我认为Springboot一定是Java语言当下是最优的选择,也为SpringCloud的升级做了足够准备。

当然其中还有很多要考虑的内容,比如:负载均衡、消息队列、数据总线、读写分离、异步并发、降级限流等。在此不展开讨论,如果有兴趣可与开发者直接沟通。

后记

今天的日志写的比较长,但还没有包括很多中间件的优化和配置说明,为了给开源软件的使用者简化他们的部署工作,我会在后面附加一个技术补充文章。

希望您读完本文可以帮助笔者进入【码云】或【GitHub】点点星标。感谢大家的支持!

SpringBoot2搭建基础架构——开源软件诞生4的更多相关文章

  1. 工作流引擎Activiti与SpringBoot2整合--开源软件诞生17

    开源ERP技术整合系列--第17篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...

  2. JAVA开源软件的技术选型--开源软件诞生2

    技术准备--第2篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址,点亮星标,支持一下,万分感谢 码云:https://gitee.com/redragon/redragon-erp github: ...

  3. ERP与EHR系统的恩怨纠葛--开源软件诞生13

    ERP中需要EHR的存在吗--第13篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon ...

  4. ERP订单管理的操作与设计--开源软件诞生19

    赤龙ERP订单模块讲解--第19篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon/r ...

  5. ERP收付款的操作与设计--开源软件诞生22

    赤龙ERP收款付款讲解--第22篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...

  6. ERP的财务凭证的操作与设计--开源软件诞生23

    赤龙ERP财务凭证讲解--第23篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...

  7. ERP中HR模块的操作与设计--开源软件诞生26

    赤龙ERP的EHR功能讲解--第26篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/red ...

  8. ERP制造模块操作与设计--开源软件诞生30

    赤龙ERP制造模块讲解--第30篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...

  9. 为什么要做一款ERP软件——开源软件诞生7

    技术之外的探讨--第7篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址: 点亮星标,感谢支持,与开发者交流 kzca2000 码云:https://gitee.com/redragon/redra ...

随机推荐

  1. PHP curl_share_setopt函数

    (PHP 5 >= 5.5.0) curl_share_setopt — 设置 cURL 共享句柄的一个选项. 说明 bool curl_share_setopt ( resource $sh ...

  2. 读书笔记《数据结构与算法JavaScript描述》第一章

    第一章JavaScript的编程环境和模型 1.2JavaScript编程实践 1.2.1 声明和初始化变量 JavaScript中的变量默认为全局变量,如果初始化未被声明的变量,该变量就成了一个全局 ...

  3. luogu P5410 模板 扩展 KMP Z函数 模板

    LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...

  4. CPU监控 线段树裸题

    LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...

  5. Vuex详细教程

    1.认识Vuex 1.1Vuex是做什么的 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的 ...

  6. linux的文件处理(匹配 正则表达式 egrep awk sed)和系统、核心数据备份

    文件处理 1.处理方式 匹配 正则表达式 egrep awk sed 2.文件中的处理字符 \n  新行符 换行 \t  制表符 tab键 缺省8个空格 \b  退格符 backspace键 退格键 ...

  7. Docker入坑指南之EXEC

    容器启动之后,如果我们需要进入容器内修改配置,比如mysql修改启动配置 我们启动的附加参数是不是shell,这个时候就可以用docker exec了,docker除了对image参数以外,大部分命令 ...

  8. asp.net 远程模型验证

    有这样一些场景,我们需要模型验证,某些字段不允许重复,但是又不希望在数据访问层增加一堆额外逻辑判断.我们需要数据访问层简洁,这种模型验证在进去Action之前,验证不通过直接告诉前端. 一个特性,继承 ...

  9. 双下划线开头的attr方法

    # class Foo: # x=1 # def __init__(self,y): # self.y=y # # def __getattr__(self, item): # print('执行__ ...

  10. 安装Scrapy的时候报错error: Microsoft Visual C++ 14.0 is required.

    error: Microsoft Visual C++ 14.0 is required. 问题:我在python安装Scrapy的时候发现报错,并安装不上. 解决思路:安装这个微软的库,但是这个库很 ...