文档章节

酝酿已久的 Hasor2

哈库纳
 哈库纳
发布于 2014/06/10 16:12
字数 1589
阅读 355
收藏 1
点赞 0
评论 13

    自从2014年1月份更新了一个版本之后,Hasor的更新一直处于沉静状态。这段时间内因为工作变动、搬家等原因。导致Hasor的更新变慢了。 尽管这样,Hasor仍然在进行开发。新版Hasor,暂定名为 Hasor2。新版本变化非常大。

一、Hasor不再强制依赖Guice

    虽然Guice作为Hasor的默认DI引擎非常理想,但是Guice和Spring之间的协调变并不是很容易。在Hasor 1 中 Hasor提供了Bean注册机制,这个机制会交给位于更下层的Guice。正因为这样Spring作为一个独立的Bean容器其实是很难与Hasor融为一体。这也就使得Spring与Hasor的整合只能趋向于表面。

    于是新版的Hasor内部构建了一套全新的 Bean 绑定机制,通过这套机制Hasor有了自己的Bean注册API。所有注册的Bean信息最后都会通过 RegisterInfo 接口进行描述。新版Hasor正是通过这一点完成了不再强制依赖Guice的美好愿望。

    Hasor为什么前后这么纠结?

    Hasor 的架构其实是我在前任公司里做过的一个基础框架的开源实现。两套架构有很多相似的地方,但是完全不一样。同时Hasor也是为了技术练手开发的一个框架。

    开源之后,来自OSC的朋友问道,如何与Spring集成?其实从一开始来说Hasor并没有打算支持Spring。但是如果作为开源软件独立发展的话,Spring已经集成了众多优秀的框架。如果Hasor失去Spring,将意味着Hasor的生态圈变得非常狭窄因此Hasor开始在接下来的新版中尝试剥离Guice。不再强依赖某一个技术框架,Hasor还是尝试拥抱更多的选择。

二、Hasor2 弱化了模块概念,强调插件

    在Hasor1中Hasor还是十分强调(模块、组件化、生命周期、模块依赖)这些概念。从新版Hasor开始将不再强调这些概念,转而支持插件化。

    原因1(学习曲线陡峭):在Hasor1中Hasor的扩展功能是以模块形式通过Module接口组织进入的,Module接口给出了init、start、stop三个方法。这三个方法分别对应了模块的三个生命周期。因为Hasor1强调模块开发,所以开发者在使用Hasor的时候除了要理解Hasor模块声明周期之外,还要了解Hasor依赖体系。这样一来开发Hasor的扩展功能的学习曲线比较大的。

    原因2(不实用):作为Hasor的作者,在开发Hasor模块过程中我发现其实扩展Hasor主要还是围绕在Hasor的init阶段。start、stop两个阶段的设计基本是没什么用的。

    于是便有了HasorPlugin接口,通过HasorPlugin开始简化Hasor模块的开发。到最后Hasor发展了14个内置插件,也都是通过HasorPlugin接口完成的,跟Module几乎没什么关系。这样一来原本设计的(模块体系、生命周期)最后通过简化的Plugin体系完全取缔了。

三、Hasor的目标重新定位

    最初打造Hasor的目的是想创造基础Java开发框架,这个框架上可以安装各种不同的功能模块。每个模块提供了不同的功能,通过这些这些功能组成一个适用于项目的开发环境。

    但是由于先天Hasor采用了模块化的概念进来,导致Hasor很多扩展都要围绕着模块进行,而这个模块概念又泛生出(依赖、生命周期)这样重量级的东西。因此很多朋友会直接联想起 OSGi。虽然Hasor已经力争与OSGi划清界限。但是依然有着重量级的影子在里面(虽然经过实践证明Module是一个鸡肋....)。

    Hasor还曾经试图打造一个容器框架。为这个远景而大力发展 Hasor的模块概念,通过加入ClassLoader等机制来完善 Hasor 本不完善的 Moduel。这样一来 Hasor 从预期上更加趋向 OSGi。如果继续发展下去,Hasor 的价值就被做掉了。

    Hasor2 开始放弃 Module,拥抱插件。重新回归轻量化基础框架行列。使用Hasor2,可以用过插件扩展期功能正如Hasor在一开始提到的“微内核+扩展”。

四、不再打造大平台

    其实Hasor的先前版本有一个特性就是任何一个基础组建包都会携带一大堆内置插件。这样的设计初衷是提供一个完备的基础环境,开发者引用了 Hasor 之后很多功能都可以通过 Hasor 直接提供。

    这样的想法本身就是有问题的,在实际开发中很难提供一个高度完备的开发环境。如果真的做到了会由于集成了太多东西而变得笨重,失去了轻量化、高灵活性的特征。

    新版Hasor扭转这种想法,只提供一个最轻量级的内核,所有扩展插件将会被全部被剥离出去。

五、更加透明、灵活

    Hasor 1 之前 Hasor 通过注解化的方式提供了很多便捷的插件,注解在Hasor1中是一个核心元素。推行注解化开发会给开发这带来很大的灵活性,但是由于注解的支持已经被深深植入Hasor内部。这样一来Hasor对于开发者相当于一个黑盒。使用Hasor提供的API虽然可以提供各种有用的插件,但是并不能帮助同学了解工作原理。这也就导致Hasor框架的可制定性大打折扣。

    Hasor2开始,只提供核心接口方法,内置插件将被剥离出去,成为Quice项目。如果有需要快速开发的同学可以直接使用这个项目来快速开发从而省去制定的麻烦。这样一来可以让更多同学可以对 Hasor 做出更多特色的制定,从而满足不同的业务场景需要。

© 著作权归作者所有

共有 人打赏支持
哈库纳

哈库纳

粉丝 953
博文 81
码字总数 149803
作品 4
杭州
后端工程师
加载中

评论(13)

哈库纳
哈库纳

引用来自“心灯”的评论

没有使用过,不过模块化是未来,通过模块化可以使用编程相对有保证些。
准备看看作者的源码,另OSGI有接触过一段时间,在WEB方面应用 起来还是不太习惯,基本上和之前的编程方式会有不同,另外就是OSGI的曲线太长,开发工具还是有些问题(使用过BND).可能这些都是借口,真正的还是自己没有深入进去。
Hasor2只是理想达到的一个目标,真正实现起来还需要进一步的验证。目前Hasor的最新版还在开发中...
心灯
心灯
没有使用过,不过模块化是未来,通过模块化可以使用编程相对有保证些。
准备看看作者的源码,另OSGI有接触过一段时间,在WEB方面应用 起来还是不太习惯,基本上和之前的编程方式会有不同,另外就是OSGI的曲线太长,开发工具还是有些问题(使用过BND).可能这些都是借口,真正的还是自己没有深入进去。
哈库纳
哈库纳

引用来自“蜗牛君”的评论

一个插件我这边定义为一个业务单元 ,例如 用户管理和角色管理就是两个插件(jar),在生产环境中 可以在不重启整个服务端的前提下 更新某个插件 。这些只是脑子里面的想法 还有通过严谨验证^_^ 什么时候出新版 观摩观摩
方法是可行的,实际应用时候我遇到的情况是一般都是整体做更新部署。 所以后来在新版中干脆放弃这种思想了。 插件管理我想还是单独拿出来独立搞一个容器去做比较有针对性。
哈库纳
哈库纳

引用来自“蜗牛君”的评论

我还没有看过1 所以不知道你怎么管理插件的
我的猜想是 一个插件就是一个jar包 一个统一的模块去加载卸载这些jar包
我说的对么?我自己尝试写了一个
http://git.oschina.net/zengweigang/plugin-server.git
望指点

引用来自“哈库纳”的评论

指点算不上啦,互相交流下 在 Hasor 里插件是通过接口表现的,一个Jar包中可以有多个插件,要想Hasor自动加载插件只需要配置一个注解就可以。 思路上是一样的。 在设计Hasor2时候曾经想过用ClassLoader去装载模块,后来决定轻量化就放弃了这个想法。 不知道你有没有想过,如果已经装载的插件一旦被使用可能卸载不干净的问题。如果在重新装载会不会引发冲突?

引用来自“蜗牛君”的评论

各个插件(jar)之间完全独立,不存在互相引用。如果A插件需要B插件提供服务 B插件可以提供一个http的接口作为服务。如果这样的话 不知道会不会出现卸载不干净的问题。 我卸载jar包的方式是: JarURLConnection url =加载jar的时候的url对象; url.getJarFile().close(); 如果你要卸载一个插件 你是怎么做的呢?因为你一个jar里面有多个插件 肯定是不能卸载jar的,而且各个插件之间又有相互引用。
是的卸载会有问题,所以我没有做卸载,只做了一个 start , stop 两个生命周期。其实即使jar之间完全隔离运行用 rpc 等方式互相调用,也不是很完美。毕竟类的 静态代码快可能还有一些已经打开的资源无法被回收。 采用 HTTP提供插件服务是一个办法,但是程序内部调用效率会遇到问题把?
狂暴的蜗牛君
狂暴的蜗牛君
一个插件我这边定义为一个业务单元 ,例如 用户管理和角色管理就是两个插件(jar),在生产环境中 可以在不重启整个服务端的前提下 更新某个插件 。这些只是脑子里面的想法 还有通过严谨验证^_^ 什么时候出新版 观摩观摩
狂暴的蜗牛君
狂暴的蜗牛君

引用来自“蜗牛君”的评论

我还没有看过1 所以不知道你怎么管理插件的
我的猜想是 一个插件就是一个jar包 一个统一的模块去加载卸载这些jar包
我说的对么?我自己尝试写了一个
http://git.oschina.net/zengweigang/plugin-server.git
望指点

引用来自“哈库纳”的评论

指点算不上啦,互相交流下 在 Hasor 里插件是通过接口表现的,一个Jar包中可以有多个插件,要想Hasor自动加载插件只需要配置一个注解就可以。 思路上是一样的。 在设计Hasor2时候曾经想过用ClassLoader去装载模块,后来决定轻量化就放弃了这个想法。 不知道你有没有想过,如果已经装载的插件一旦被使用可能卸载不干净的问题。如果在重新装载会不会引发冲突?
我卸载一个插件=卸载一个jar包
狂暴的蜗牛君
狂暴的蜗牛君

引用来自“蜗牛君”的评论

我还没有看过1 所以不知道你怎么管理插件的
我的猜想是 一个插件就是一个jar包 一个统一的模块去加载卸载这些jar包
我说的对么?我自己尝试写了一个
http://git.oschina.net/zengweigang/plugin-server.git
望指点

引用来自“哈库纳”的评论

指点算不上啦,互相交流下 在 Hasor 里插件是通过接口表现的,一个Jar包中可以有多个插件,要想Hasor自动加载插件只需要配置一个注解就可以。 思路上是一样的。 在设计Hasor2时候曾经想过用ClassLoader去装载模块,后来决定轻量化就放弃了这个想法。 不知道你有没有想过,如果已经装载的插件一旦被使用可能卸载不干净的问题。如果在重新装载会不会引发冲突?
各个插件(jar)之间完全独立,不存在互相引用。如果A插件需要B插件提供服务 B插件可以提供一个http的接口作为服务。如果这样的话 不知道会不会出现卸载不干净的问题。 我卸载jar包的方式是: JarURLConnection url =加载jar的时候的url对象; url.getJarFile().close(); 如果你要卸载一个插件 你是怎么做的呢?因为你一个jar里面有多个插件 肯定是不能卸载jar的,而且各个插件之间又有相互引用。
哈库纳
哈库纳

引用来自“蜗牛君”的评论

有三个模块目前
一个core 这个就不用说了
还有一个plugins 下面就是一些模块
server 这个就是负责启动管理这个plugin的
plugin-server 项目已经关注了, 你也是采用的 Guice 呀。 Hasor 在 1 里面也是用的 Guice 。 Guice 确实是个好东西。
哈库纳
哈库纳

引用来自“蜗牛君”的评论

我还没有看过1 所以不知道你怎么管理插件的
我的猜想是 一个插件就是一个jar包 一个统一的模块去加载卸载这些jar包
我说的对么?我自己尝试写了一个
http://git.oschina.net/zengweigang/plugin-server.git
望指点
指点算不上啦,互相交流下 在 Hasor 里插件是通过接口表现的,一个Jar包中可以有多个插件,要想Hasor自动加载插件只需要配置一个注解就可以。 思路上是一样的。 在设计Hasor2时候曾经想过用ClassLoader去装载模块,后来决定轻量化就放弃了这个想法。 不知道你有没有想过,如果已经装载的插件一旦被使用可能卸载不干净的问题。如果在重新装载会不会引发冲突?
狂暴的蜗牛君
狂暴的蜗牛君
有三个模块目前
一个core 这个就不用说了
还有一个plugins 下面就是一些模块
server 这个就是负责启动管理这个plugin的
Ruby 1.9.1发布 

Ruby 1.9.0系列的第一个稳定版1.9.1正式发布。其主要特性包括了酝酿已久的虚拟机VM(以前的YARV),支持原生线程和纤程(Fiber,一种轻量级的线程)。Ruby 1.9.1的速度据称是上一个稳定版1.8...

红薯 ⋅ 2009/02/01 ⋅ 0

特朗普打响对华贸易战! 中国手机和家电行业或受最大影响!

北京时间23日凌晨,中美贸易迎来了历史性的瞬间——据人民日报报道,美国总统特朗普宣布,将对中国价值高达500亿美元(约合人民币3165亿元)的商品征收惩罚性关税! 这是现代历史上美国总统对...

智科技 ⋅ 03/23 ⋅ 0

【多图】百度电脑管家1.0 Beta版泄露

中国的互联网行业到底怎么了,争相推出同样的软件,连搜索引擎也开始要占领用户的桌面。 传闻已久的百度电脑管家今日终于有泄漏版本出现,这也证明了这款软件已经基本开发完毕,发布日期指日...

红薯 ⋅ 2010/10/07 ⋅ 21

裁撤医疗事业部,百度开年第一刀有多狠

  【IT168 资讯】2月8日,网友在社交平台匿名爆料“百度医疗事业部整体裁撤”,一时间引起了网友的热烈讨论,多家媒体向百度公关部门求证,均得到“不予置评”的回复,但是网络上有多位自称...

it168网站 ⋅ 2017/02/09 ⋅ 0

虚拟数字货币新一轮整顿措施正在酝酿中

雷锋网(公众号:雷锋网)援引中国证券报最新消息称,相关部门新一轮的ICO 整顿措施正在酝酿之中。 在2017年9月的七部委联合整顿告之后,虚拟数字货币的炒作仍未平息。近日, ICO 项目 ARTS就被...

陈留 ⋅ 02/06 ⋅ 0

电影《面纱》

如果不是因为爱德华·诺顿主演,我想我会错过这部电影。 无论在中国还是在美国,它的宣传都太低调了,好多人不知道。 电影根据毛姆的同名小说 The painted veil 改编,但是变化很大,几乎可以...

阮一峰 ⋅ 2007/01/14 ⋅ 0

中移动重划游戏规则 CP新生SP将死?

中国移动或在今年第三季度推出其酝酿已久的“MobileMarket”。 MobileMarket是中国移动目前最重要的项目之一,它决定着中国移动未来的增值业务收益,它的游戏规则也直接牵动着所有服务提供商...

红薯 ⋅ 2009/06/22 ⋅ 2

关于smart的继续更新

@黄勇 你好,想跟你请教个问题: 您的这个smart不是很好的,为什么就不更新了呢? 您之前有说整在酝酿一个更轻量级的,能共享或者透露一下么?

狼族盟约元 ⋅ 2015/06/05 ⋅ 2

Cubieboard团队发布 “cubieboard2双卡版”开源硬件

“cubieboard2双卡版”(英文名:cubieboard2-dualcard,简称CB2-2CARD)是一个cubieboard团队酝酿已久的产物,也是一个为了适应中国国情而推出的一个可玩性更高的开源硬件。在极大地保留了硬...

cubieboard ⋅ 2014/08/19 ⋅ 0

传微软将于7月1日进行大规模重组

据AllThingsD消息,微软近期正在酝酿一次“规模较大的重组”,可能会在7月1日宣布。这次重组主要集中在设备和服务部门,由CEO Steve Ballmer主导,由于他没有和微软的全体高管磋商,这就意味...

oschina ⋅ 2013/06/24 ⋅ 22

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vue使用mockjs

在使用vue开发的时候,一直疑惑与mockjs怎么用,开了mockjs的开发文档,还是一脸蒙蔽,无从下手!mockjs在前后端分离开发上进行模拟数据,是不可避掉的一环。在网上看了一些博文还有查阅了其...

JamesView ⋅ 30分钟前 ⋅ 0

解决问题的思路

1.相对来说,程序逻辑解决问题的思路应该更加趋向于通过逻辑结构来解决问题,而不是通过更小的类级别和方法级别的改进 2.类级别和方法级别的改进需要的技术能力更高一点

th778899 ⋅ 36分钟前 ⋅ 0

HTTP请求状态及jQuery AJAX请求异常处理

上一周调优一个项目的Js部分,其中一个严重的问题就是在页面初始化数据时,没有对异常进行处理, 导致Loading一直在等待中,无提示无处理。在用户体验上很不好,即使网络条件无法保证,在出错...

临江仙卜算子 ⋅ 36分钟前 ⋅ 0

error code 1874. innodb is in read only mode--报错解决

参考网页 https://zhidao.baidu.com/question/746894876932022292.html https://blog.csdn.net/shushugood/article/details/80226767 问题背景 创建了一个数据库然后想删除,因为自己本机性能......

karma123 ⋅ 38分钟前 ⋅ 0

JVM系列:jinfo命令详解

jinfo全称Java Configuration Info,主要作用是实时查看和调整JVM配置参数。 一.查看JVM参数 用法:jinfo -flag <name> PID 示例: # jinfo -flag MaxMetaspaceSize 11180 # -XX:MaxMetaspac......

Jacktanger ⋅ 42分钟前 ⋅ 0

exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp

1. exportfs命令 一般情况下重启服务器上nfs服务时,需把客户端上的挂载先卸载掉,以免进程后面杀不掉。当客户端服务器很多时,操作起来就比较麻烦。此时可以使用exportfs命令重新加载下。 ...

laoba ⋅ 51分钟前 ⋅ 0

基于Python的信用评分卡模型分析

信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常按照主...

火力全開 ⋅ 53分钟前 ⋅ 0

执行make命令时报错g++: Command not found

执行make命令时报错g++: Command not found 2016年10月24日 12:31:29 阅读数:4366 朋友安装node时遇到的问题 报错截图: 其实很简单只需要安装一下 yum -y install gcc automake autoconf l...

rootliu ⋅ 53分钟前 ⋅ 0

Loongnix(龙芯)系统,优盘安装指南

U盘安装分为两种方式:"usb disk" 及 "usb cd"。其中usb cd是将usb disk做为usb光驱使用。 usb disk安装步骤: 需要准备一个大小超过3.5G的U盘,格式化ext3格式 下载安装光盘镜像xxx.iso,将...

gugudu ⋅ 56分钟前 ⋅ 0

HTML5中meta属性的使用详解

meta属性在HTML中占据了很重要的位置。如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等。虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能...

guorongjin ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部