文章目录
Dataway框架概述
Hasor简介
Hasor是由多个不同系列框架组合而成的一个框架体系。这些子框架的能力涵盖了IoC、Aop、WebMVC、数据库以及其他的方方面面。这一切的基础要归功于Hasor的插件化能力。
**Hasor的特点:**Hasor的设计思想是“微内核+插件”。微内核是指提供少量的必要功能的支持,其余功能全部通过插件化方式实现。这样扩展就可以通过添加插件而不需要修改核心框架。
Dataway接口配置服务
Dataway介绍
Dataway是基于DataQL服务聚合能力,为应用提供一个接口配置工具。是的使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过Dataway提供的UI界面完成。UI会以jar包放上提供并集成到应用中并和应用共享同一个http端口,应用无需单独为Dataway开辟新的管理端口。
优点可以是的大部分老项目都可以在无侵入的情况下直接应用Dataway。进而改进老项目的迭代效率,大大减少企业研发成本。
Dataway工具化的提供了DataQL配置能力。这种研发模式的变革使得,相当多的需求开发场景只需要配置即可完成交付。从而避免了从数据存取到前端接口之间一系列的开发任务。
Dataway的主打场景
-
取数据
-
在一些报表、看板纯展示类的项目中。所有接口可通过配置实现。所有取数逻辑全部通过DataQL+SQL方式满足。
-
对比往期项目对于后端技术人员的需求从3~5人通宵加班,直接缩减为1人配置化搞定。
-
即使要开发新逻辑,通过DataQL+SQL方式也可以快速完成。
-
-
存数据
-
如在某个ERP项目中,20多个表单页面。每个表单页面或多或少都有直接将单据数据录入到数据库的场景,每个单据的录入逻辑都有很大的不同,我们通过DataQL+SQL方式在早期用1000行左右的核心代码。其他数据存取逻辑全部配置化完成。
-
随着DataQL工具链完善,其中绝大部分场景都可以完成配置化无需开发。
-
-
数据聚合
- 和GraphQL相同,这是设计DataQL的初衷。将数据库和服务等多个接口进行汇聚然后返回给前端,这是DataQL的使命。Dataway使这一过程变得更加简单和高效。
Dataway的技术架构
- Dataway的架构中需要两张数据库表用来存放配置和发布的DataQL查询。
ORM误区:
- ORM最大的特点是具有Mapping过程,然后通过框架进行CRUD操作。如:Mybatis、Hibernate
- DataQL有很大不同,虽然DataQL提供了非常出色的基于SQL数据存取能力。但DataQL没有Mapping过程。
- 造成OEM错觉的适用于DataQL充分利用Udf和Dragment奇妙组合,提供了更便捷的数据存储逻辑配置化。但从技术架构上来审视它并不是ORM。
DataQL聚合查询引擎
DataQL介绍
DataQL(Data Query Language)是一种查询语言。旨在通过提供直观、灵活的语法来描述客户端应用程序的数据需求和交互。数据的存储根据其业务形式同城是比较简单的,并不适合直接在页面上进行展示。因此开发页面的前端工程师需要为此做大量的工作,这就是DataQL极力解决的问题。
特性
- 层次结构:多数产品都涉及数据的层次结构,为了保证结构的一致性DataQL结果也是分层的。
- 数据为中心:前端工程是一个比较典型的场景,但是 DataQL 不局限于此(后端友好性)。
- 弱类型定义:语言中不会要求声明任何形式的类型结构。
- 简单逻辑:具备简单逻辑处理能力:表达式计算、对象取值、条件分支、lambda和函数。
- 编译运行:查询的执行是基于编译结果的。
- 混合语言:允许查询中混合任意的其它语言代码,典型的场景是查询中混合 SQL 查询语句。
- 类 JS 语法:类JS语法设计,学习成本极低。
举例
下面这个 DataQL 从 user 函数中查询 id 为 4 的用户相关信息并返回给应用。
return userByID({'id': 4}) => {
'name',
'sex' : (sex == 'F') ? '男' : '女' ,
'age' : age + '岁'
}
返回结果:
{
'name' : '马三',
'sex' : '男',
'age' : '25岁'
}
UDF 开发:userByID
public class UserByIdUdf implements Udf {
public UserInfo call(Hints readOnly, Object[] params) {
...
}
}
public class ConsoleDemo {
public static void main(String[] args) {
AppContext appContext = Hasor.create().build((QueryModule) apiBinder -> {
apiBinder.addShareVarInstance("userByID", new UserByIdUdf());
});
DataQL dataQL = appContext.getInstance(DataQL.class);
QueryResult queryResult = dataQL.createQuery(
"return userByID({'id': 4}) => {" +
" 'name'," +
" 'sex' : (sex == 'F') ? '男' : '女' ," +
" 'age' : age + '岁'" +
"}"
).execute();
DataModel dataModel = queryResult.getData();
}
}
参考链接:DataQL 聚合查询引擎 - DataQL 聚合查询引擎 - ClouGence@Hasor
SpringBoot整合Dataway
引入依赖
Dataway是Hasor生态中的一员,使用Dataway第一步需要通过hasor-spring
打通连个生态。
<!-- 引入依赖 -->
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-spring</artifactId>
<version>4.2.2</version>
<!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/hasor-spring -->
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-dataway</artifactId>
<version>4.2.2</version>
<!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/hasor-dataway -->
</dependency>
启用Hasor
@EnableHasor() // 在Spring中启用Hasor
@EnableHasorWeb() // 将 hasor-web配置到Spring环境中,Dataway的UI通过hasor-web提供服务。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
只需要在Spring启动类上增加上面连个注解即可。
启用Dataway
在应用配置文件汇总启用Dataway
application.properties
中配置:
# 启用 Dataway 功能(默认不启用)
HASOR_DATAQL_DATAWAY=true
# 开启 ui 管理功能(注意生产环境必须要设置为 false,否则会造成严重的生产安全事故)
HASOR_DATAQL_DATAWAY_ADMIN=true
# (可选)API工作路径
HASOR_DATAQL_DATAWAY_API_URL=/api/
# (可选)ui 的工作路径,只有开启 ui 管理功能后才有效
HASOR_DATAQL_DATAWAY_UI_URL=/interface-ui/
application.yml
中配置:
# 启用 Dataway 功能(默认不启用)
HASOR_DATAQL_DATAWAY: true
# 开启 ui 管理功能(注意生产环境必须要设置为 false,否则会造成严重的生产安全事故)
HASOR_DATAQL_DATAWAY_ADMIN: true
# (可选)API工作路径
HASOR_DATAQL_DATAWAY_API_URL: /api/
# (可选)ui 的工作路径,只有开启 ui 管理功能后才有效
HASOR_DATAQL_DATAWAY_UI_URL: /interface-ui/
初始化必要的表(MySQL)
CREATE TABLE interface_info (
api_id varchar(64) NOT NULL COMMENT 'ID',
api_method varchar(12) NOT NULL COMMENT 'HttpMethod:GET、PUT、POST',
api_path varchar(512) NOT NULL COMMENT '拦截路径',
api_status varchar(4) NOT NULL COMMENT '状态:-1-删除, 0-草稿,1-发布,2-有变更,3-禁用',
api_comment varchar(255) NOT NULL COMMENT '注释',
api_type varchar(24) NOT NULL COMMENT '脚本类型:SQL、DataQL',
api_script mediumtext NOT NULL COMMENT '查询脚本:xxxxxxx',
api_schema mediumtext NOT NULL COMMENT '接口的请求/响应数据结构',
api_sample mediumtext NOT NULL COMMENT '请求/响应/请求头样本数据',
api_option mediumtext NOT NULL COMMENT '扩展配置信息',
api_create_time varchar(32) NOT NULL COMMENT '创建时间',
api_gmt_time varchar(32) NOT NULL COMMENT '修改时间',
PRIMARY KEY (api_id),
UNIQUE KEY uk_interface_info (api_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Dataway 中的API';
CREATE TABLE interface_release (
pub_id varchar(64) NOT NULL COMMENT 'Publish ID',
pub_api_id varchar(64) 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 varchar(4) NOT NULL COMMENT '状态:-1-删除, 0-草稿,1-发布,2-有变更,3-禁用',
pub_comment varchar(255) NOT NULL COMMENT '注释',
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 NOT NULL COMMENT '接口的请求/响应数据结构',
pub_sample mediumtext NOT NULL COMMENT '请求/响应/请求头样本数据',
pub_option mediumtext NOT NULL COMMENT '扩展配置信息',
pub_release_time varchar(32) NOT NULL COMMENT '发布时间(下线不更新)',
PRIMARY KEY (pub_id),
KEY idx_interface_release_api (pub_api_id),
KEY idx_interface_release_path (pub_path)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Dataway API 发布历史。'
其他数据库建表语句查看官方说明:a. Spring Boot整合 - Dataway接口配置服务 - ClouGence@Hasor
初始化数据源
@DimModule
@Component
public class ExampleModule implements SpringModule {
@Autowired
private DataSource dataSource = null;
public void loadModule(ApiBinder apiBinder) throws Throwable {
// .DataSource form Spring boot into Hasor
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
// .custom DataQL
//apiBinder.tryCast(QueryApiBinder.class).loadUdfSource(apiBinder.findClass(DimUdfSource.class));
//apiBinder.tryCast(QueryApiBinder.class).bindFragment("sql", SqlFragment.class);
}
}
Hasor启动的时候会调用loadModule方法,在这里再把DataSource设置到Hasor中。
启动工程
在启动日志中看到下列信息输出表示Dataway已经可以正常访问了。
2020-04-01 09:13:18.502 [main] INFO n.h.core.context.TemplateAppContext - loadModule class net.hasor.dataway.config.DatawayModule
2020-04-01 09:13:18.502 [main] INFO n.hasor.dataway.config.DatawayModule - dataway api workAt /api/
2020-04-01 09:13:18.502 [main] INFO n.h.c.e.AbstractEnvironment - var -> HASOR_DATAQL_DATAWAY_API_URL = /api/.
2020-04-01 09:13:18.515 [main] INFO n.hasor.dataway.config.DatawayModule - dataway admin workAt /interface-ui/
- dataway api workAt /api/ 表示 API 的工作路径。
- dataway admin workAt /interface-ui/ 表示 管理配置界面的地址。
此时访问:http://:/interface-ui/ 就可以看到配置页面了。
配置接口
Dataway提供两种语言模式,可以使用DataQL也可以直接使用SQL(Dataway内部SQL会被转为DataQL的形式执行)
具体操作页面说明可看如下链接:
列表页:b. 列表页 - Dataway接口配置服务 - ClouGence@Hasor
新建/编辑页:c. 新建/编辑页 - Dataway接口配置服务 - ClouGence@Hasor
API管理指南:d. API 管理指南 - Dataway接口配置服务 - ClouGence@Hasor
外部链接:
Hasor 项目的首页:https://www.hasor.net/web/index.html