Hasor框架
1,Hasor是什么
Hasor由多个不同系列框架组合而成的一个框架体系,这些子框架的能力涵盖了 IoC、Aop、WebMVC、数据库以及其它方方面面。这一切的基础要归功于 Hasor 的插件化能力。
Hasor是一款基于Java语言的应用程序开发框架,它的核心设计目标是提供一个简单、切必要的环境给开发者。开发者可以在此基础上,通过 Hasor 强有力的粘合机制,构建出更加完善的应用场景。同时Hasor 的各种内置插件也会帮助开发者进行快速开发。
2,Hasor的作用
- Hasor 帮助我们设计更好的 API,它独有的框架扩展能力可以使新的能力完全无缝的集成到统一的 API
体系中。Hasor构建了通用功能,使我们能够扩展 Hasor,而不是向核心框架添加每个特性。
Hasor
的扩展能力更像是一个乐高玩具的接口,任何人都可以通过非常简单的方式提供乐高积木,然后轻松的将它们融合到一起。在使用的过程中完全感受不到背后是多个不同的框架在协作。Hasor
API 本身就是一个很好的例子。
- Hasor 的目标是使开发和调试变得更容易和更快,而不是更困难和更慢。
3,Hasor的特点
Hasor 提倡开发者充分利用编程语言的优势进行三方整合和模块化设计。同时 Hasor 也主要是通过这种“微内核+插件”的方式丰富开发所需的所有功能。
决定避开 COC 原则的原因是,COC 虽然已约定的方式降低了整个框架的设计复杂度,但同时也最大限度的牺牲了框架的灵活性。缺少灵活性的框架在应用场景上会受到极大的制约。而 Hasor 的设计则更加面向底层,因此需要更多的灵活性。
Hasor 强大的灵活性表现在模块整合能力上,对于某一个领域开发方面 Hasor 依然强调并力推 COC 。小而美的核心,大而全的生态圈是 Hasor 的目标。
- IoC/Aop编程模型,设计精巧,使用简单
- COC原则的最佳实践,‘零’配置文件
- 微内核 + 扩展,基于内核已发展出 DB、Web、Restful 三大独立的基础框架
- 真正的零开发,解析项目特有的自定义 Xml 配置
- 支持模板化配置文件,程序打包之后一套配置通吃(日常、预发、线上)以及其它各种环境
- 完备的 JDBC 操作接口,支持 Result -> Object 映射
- 提供三种途径控制事务,支持七种事务传播属性,标准的事务隔离级别
- 支持多数据源、及多数据源下的事务控制(非JPA)
- 内置事件机制,方便进行业务深度解耦,使业务逻辑更佳清晰
- 支持 Web 类型项目开发,提供 restful 风格的 mvc 开发方式
- 支持Form表单验证、支持场景化验证
- 提供开放的模版渲染接口,支持各种类型的模版引擎
- 提供丰富的工具箱,帮助您快速开发,有了它您甚至不需要 apache-commons
- 支持log4j、logback等多种主流日志框架
- 体积小,无第三方依赖
3.2 什么是COC原则
Convention over Configuration(CoC)– 惯例优于配置原则
4,Hasor架构
- Core 职责是提供Bean容器、Module机制。
- DB 提供了JDBC操作、事务管理。
- RSF 是一个完备的分布式 RPC 服务框架。
- Web 是一个吸收了百家所长的 Web MVC框架。
- Land 它类似于 Zookeeper 负责提供分布式一致性的支持。
- Center 它是 RSF 的服务治理中心。
4.1 总体功能
- 支持IoC、Aop、模块化(Hasor-Core)
- 支持模版化配置文件,让您程序打包之后通吃各种环境(Hasor-Core)
- 提供JDBC操作接口,支持 Result -> Object 映射(Hasor-DB)
- 完备的数据库事务控制能力,支持 7 种事务传播属性(Hasor-DB)
- 支持传统 Web MVC 开发,也支持 restful 方式(Hasor-Web)
- 提供Form表单验证、验证支持场景化(Hasor-Web)
- 开放的模版渲染接口,支持各种类型的模版引擎(Hasor-Web)
- 分布式 RPC 服务,支持容灾、负载均衡、集群(Hasor-RSF)
- 通过 Hprose 支持多协议、跨语言的 RPC 调用(Hasor-RSF)
- 通过服务注册中心,支持分布式服务统一治理(Hasor-RSF)
- 提供对某一个状态提供分布式下状态一致性支持(Hasor-Land)
4.2 发展状况
- Hasor起源于2012年。当时尚未开源,并被应用到公司各大项目中。当时基于Guice构建,并且整合了Spring JDBC、Guice等大量三方框架。
- 2013年9月15日,第一个Hasor版本发布。Module化的插件概念被提出,同时依赖大量减少,成为一个开源的java开发框架。
- 2015年7月3日,1.0.0版本发布。这一年Hasor明确的发展路线,确立了“小而美的核心,大而全的生态圈”目标。
- 2016年8月18日,2.4.3版本发布,基于2.4版本Hasor开始孕育全新的子项目 RSF。当时 Hasor 的版图还没有这么大。
- 2017年2月21日,RSF 和 Land 被并入 Hasor 体系,同时首次公开了 Hasor 大版图的想法。
5,SpringBoot整合Hasor
5.1 添加依赖
<dependencies>
<!--Spring-web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--连通 Spring 和 Hasor-->
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-spring</artifactId>
<version>4.1.7</version>
</dependency>
<!--DataWay 是Hasor生态中的一员-->
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-dataway</artifactId>
<version>4.1.7</version><!-- 4.1.4 包存在UI资源缺失问题 -->
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--JDBC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
5.2 创建数据库表
CREATE TABLE `interface_info` (
`api_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`api_method` varchar(12) NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
`api_path` varchar(512) NOT NULL COMMENT '拦截路径',
`api_status` int(2) NOT NULL COMMENT '状态:0草稿,1发布,2有变更,3禁用',
`api_comment` varchar(255) DEFAULT NULL COMMENT '注释',
`api_type` varchar(24) NOT NULL COMMENT '脚本类型:SQL、DataQL',
`api_script` mediumtext NOT NULL COMMENT '查询脚本:xxxxxxx',
`api_schema` mediumtext COMMENT '接口的请求/响应数据结构',
`api_sample` mediumtext COMMENT '请求/响应/请求头样本数据',
`api_option` mediumtext COMMENT '扩展配置信息',
`api_create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`api_gmt_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`api_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='Dataway 中的API';
CREATE TABLE `interface_release` (
`pub_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Publish ID',
`pub_api_id` int(11) NOT NULL COMMENT '所属API ID',
`pub_method` varchar(12) NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
`pub_path` varchar(512) NOT NULL COMMENT '拦截路径',
`pub_status` int(2) NOT NULL COMMENT '状态:0有效,1无效(可能被下线)',
`pub_type` varchar(24) NOT NULL COMMENT '脚本类型:SQL、DataQL',
`pub_script` mediumtext NOT NULL COMMENT '查询脚本:xxxxxxx',
`pub_script_ori` mediumtext NOT NULL COMMENT '原始查询脚本,仅当类型为SQL时不同',
`pub_schema` mediumtext COMMENT '接口的请求/响应数据结构',
`pub_sample` mediumtext COMMENT '请求/响应/请求头样本数据',
`pub_option` mediumtext COMMENT '扩展配置信息',
`pub_release_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间(下线不更新)',
PRIMARY KEY (`pub_id`),
KEY `idx_interface_release` (`pub_api_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='Dataway API 发布历史。';
5.3 编写代码以及配置文件
@DimModule // Hasor 中的标签,表明是一个Hasor的model
@Component // Spring 中的标签,表明是一个组件
public class HasorComponent implements SpringModule {
private final DataSource dataSource;
public HasorComponent(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* Hasor 启动的时候会调用 loadModule 方法,
* 在这里再把 DataSource 设置到 Hasor 中。
* @param apiBinder
* @throws Throwable
*/
@Override
public void loadModule(ApiBinder apiBinder) throws Throwable {
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
}
}
@EnableHasor
@EnableHasorWeb // 将 hasor-web 配置到 Spring 环境中,Dataway 的 UI 是通过 hasor-web 提供服务。
@SpringBootApplication
public class HasorApplication {
public static void main(String[] args) {
SpringApplication.run(HasorApplication.class, args);
}
}
server:
port: 9800
spring:
profiles:
active: dev
# 是否启用 Dataway 功能(必选:默认false)
HASOR_DATAQL_DATAWAY: true
# 是否开启 Dataway 后台管理界面(必选:默认false)
HASOR_DATAQL_DATAWAY_ADMIN: true
# dataway API工作路径(可选,默认:/api/)
HASOR_DATAQL_DATAWAY_API_URL: /interface/
# dataway-ui 的工作路径(可选,默认:/interface-ui/)
HASOR_DATAQL_DATAWAY_UI_URL: /config/
# SQL执行器方言设置(可选,建议设置)
HASOR_DATAQL_FX_PAGE_DIALECT: mysql
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
5.4 启动程序
输入http://127.0.0.1:9800/config/,即可打开DatawayAPI配置页面