精华内容
下载资源
问答
  • 代码架构
    千次阅读
    2022-02-21 16:03:05

            后台反馈,有不少朋友对JEPaaS低代码快速开发技术架构比较感兴趣,今天我就发文解释下我们JEPaaS低代码快速开发平台

    下图是我们JEPaaS平台的架构

            JEPaaS平台采用四层架构设计,分别是存储层、平台层、服务层、运营层。

            整个PaaS体系可以基于公有云(阿里云、腾讯云、华为云)部署,也可采用私有云部署,在网络条件允许的情况下,也可采用较为复杂的混合云部署。

    存储层:

            基于硬件完成结构化数据或非结构化数据的存储,支持关系型数据库Orcacle、SqlServer、MySQL,以及非关系型数据库 Momgo DB、Redis,并且支持国产数据库如SequoiaDB。为了提高SaaS环境下的租户数据的保密性和高可用性,我们通过“数据源引擎”为每个租户开辟了一个专属的数据库空间。

    平台层:

            整个平台层是JEPaaS产品的基石,平台层完成元数据的设计及结构关系的创建,完成数据的拉取及表格、表单、图形的展示,完成菜单的设计、角色的创建、权限的分配等。客户通用平台层提供的各种拖拽式、点选式的工具,即可轻松完成低代码应用的搭建工作。

    服务层:

            应用系统能否快速的搭建靠的是平台层的工具支撑,但是否可以SaaS化实现多租户运营模式靠的是服务层的支撑。平台把统一调度(JOB)、及时通讯(IM)、统一工作流配置(WF)等全部进行服务分离,最终完成平台在统一多租户(SaaS)服务的功能实现。

    运营层:

            运营层的核心服务是帮助用户对已完成的SaaS产品进行划分、软件商店上架、租户戏份权限划分、监控租户的注册量、使用频度、计算出留存率等。并提供代金券、优惠券等多种运营机制通过渠道商管理功能实现渠道商的分成与任务完成情况监控工作。

            技术是为了业务服务的,了解了业务后,我们再来我们的技术框架图。

    下图是我们JEPaaS平台的技术架构图

    JEPaaS是以快速开发为中心

            支持多种操作系统,多种数据库,屏蔽底层技术开发成本,降低企业信息化实施风险。

    JEPaaS提供了多种引擎,用户根据配置即可实现业务功能的快速定制及拓展。

    •         提供了多种引擎,屏蔽了底层开发的成本。
    •         提供了众多插件,并且不断完善,降低企业的集成成本。
    •         提供了多种数据库支持,已完成中标麒麟OS认证

    JEPaaS经过多个版本迭代,形成了自主的核心引擎,主要有:

    •         资源表引擎
    •         功能引擎
    •         数据字典引擎
    •         图报表引擎
    •         门户引擎
    •         调度引擎
    •         流程引擎
    •         APP引擎

    JEPaaS经过多个版本迭代,支持了众多的第三方插件,主要有:

    •         微信公众号管理
    •         微信企业号管理
    •         钉钉第三方集成
    •         短信集成
    •         IM即时通讯
    •         第三方数据源
    •         PageOffice
    •         邮箱
    •         个推

    JEPaaS经过多个版本迭代,支持多种数据库厂商,主要有:

    •         MySQL
    •         SQLServer
    •         Oracle
    •         PostgreSQL
    •         人大金仓
    •         神通数据库

    JEPaaS经过多个版本迭代,支持多种操作系统,主要有:

    •         Windows
    •         Linux(Redhat、Centos)
    •         中标麒麟OS

    JEPaaS应用

            采用前后端分离技术架构,使用Token进行用户统一认证。实现了多种引擎,提供可视化、脚本化的开发环境,用户可以快速实现业务功能。

    前端技术栈

    •         JS框架:jQuery、Vue
    •         UI框架:ElementUI
    •         富文本编辑:UEditor
    •         代码编辑器:monacoEditor
    •         Socket通讯:Socket.IO、WebSocket
    •         图表组件:EChart
    •         打印组件:Lodop
    •         APP JS框架:MUI、H5+、Vue
    •         APP UI框架:MUI、ElementUI
    •         Office组件:pageoffice

    后端技术栈

    •         核心框架:Spring Framework
    •         安全框架:Spring security
    •         视图框架:Spring MVC
    •         任务调度:Spring Task
    •         缓存框架:Ehcache、Redis
    •         日志管理:SLF4J、Logback
    •         持久层框架:自主研发JEDB
    •         服务端验证:Hibernate Validator
    •         工作流引擎:JBPM
    •         数据库连接:ALibaba Druid

    JEAPP移动应用

            JEPaaS提供了在线的App开发工具,使用配置方式可以快速开发出APP的多种功能,目前支持H5、Android、iOS。

    即时通讯/推送

            JEIM是一个基于Netty实现的稳定高效的即时通讯服务,支持多种类型的信息沟通与用户和社群管理,轻松建立实时的传播矩阵,保证了信息交流的顺畅和安全。

    企业网盘

            JE网盘服务是基于JEPaaS拓展的企业级网盘服务,用户可以基于此服务快速拓展私有存储,支持阿里云、七牛云。

    API网关

            JEGateway是一个基于OpenResty的API Gateway,提供API及自动移规则的监控和管理,如访问统计、流量切分、API重定向 、APi鉴权、WEB防火墙等功能,用户可以基于Lua脚本拓展及自定义插件。

    更多相关内容
  • android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程.pdfandroid蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程.pdfandroid蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程.pdfandroid蓝牙介绍二蓝牙代码架构及其uart ...
  • 业务快速交付低代码架构演进.pdf
  • DDD之代码架构

    千次阅读 2020-10-23 08:30:00
    其实那个时候也在陆续写文章,DDD第四篇想写战术模式方面的文章,尤其是代码架构。但一直觉得自己这方面还需要再学习修炼一下。且之前在项目上实践DDD,落地到代码上还是遇到了一些问题的,我也在思考怎样才能更好地...

    点击↑上方↑蓝色“编了个程”关注我~

    每周至少一篇原创文章

    这是本公众号的第 33 篇原创文章

    荒腔走板

    这是一篇迟到的文章。这其实是我写DDD的第四篇文章。去年11月份左右我在个人网站上写了三篇关于DDD的文章,都是比较偏战略部分的。那个时候我还在一个正在使用DDD的项目上,也是我第一次真正开始深入使用DDD。

    DDD的前3篇文章

    后来有收到读者催更的留言。其实那个时候也在陆续写文章,DDD第四篇想写战术模式方面的文章,尤其是代码架构。但一直觉得自己这方面还需要再学习修炼一下。且之前在项目上实践DDD,落地到代码上还是遇到了一些问题的,我也在思考怎样才能更好地让DDD在代码层面落地。

    本文适合于对DDD战术模式有一定了解的读者。

    从复杂性谈起

    要聊架构问题,其实要先明白架构想要解决的是什么问题。我认为代码架构主要解决的是两个问题:程序的复杂性和编程的复杂性。

    依赖混乱导致了程序复杂

    程序的复杂性,指的是程序里分层或抽象不清晰,导致依赖关系比较乱。这里的“依赖”其实可以比较简单地理解为,A使用了B。如果删除了B,A就不能继续正常工作了。AB可以指的是类、模块、分层等概念。

    经过了很长一段时间的发展,现在软件界已经能够总结出一些比较好的设计模式、分层架构、甚至是基于maven/gradle等构件工具的模块化、代码分包、甚至是微服务拆分等手段,来尽量减少彼此之间的依赖,架构的本质就是要尽量做到“高内聚,低耦合”。

    然而架构很难完美。现在市面上绝大多数后端Web项目用的是“三层架构”(或者更多层,但本质上是差不多的),即controller -> service -> dao。其中controller层和dao层处于依赖关系的两端,且职责比较清晰,一般不会有什么太大的依赖复杂性。但service层就不一样了,它承载了所有的主要逻辑,彼此之间相互调用是很正常的一件事,所以service层的依赖关系很容易变得错综复杂。这就会导致软件到后面会变得越来越难以维护。

    DDD结合整洁架构可以让依赖变得清晰,比三层架构有更好的“高内聚,低耦合”特性。

    技术和业务耦合导致了编程复杂

    编程这件事为什么复杂?为什么只有程序员能做,甚至初级程序员还做不好?不就是CRUD(增删改查)加if-else吗?

    其实主要原因是编程这件事,有很多技术上的东西。可能要与数据库打交道,可能会发送消息,使用缓存,处理并发,处理失败、超时问题等等。这些事情其实都是与业务逻辑无关的,可以说是纯技术上的东西。

    而业务逻辑,才是真正的CRUD加if-else。「开发人员在写业务逻辑的时候,像个把业务语言翻译成代码语言的工具人,其他时候我们才是工程师」。我们很多bug,可能并不是技术层面的bug,而是由于开发和测试没有足够了解业务造成的,遗漏了业务上的某些点,产生了业务上的bug。

    在三层架构,往往技术和业务是耦合粘连在一起的,至少代码层面上很难把它们分开,很难单独把“业务”方面的代码抽离出来。

    但DDD可以,DDD可以把业务全部内聚在领域层,且领域层不依赖其它任何东西,只有最纯粹的业务。那我们是不是甚至可以把这一层的user case和单元测试、甚至是实现代码都给业务同学(或者是领域专家)写?毕竟只跟业务相关,且都是简单的if-else。

    整洁架构

    来看一下DDD与各种架构提出的时间线。

    软件架构编年史

    2003年Eric Evans出了一本叫《领域驱动设计-应对软件复杂性之道》的书。2005年六边形架构(也叫端口与适配器架构)问世,2006年CQRS和Event Sourcing在一次Greg Young的演讲中提出,2008年洋葱架构。

    2012年,Bob大叔发文,说:我总结了之前的各种架构,比如六边形架构、洋葱架构、尖叫架构(他自己2011年提出的)等等,总结出了它们好像说的其实是一个东西,我把它们抽象整合一下,提出这样一个“整洁架构”。

    整洁架构链接:https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

    整洁架构图

    向内依赖规则

    整洁架构图是一个同心圆。它的依赖规则是「依赖方向朝内,每个环可以依赖它本身这一层及其所有内部的层,但不能依赖它外部的层」。就像图中黑色的水平箭头所示的那样。

    虽然图中只有四层,但它可以不止四层,可以继续细分或者向外扩展,只要满足「向内依赖规则」就行。

    Entities

    对应DDD的话,这一层是用来放实体、值对象、聚合等领域模型的。业务逻辑都应该尽量内聚在这一层,这一层是最纯净的,不需要依赖任何其它东西。

    Use Cases

    翻译过来是“用例层”,用于协调进出Entities层的数据流,通过调用和编排领域模型来实现用例。在DDD中,这一层通常是Application Service层,是很薄的一层,只用来做一些比较简单的事情。

    Interface Adapters

    这一层叫“接口适配层”,它其实是主要用来与外部进行适配的。比如Web请求进来的Controllers(写)和Presenters(读)。这一层会将User Cases或Entities层需要的数据结构与外层的数据结构做一个转换。比如操作数据库、调用第三方接口等。

    Frameworks and Drivers

    这一层主要是框架和驱动层,比如数据库驱动、WEB框架、UI等,日常编码中很少会在这一层编写代码。

    跨越边界和依赖反转

    就如同图中的右下角所示。我们的业务流程通常是先从controller进来,调用Use Cases层。但有时候Use Cases层需要调用presenter。如果直接调用,就破坏了“向内依赖规则”,这个时候可以用“依赖反转”来做。

    依赖反转

    简单来说,我们在Use Cases层定义两种抽象类或者接口:Use Case Input Port, 或者Use Case Output Port。Use Case Interactor去实现了Use Case Input Port,而Presenter去实现了Use Case Output Port。

    这样Use Cases层就不用依赖外部的层了。同样的道理,也可用于对数据库、第三方接口等的交互场景。

    代码

    No Code, No BB, Show me the code!

    我给大家找了一个Go语音版本的整洁架构代码实现,来一起分析一下它的结构。

    Github地址:https://github.com/manakuro/golang-clean-architecture

    文章地址:https://medium.com/@manakuro/clean-architecture-with-go-bce409427d31

    首先看一下整体的结构:

    .
    ├── domain(对应Entities层)
    │   └── model
    │       └── user.go
    ├── infrastructure(对应FrameWorks & Divers层)
    │   ├── datastore
    │   │   └── db.go
    │   └── router
    │       └── router.go
    ├── interface(对应Interface Adapters层)
    │   ├── controller
    │   │   ├── app_controller.go
    │   │   ├── context.go
    │   │   └── user_controller.go
    │   ├── presenter
    │   │   └── user_presenter.go
    │   └── repository
    │       └── user_repository.go
    ├── main.go
    ├── registry
    │   ├── registry.go
    │   └── user_registry.go
    ├── usecase(对应Use Cases层)
    │   ├── presenter
    │   │   └── user_presenter.go
    │   ├── repository
    │   │   └── user_repository.go
    │   └── interactor
    │       └── user_interactor.go
    

    Entities层没什么好说的,就是放的领域模型。Use Cases层定义了presenter和repository的接口。并且在interactor中,使用了这两个接口。

    // user_interactor.go中的Get方法
    func (us *userInteractor) Get(u []*model.User) ([]*model.User, error) {
     u, err := us.UserRepository.FindAll(u)
     if err != nil {
      return nil, err
     }
    
     return us.UserPresenter.ResponseUsers(u), nil
    }
    

    然后在Interface Adapters层,实现了上面定义的两个接口。在user_controller.go里面,调用user_interactor。

    DDD与整洁架构

    看了上面的整洁架构,发现是不是还是不能跟DDD的战术模式完全match上?

    是的,DDD是用来解决软件的复杂性的,而真实的软件远比上面的demo代码复杂得多。其中两个很重要的架构上的概念CQRS、Event Sourcing、Domain Service等并没有在上面整洁架构的图中体现出来。

    我也是疑惑了许久,最终在hgraca的博客里找到了答案。全部都在这张图上了:

    DDD与整洁架构

    博客原文:https://herbertograca.com/2017/11/16/explicit-architecture-01-ddd-hexagonal-onion-clean-cqrs-how-i-put-it-all-together/

    这不只有整洁架构,上面还有一些明显的六边形架构的样子。不过内部是整洁架构的模式,并且和DDD很好的结合了起来。我把它中间部分放大一些。

    放大版

    可以看到,处在最中间的是领域模型,然后是领域服务。这两环共同构成了领域层。更外面一层是应用层,应用层也包含了两个环,里面是App Services,外面是C/Q处理器、事件监听器等等。

    然后再往外,是大红色轮廓包起来的Application Core。这一层定义了很多接口(也可以说是端口),比如持久化、第三方服务、搜索、CQ总线、事件总线等等。当然,也接收处理命令和查询。

    思考,我曾遇到的问题

    在之前的DDD项目上,我曾经遇到过一些战术模式上的问题,现在回过头去思考一下。

    究竟什么时候需要领域服务?

    可以一句话总结:当只使用领域模型做不到的时候。那两者都是在领域层,大家都不依赖外面的东西,什么情况下领域模型做不到,领域服务就做得到?

    一个很常见的场景是创建模型的时候有业务逻辑。虽然创建模型通常是放在Factory里面,但Factory里面并不适合放业务逻辑。而这个时候领域模型还没有创建,自然就只能放在领域服务里面了。

    当然了,DDD最佳实践是希望能够尽量消灭领域服务层,全部内聚在模型层,只是很难达到这种完美的情况。

    在应用层需要查询其它数据怎么办?

    有时候我们可能不止是需要当前这个聚合根的数据,可能还需要其它的数据。这个读取操作当然不可能放到领域层去做,通常把它放在应用层。但应用层通常是一个聚合根对应一个ApplicationService,正常的流程是调用Repository接口获取一个领域模型对象,然后对它进行操作,再保存回数据库。

    那如果需要获取其它数据怎么办呢?尤其是可能与当前领域模型无关的数据,比如“最近评论时间”。

    我们团队之前的解决方案是用了一个Query,Query的职责是去数据库查询,它可以查询部分字段。但为了防止它被滥用,团队规定它只能用于repsenter或者applicationService中“为了写的读”。

    回过头去看整洁架构,这里的Query其实就是User Case Output Port。不过当时我们团队的Repository和Query都没有做抽象处理,也就是说并没有依赖反转,所以ApplicationService层依赖了它们,这与整洁架构的“单向依赖”不太相符,这里其实用上依赖反转会好一点。

    领域事件究竟该在什么时候发送和接收?

    这个也是一个比较有争议的点。首先看领域事件在什么时候创建,有人认为应该在领域层创建,有人认为应该在应用层创建。个人认为在领域层创建比较好,因为创建领域事件其实也算是一种业务逻辑,并且只是创建一个领域事件的话,不会依赖任何外部的东西,放在领域层没有什么问题。

    那什么时候发送领域事件呢?按照整洁架构的规则,不应该在领域层发送,因为事件总线(或者事件发送器的实现)在最外层,如果在领域层发送,虽然有依赖倒置,但感觉也跨越太多层次了,不是一个好的实践。

    那在应用层发送事件是一个比较好的方案。我们团队之前的方案比较奇葩,是在Repository的实现里面发送的。有点忘记当时为啥这样做了,不过现在看来,应该在应用层去做更合适一些。

    事件接收的话,就像上面的图中所示的一样,放在应用层比较好(但在App Services外)。然后可以通过ApplicationService去完成业务逻辑。

    跨聚合根的事务问题?

    这个其实很难保证强一致的事务了,因为跨聚合根应该使用事件通信,但事件的实现方式有多种,如果是异步,那就保证不了强一致的事务。只能用一些技术手段去尽量保证最终一致。

    怎样保证架构不被腐化?

    根据之前的实践经验来看,代码架构是有可能随着时间腐化的。比如我前面提到的Query就是一个例子,得通过一些团队间的“共识”来保证它不被滥用。我们不能保证代码完全不被腐化,但是可以通过一些手段去保证依赖的层次不被腐化。

    比较推荐的是使用maven/gradle的模块化,因为模块之间是有依赖关系的,只要我们不去改依赖的配置,就永远是单向依赖的。具体来说,我们可以把整洁架构上面的层级分成一个个模块,然后在配置文件里面定义它们的依赖关系。比如应用层模块,依赖领域层模块;接口和适配层模块依赖应用层模块和领域层模块。

    永远的难题:定义合适的聚合根

    最后谈一个比较难的问题,就是找聚合根。其实大家可能觉得,定义一个聚合根应该很简单,根据业务来就是了,比如用户、订单、商品、库存等等。但有时候我们很容易把聚合根定义得很大,因为无论聚合根多大,它都能够很好地解释。有个建模界的笑话是:我定义了一个“宇宙类”,它可以包含所有模型。

    聚合根太大可能会有问题,比如代码过多、测试用例过多、性能不好等等。很有可能做着做着一个聚合根就膨胀了,这个时候你们尝试去拆分它,会发现并非像最开始现象的那样不能拆分。只是要找到合适的“借口”,要拆得有理有据。但总而言之,这是一件很难的事情。

    关于作者

    我是Yasin,一个在不断精进的菜鸡

    微信公众号:编了个程(blgcheng)

    个人网站:https://yasinshaw.com

    这里很多技术干货,关注肯定不后悔

    加个星标可以第一时间看到最新文章

    听说,转发和在看的人都升职加薪了

    原创不易,四连走起,

    关注在看,评论转发,

    感谢支持!

    推荐阅读

    展开全文
  • android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程.docxandroid蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程.docxandroid蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程.docxandroid蓝牙介绍二蓝牙代码架构及其...
  • 代码审计-企业级Web代码安全架构-247页。全方位介绍代码审计,从审计环境到审计思路、工具的使用以及功能的安全设计原则,涵盖大量的工具和方法。
  • 本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构。本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程...

    原文出处:http://www.kokojia.com/article/19289.html


            架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。其是对存储在Active Directory中的对象类别和属性的描述。对于每一个对象类别来说,该架构定义了对象类必须具有的属性,它也可以有附加的属性,并且该对象可以是它的父对象。本文主要介绍几款在常见的app工程结构搭建中的Android代码架构。


            对于Android架构,由于个人手机的限制,目前也没打算要大谈特谈,但是从安卓开发的角度上看,看到整齐的代码,拥有优美的分层总是一种舒服与触动视觉的享受的。


            但从艺术的角度上看,这其实也是我们在追求一种美。


           于本文,首先分析几个时下比较流行的android软件包,在最后我们需要汲取其中觉得非常优秀的部分,用此来搭建我们自己的通用android工程模板。


          1. 微盘

      微盘的架构比较简单,我把最基本,最主干的画了出来:

           

    微盘架构

      第一层:com.sina.VDisk:com.sina(公司域名)+app(应用程序名称) 。

      第二层:各模块名称(主模块VDiskClient和实体模块entities)

      第三层:各模块下具体子包,实现类。

      在图片的分析中,我们可以得到上述一个最简单最经典的结构,一般在应用程序包下放一些全局的包或者类,倘若有多个大的模块,这个可以分成多个包,以及其中包括一个主模块。

      在主模块中定义基类,例如BaseActivity等,假设主模块下还有子模块,可以在主模块下建立子模块相应的包。需要重申一下,有的时候如果只有一个主模块,我们也可以完全省略掉模块这一层,那就是在BaseActivity.java及其子模块上直接提至第二层。

      在实体模块中,其本应该定义甚至说只定义相应的实体类,供全局调用,但实际上并没有这样。在微盘应用中,几乎所有的实体类是以 xxx+info命名的,这种命名也是我赞成的一种命名,从语义上我觉得xxxModel.java这种命名更生动更真实,xxxModel给我一种太机 械太死板的感觉,这点完全是个人观点,具体操作中以个人习惯为主。还有一点,在具体的xxxInfo,java中有很多实体类中是没有get/set的方 法,而是直接使用public的字段名。这一点,我是推荐这种方式的,特别是在移动开发中,get/set方法很多时候是完全没有必要的,而且是有性能消 耗的。当然如果需要对字段设置一定的控制,get/set方法也是可以酌情使用的。


      2. 久忆日记

      相比于微盘的工程结构,久忆日记的结构稍微复杂了一些。如下图:

           

    久忆日记的结构

      1).第一层和前面微盘一样的.

      2).第二层则没有模块分类,直接把需要的具体实现类都放在下面,主要日记的一些日记相关的Activity。

      3).第二层的实体包命令为model包,里面不仅存放了实体类xxx.java,而且存放了更高一级的实体类的相关类,比如 xxxManager.java,xxxFactory.java.关于这一点,我们可以参考一下android.jar中结构,我们发 现,Activity.java和ActivityManager.java,View.java和 ViewManager.java,Bitmap.java和BitmapFactory.java等等N多类似的一对类都在同一个包下,我个人觉得实体 包下存放实体类相应的Manager和Factoty类也是正确的,是我们应该采纳的一种结构。这里就打破了前面微盘中说的实体包下存放且只存放实体类的说法了。在而现实中,应该从灵活和合理的角度,久忆日记的这种实体包中存放对象内容更加实用。

      4).第二层中增加了前面微盘中没有涉及到的config,constant和common包。第一,其中config中存储一些系统配置,比如名称,应 用参数等系统级的常量或者静态变量,当然,如果你有其他大模块的配置,比如如果拥有复杂的用户管理模块的话,完全可以增加一个 UserConfig.java中存储用户的一些配置信息等等。第二,constant包,此包下存放的都是public static final常量,定义状态,类型等等。出于性能考虑,android开发中我不推荐使用枚举。common包中定义一个公用库,这里因为应用单一,无法很好的说明common包内容结构。

      5).common包要涉及后面多个软件比较后我们再得出结论。

      通过久忆日记的分析,也能借鉴到很多很有价值的东西,这也能使我们的架构变得更丰满更强大了。


      3. 网易新闻

      在网易上,其新闻确实是做得不错,从其应用的角度上看,这是我最欣赏的应用之一。那么它的工程结构是怎样的构架的呢?

            

    网易新闻

      网易新闻的工程结构和前面两个app又有很多的不同,它并非按照模块来分,而是主要根据组件的类型来分的,然后把此类型所有的类全部放在其下。那么这种把所有activity全部放在activity包下的分法的确在android开发中比较普遍。

      1).第一层被分成了两层,可以看出来,这里肯定是采用了公用包jar,这样一来,我们所开发公用包的时候也应该按照"公司域名+公用模块名称"组合方式来命名会比较规范。

      2).第三层(绿色层)中activity和service包下都是存放所有的activity组件和service组件,其实这里面包含了一种代码习惯。往往activity相关的类如监听器,线程,适配器等非常多的类,这些不好直接丢在activity包下,而是直接写在相应的activity中以匿名或者内部类形式定义,否则activity包和service包看上去会比较杂乱。

      因为android的app很可能不是很大,activity或者service包也不会杂乱,所以网易新闻的这种方式也是很有参考借鉴价值的。


      4. 小米应用

      说说小米应用吧,小米应用包括3个应用,小米分享,小米阅读,小米标签,从实际代码开发来看,我感觉不是同一个团队,或者同一组人开发的。这种情形下,它们的架构有是怎样的呢?小米应用

           

    小米应用架构

      上面的结构以及结构内部的细节其实很多地方我都是不大苟同的,但是能做出来好东西就是值得大家学习的,所以我只把其中我认为最值得学习的一点拿出来说。

      首先,widget,provider这些特殊模块分类建立单独的模块包即可,在这就不一一介绍了。

      第二,通过观察,我们发现小米分享中每个应用都有common包,不仅有应用程序级别的common包,而且有应用程序内级别的common包。我想说的 是,android开发中随着项目开发的积累,确能提取到很多公用的方法、类、功能模块。各个项目之间如此,各个项目内部也是如此,所以针对项目类被各个模块调用的方法,类也可以提取出相应的公用库。

      那么这里有个问题,公用common包的内部包可能涉及到很多的内容,是否要分包分级呢,又如何分包分级?我觉得,这个因情况而已,一般来说移动开发,为 了减少包的大小,我们会控制common包的膨胀,往往common包仅仅包括一些最简洁最经典的东西,东西又很少的话就无需分包,但是如果贵公司开发成 百上千,每个项目都用到行为分析,意见反馈等公用模块,分一下包会更清楚一点。总之,分不分包无关紧要,但尽量让你的代码结构清晰,思路了然就好。


      5. 聚各家之长,集大家之成

      上面粗略的分析之后,我们应该对android程序的架构有一个感觉,清晰而杂乱。我也没有去了看更多其他应用的结构,暂时就总结一下,得出一个我们自己的通用的工程结构。

      假如公司名为tianxia,目前公司准备开发读书应用,交友应用,生活服务应用。

      第一时间我们应该得出下面这种整个的架构(具体的app开发当然要分开):

           

    APP架构

      公司下开发3个应用reader,friend,life,其中common包为这三个应用共用,config,oauth为可选,view存放一些最通 用的自定义view,比如对话框,定制的列表等,如果你觉得有些view可能不会通用,最好把它放在应用程序类的common包下。

      如果各位看过Android学习系列(6)--App模块化及工程扩展的话,对于这种多应用模式,应该存在android库共用情况,来解决资源替换,工程复用的问题。所以我又修改如下:

                 

    android库

      其中BaseApplication做一些所有app都会用到的基础初始化或者配置。之后其他应用的application应该都继承此BaseApplication。

      base是一个android库,也是一个完整的android工程,而common只是一个jar文件,当然你也可以根据需要作为android库来开发。其他主工程reader,friend,life应该引用base工程。

      ad包存放公司自定义的一些软广告。

      feedback包下存储一些用户反馈等通用功能模块。

      其实,很多情况下,upgrade模块也可以添加到base工程下,制定统一的软件升级机制。

      接下来我们以reader为例子,来详细完成它的工程结构的设计。

    工程架构

      其中,config包下的AppConfig.java存放应用程序的根配置,比如版本,目录配置等等。

      module包下分为各个模块,blog为博客模块,bbs为论坛模块,person为整站个人信息模块,widget表示一种特殊功能模块。

      common包下存放一些工具类,本应用程序的一些自定义View等等。

      再结合之前所讲的内容,我们把整个串起来,完善一个reader的最后的架构如下(两外两个freind和life亦是类似如此):

    架构

      注意:

           1).功能模块和类型模块均可以划分,如果没有需要的话,模块的划分都可以省略。

      2).activity和service这类组件划分,如果没有需要的话,组件的划分都可以省略。

      3).所有的划分,如果没有需要的话,所有的划分都可以省略。

      综上文,主要是通过几个常用的APP工程结构来介绍Android代码架构,首先是微盘的架构,然后是久忆日记的结构和网易新闻的架构,再来是小米应用的架构,微盘主要是分三层来介绍,首先是主模块和实体模块和个模块下的子包,久忆日记的话第一层是和微盘的一样,但第二层是没有模块分类的,而且实体包命令为model包以及第二层中增加config,constant和common包。小米应用的话主要是三个应用,分别是小米分享,小米阅读,小米标签。网易新闻分成三层,一二层主要主要是采用公用包jar,第三层是在activity和service包下添加他们的activity和service组件。


    展开全文
  • [OAI] OAI代码架构分析

    万次阅读 2019-03-01 14:21:20
    CODING Turbo和卷积码,编码和解码操作,速率匹配,crc生成部分代码 1. 1 TESTBENCH 独立的测试单元(信道编解码的) 2. INIT 在vars.h中定义的变量,在这里面初始化(分配内存) 3. LTE_ESTIMATION 定时、频偏、...

    简介

    官方网站: https://www.openairinterface.org/

    1. OAI Radio Access Network (OAI-RAN/UE)
      源码: https://gitlab.eurecom.fr/oai/openairinterface5g.git
      This project implements 4G LTE and 5G Radio Access Network. Both NodeB and User Equipment (UE) are implemented.
      Code Repository: The code resides in this GITLAB.
      License: This code is distributed under the OAI 5G Public License.

    2. OAI Core Network (OAI-CN)
      源码: https://github.com/openairinterface
      This project implements 4G LTE Evolved Packet Core (EPC) and 5G Core Network.
      Code Repository: The code resides in this GITHUB.
      License: This code is licensed under the Apache V2.0 License

    在这里插入图片描述

    OAI-RAN/UE目录结构

    在这里插入图片描述
    OpenAirInterface主要包含四个部分:
    targets:无线嵌入式系统设计,包含了一些硬件相关的设计文件和firmware之类。
    OpenAir1:基带信号处理,包含了一些物理层的功能模块,例如OFDM,调制解调,信道估计,编解码等等。
    OpenAir2:中间层介入协议,包括在PC上通过Linux的IP网络设备驱动与MPLS的互联开发第二层协议栈。
    OpenAir3:无线网络,包括为全IP蜂窝与IP/MPLS网状而开发的第三层协议栈。

    OpenAir1

    在这里插入图片描述

    • PHY大目录
    每一个目录包含猪少一个defs.h(结构体和函数的声明),vars.h(变量的声明)和extern.h(外部变量)
    1. CODING Turbo和卷积码,编码和解码操作,速率匹配,crc生成部分代码
       1. 1 TESTBENCH 独立的测试单元(信道编解码的)
    2. INIT 在vars.h中定义的变量,在这里面初始化(分配内存)
    3. LTE_ESTIMATION 定时、频偏、信道估计
    4. LTE_REFSIG LTE参考信号生成(36211)
    5. LTE_TRANSPORT 上层循环(每个信道的)
    6. MODULATION 调制解调操作(FFT/SC-FDMA)
    7. TOOLS FFT/IFFT,向量运算,矩阵乘法等等
       7.1 FFTTEST 专门测试FFT的
    
    • SCHED大目录(调度不同的物理层函数)

    • SIMULATION大目录(PHY仿真函数)

    PBCH(物理广播信道):pbchsim
    DCI/PDCCH(下行控制信道):pdcchsim
    DLSCH/PDSCH(下行共享信道):dlsim
    ULSCH/PUSCH(上行共享信道):ulsim
    PUCCH(上行控制信道):pucchsim
    PRACH(随机接入信道):prachsim
    MCH/PMCH(物理多播信道):mbmssim
    PHY模拟的目录在 cmake_targets/lte-simulators/build
    这个地方有更多的test case:$OPENAIR1_DIR/PHY/CODING/TESTBENCH
    

    OpenAir2

    在这里插入图片描述
    重要的几个文件夹
    D:\openairinterface5g\openair2\LAYER2\MAC
    D:\openairinterface5g\openair2\LAYER2\PDCP_v10.1.0
    D:\openairinterface5g\openair2\LAYER2\RLC – AM/UM/TM
    D:\openairinterface5g\openair2\RRC
    D:\openairinterface5g\openair2\NAS
    D:\openairinterface5g\openair2\NETWORK_DRIVER
    D:\openairinterface5g\openair2\X2AP
    D:\openairinterface5g\openair2\ENB_APP

    OpenAir3

    在这里插入图片描述
    重要的几个文件夹
    D:\openairinterface5g\openair3\NAS\UE\EMM
    D:\openairinterface5g\openair3\NAS\UE\ESM
    D:\openairinterface5g\openair3\GTPV1-U
    D:\openairinterface5g\openair3\S1AP
    D:\openairinterface5g\openair3\SCTP
    D:\openairinterface5g\openair3\SECU
    D:\openairinterface5g\openair3\UDP

    OAI-CN目录

    在这里插入图片描述

    OAI-RAN

    LTE

    在这里插入图片描述

    NR

    在这里插入图片描述

    OAI-UE

    在这里插入图片描述

    NR

    在这里插入图片描述

    OAI-CN

    在这里插入图片描述

    HSS

    底层实现机制要么是socket,要么是hashtable
    在这里插入图片描述

    MME

    在这里插入图片描述

    SGW

    在这里插入图片描述

    展开全文
  • 上期,我们揭秘了JEPaaS低代码快速开发平台的平台功能图,这期我们揭秘JEPaaS的技术架构和技术选型 平台技术架构图 JEPaaS低代码快速开发平台底层支持多种数据库,包括Oracle,MySQL,SqlServer,人大金仓...
  • BES2300x笔记(1) -- SDK代码架构与Battery模块

    千次阅读 多人点赞 2020-07-03 17:45:36
    哈喽大家好,这是该系列博文的第一篇~ 篇~ 【系列博文索引】快速通道 >> 首先上一个链接:参考链接 ...拿到恒玄的SDK源码之后,结合文档花了一些时间研究,这篇就先介绍下代码的框架和模块之间的解耦处理。
  • python http服务flask架构实用代码 | 实用代码架构

    万次阅读 多人点赞 2021-10-15 13:49:02
    代码 总结 概述 本篇文章主要分享一个python的简单http服务flask架构。目前主流的python的服务框架有django、flask,相较于django来说,flask更小巧玲珑。至于并发的问题,使用了gevent协程io进行处理。 依赖...
  • 理解代码分层架构

    千次阅读 2021-07-23 11:01:01
    代码分层架构设计主要为了实现责任分离、解耦、组件复用和标准制定。 二、什么是代码分层架构 先通过软件分层架构来说起 1、什么是软件分层架构 软件分层架构是通过层来隔离不同的关注点。 软件部署分层架构主要...
  • 代码在做什么 第一性原理意味着你抛弃一切,直击真相本质,然后从那里开始推理。1 通过第一性原理思维方式去思考低代码,首先不管我们做什么方式进行编程,一定是为了获得一个满足我们需求的程序,低代码和传统...
  • linux内核代码架构图-清晰版,对阅读linxu内核源码很有帮助。
  • WebRTC简介与代码架构

    千次阅读 2018-05-16 11:11:08
    代码架构 这里主要列出网络I/O相关部分的代码 首先下载 WebRTC native代码 git clone https: //webrtc.googlesource.com/src 之前的libjingle已经整合到了WebRTC项目中,主要由 rtc_base + pc + p2p...
  • JEPaaS低代码快速开发平台是本地部署的,可以将JEPaaS做的项目部署在企业内部,公司的数据存储在公司自己的服务器,最大程度地保障了企业的信息安全。还支持本地开发,灵活拓展各种功能应用。 JEPaaS基于客户自身的...
  • 代码审计是企业安全运营以及安全从业者必备的基本技能。本书详细介绍代码审计的设计思路以及所需要的工具和方法,不仅用大量案例介绍了漏洞挖掘方法,而且在代码层和功能设计层剖析了各种安全漏洞的成因与预防策略。...
  • Autoware 代码架构

    千次阅读 2019-03-06 21:44:29
    代码库地址为:https://github.com/CPFL/Autoware 用于城市自主驾驶的开源软件。http://www.tier4.jp/
  • 内核代码架构.zip

    2011-08-22 21:06:44
    内核代码架构 zip
  • EC修炼之道—代码架构

    千次阅读 2016-03-30 00:06:54
    EC就是笔记本电脑上的一个嵌入式控制器。作为一个主板软件开发人员,一般说EC,就是EC固件程序。...后来,我才了解,他没有在专业主板团队做EC的经验,又得不到EC厂商的技术支持,所以对EC代码架构不了
  • Host_AP代码架构分析.pdf Host_AP代码架构分析.pdf
  • 最新自动生成各个三层架构的基础代码,包括entity、mapper、service、controller、
  • python-图书管理系统2-整体 代码架构

    千次阅读 2021-12-15 11:36:26
  • 无码系列-2-代码架构空想

    千次阅读 2019-08-22 15:10:21
    无码系列-2-代码架构空想
  • DDD代码分层架构

    千次阅读 2020-06-09 15:46:18
    DDD四层架构 1、用户接口层:负责用户显示信息和接受用户的指令,包含:用户、程序、自动化测试、批处理等 2、应用层:理论上不应该有业务规则或逻辑,主要面向用例和流程相关的操作,由于领域层之上,所以包含了...
  • 代码审计_企业级Web代码安全架构,随便看看!代码审计_企业级Web代码安全架构,随便看看!
  • 无码系列-3-代码架构约束
  • 摘要:本文简单介绍OpenHarmony轻量系统移植,Board和SoC与代码的对应关系 适合群体:想自己动手移植OpenHarmony轻量系统的朋友 上一节,我们已经添加了Board、SOC两个文件夹、由于我们所选的芯片是GD32F303,其架构...
  • 摸清楚系统架构后,项目的整体情况已经成竹在胸了,是不是有点摩拳擦掌,信心十足的要开始码代码了。 但是代码如何下手呢?做项目的话不能再像Demo程序一样,我们有多个功能,有多个人参与开发,代码的组织也需要...
  • Java架构师指南 配套代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,316,154
精华内容 526,461
关键字:

代码架构

友情链接: streth.zip