作者:哈库纳 \
起源:my.oschina.net/ta8210/blog/3234639
Dataway 介绍
Dataway 是基于 DataQL 服务聚合能力,为利用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需要的接口。整个接口配置、测试、冒烟、公布。一站式都通过 Dataway 提供的 UI 界面实现。UI 会以 Jar 包形式提供并集成到利用中并和利用共享同一个 http 端口,利用无需独自为 Dataway 开拓新的治理端口。
这种内嵌集成形式模式的长处是,能够使得大部分老我的项目都能够在无侵入的状况下间接利用 Dataway。进而改良老我的项目的迭代效率,大大减少企业我的项目研发老本。
Dataway 工具化的提供 DataQL 配置能力。这种研发模式的改革使得,相当多的需要开发场景只须要配置即可实现交付。从而防止了从数据存取到前端接口之间的一系列开发工作,例如:Mapper、BO、VO、DO、DAO、Service、Controller 通通不在须要。
Dataway 是 Hasor 生态中的一员,因而在 Spring 中应用 Dataway 首先要做的就是买通两个生态。
依据官网文档中举荐的形式咱们将 Hasor 和 Spring Boot 整合起来。
第一步:引入相干依赖
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-spring</artifactId>
<version>4.1.6</version>
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>hasor-dataway</artifactId>
<version>4.1.6</version>
</dependency>
hasor-spring 负责 Spring 和 Hasor 框架之间的整合。
hasor-dataway 是工作在 Hasor 之上,利用 hasor-spring 咱们就能够应用 dataway 了。
第二步:配置 Dataway,并初始化数据表
dataway 会提供一个界面让咱们配置接口,这一点相似 Swagger 只有 jar 包集成就能够实现接口配置。
找到咱们 springboot 我的项目的配置文件 application.properties。
Spring Boot 根底就不介绍了,举荐看这个:https://github.com/javastacks…
# 是否启用 Dataway 性能(必选:默认 false)HASOR_DATAQL_DATAWAY=true
# 是否开启 Dataway 后盾治理界面(必选:默认 false)HASOR_DATAQL_DATAWAY_ADMIN=true
# dataway API 工作门路(可选,默认:/api/)HASOR_DATAQL_DATAWAY_API_URL=/api/
# dataway-ui 的工作门路(可选,默认:/interface-ui/)HASOR_DATAQL_DATAWAY_UI_URL=/interface-ui/
# SQL 执行器方言设置(可选,倡议设置)HASOR_DATAQL_FX_PAGE_DIALECT=mysql
Dataway 一共波及到 5 个能够配置的配置项,但不是所有配置都是必须的。
其中 HASOR_DATAQL_DATAWAY、HASOR_DATAQL_DATAWAY_ADMIN 两个配置是必须要关上的,默认状况下 Datawaty 是不启用的。
Dataway 须要两个数据表能力工作,上面是这两个数据表的简表语句。上面这个 SQL 能够在 dataway 的依赖 jar 包中“META-INF/hasor-framework/mysql”目录上面找到,建表语句是用 mysql 语法写的。
其它数据库的建表语句请参看官网阐明手册:https://www.hasor.net/web/dataway/for_boot.html#mysql
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) NULL COMMENT '正文',
`api_type` varchar(24) NOT NULL COMMENT '脚本类型:SQL、DataQL',
`api_script` mediumtext NOT NULL COMMENT '查问脚本:xxxxxxx',
`api_schema` mediumtext NULL COMMENT '接口的申请 / 响应数据结构',
`api_sample` mediumtext NULL COMMENT '申请 / 响应 / 申请头样本数据',
`api_option` mediumtext NULL 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=0 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 NULL COMMENT '接口的申请 / 响应数据结构',
`pub_sample` mediumtext NULL COMMENT '申请 / 响应 / 申请头样本数据',
`pub_option` mediumtext NULL COMMENT '扩大配置信息',
`pub_release_time`datetime DEFAULT CURRENT_TIMESTAMP COMMENT '公布工夫(下线不更新)',
PRIMARY KEY (`pub_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='Dataway API 公布历史。';
create index idx_interface_release on interface_release (pub_api_id);
第三步:配置数据源
作为 Spring Boot 我的项目有着本人欠缺的数据库方面工具反对。咱们这次采纳 druid + mysql + spring-boot-starter-jdbc 的形式。
首先引入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
而后减少数据源的配置
# db
spring.datasource.url=jdbc:mysql://xxxxxxx:3306/example
spring.datasource.username=xxxxx
spring.datasource.password=xxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type:com.alibaba.druid.pool.DruidDataSource
# druid
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10
spring.datasource.druid.max-wait=60000
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=1
如果我的项目曾经集成了本人的数据源,那么能够疏忽第三步。
第四步:把数据源设置到 Hasor 容器中
Spring Boot 和 Hasor 本是两个独立的容器框架,咱们做整合之后为了应用 Dataway 的能力须要把 Spring 中的数据源设置到 Hasor 中。
首先新建一个 Hasor 的 模块,并且将其交给 Spring 治理。而后把数据源通过 Spring 注入进来。
@DimModule
@Component
public class ExampleModule implements SpringModule {
@Autowired
private DataSource dataSource = null;
@Override
public void loadModule(ApiBinder apiBinder) throws Throwable {
// .DataSource form Spring boot into Hasor
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
}
}
Hasor 启动的时候会调用 loadModule 办法,在这里再把 DataSource 设置到 Hasor 中。
第五步:在 SprintBoot 中启用 Hasor
@EnableHasor()
@EnableHasorWeb()
@SpringBootApplication(scanBasePackages = { "net.example.hasor"})
public class ExampleApplication {public static void main(String[] args) {SpringApplication.run(ExampleApplication.class, args);
}
}
这一步非常简单,只须要在 Spring 启动类上减少两个注解即可。
第六步:启动利用
利用在启动过程中会看到 Hasor Boot 的欢送信息
_ _ ____ _
| | | | | _ | |
| |__| | __ _ ___ ___ _ __ | |_) | ___ ___ | |_
| __ |/ _` / __|/ _ | '__| | _ < / _ / _ | __|
| | | | (_| __ (_) | | | |_) | (_) | (_) | |_
|_| |_|__,_|___/___/|_| |____/ ___/ ___/ __|
在前面的日志中还能够看到相似上面这些日志。
2020-04-14 13:52:59.696 [main] INFO n.h.core.context.TemplateAppContext - loadModule class net.hasor.dataway.config.DatawayModule
2020-04-14 13:52:59.697 [main] INFO n.hasor.dataway.config.DatawayModule - dataway api workAt /api/
2020-04-14 13:52:59.697 [main] INFO n.h.c.e.AbstractEnvironment - var -> HASOR_DATAQL_DATAWAY_API_URL = /api/.
2020-04-14 13:52:59.704 [main] INFO n.hasor.dataway.config.DatawayModule - dataway admin workAt /interface-ui/
2020-04-14 13:52:59.716 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[901d38f22faa419a8593bb349905ed0e] -> bindType‘class net.hasor.dataway.web.ApiDetailController’mappingTo:‘[/interface-ui/api/api-detail]’.
2020-04-14 13:52:59.716 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[c6eb9f3b3d4c4c8d8a4f807435538172] -> bindType‘class net.hasor.dataway.web.ApiHistoryListController’mappingTo:‘[/interface-ui/api/api-history]’.
2020-04-14 13:52:59.717 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[eb841dc72ad54023957233ef602c4327] -> bindType‘class net.hasor.dataway.web.ApiInfoController’mappingTo:‘[/interface-ui/api/api-info]’.
2020-04-14 13:52:59.717 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[96aebb46265245459ae21d558e530921] -> bindType‘class net.hasor.dataway.web.ApiListController’mappingTo:‘[/interface-ui/api/api-list]’.
2020-04-14 13:52:59.718 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[7467c07f160244df8f228321f6262d3d] -> bindType‘class net.hasor.dataway.web.ApiHistoryGetController’mappingTo:‘[/interface-ui/api/get-history]’.
2020-04-14 13:52:59.719 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[97d8da5363c741ba99d87c073a344412] -> bindType‘class net.hasor.dataway.web.DisableController’mappingTo:‘[/interface-ui/api/disable]’.
2020-04-14 13:52:59.720 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[8ddc3316ef2642dfa4395ca8ac0fff04] -> bindType‘class net.hasor.dataway.web.SmokeController’mappingTo:‘[/interface-ui/api/smoke]’.
2020-04-14 13:52:59.720 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[cc06c5fb343b471aacedc58fb2fe7bf8] -> bindType‘class net.hasor.dataway.web.SaveApiController’mappingTo:‘[/interface-ui/api/save-api]’.
2020-04-14 13:52:59.720 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[7915b2b1f89a4e73891edab0264c9bd4] -> bindType‘class net.hasor.dataway.web.PublishController’mappingTo:‘[/interface-ui/api/publish]’.
2020-04-14 13:52:59.721 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[0cfa34586455414591bdc389bff23ccb] -> bindType‘class net.hasor.dataway.web.PerformController’mappingTo:‘[/interface-ui/api/perform]’.
2020-04-14 13:52:59.721 [main] INFO net.hasor.core.binder.ApiBinderWrap - mapingTo[37fe4af3e2994acb8deb72d21f02217c] -> bindType‘class net.hasor.dataway.web.DeleteController’mappingTo:‘[/interface-ui/api/delete]’.
当看到“dataway api workAt /api/”、dataway admin workAt /interface-ui/ 信息时,就能够确定 Dataway 的配置曾经失效了。
第七步:拜访接口治理页面进行接口配置
在浏览器中输出“http://127.0.0.1:8080/interfa… 就能够看到期待已久的界面了。
第八步:新建一个接口
Dataway 提供了 2 中语言模式,咱们能够应用弱小的 DataQL 查询语言,也能够间接应用 SQL 语言(在 Dataway 外部 SQL 语言也会被转换为 DataQL 的模式执行。)
首先咱们在 SQL 模式下尝试执行一条 select 查问,立即就能够看到这条 SQL 的查问后果。
同样的形式咱们应用 DataQL 的形式须要这样写:
var query = @@sql()<%
select * from interface_info
%>
return query()
其中 var query = @@sql()<% … %> 是用来定义 SQL 内部代码块,并将这个定义存入 query 变量名中。<% %> 两头的就是 SQL 语句。
最初在 DataQL 中调用这个代码块,并返回查问后果。
当接口写好之后就能够保留公布了,为了测试不便,我选用 GET 形式。
接口公布之后咱们间接申请:http://127.0.0.1:8080/api/dem…
最初总结
通过下面的几个步骤咱们介绍了如何基于 Spring Boot 我的项目应用 Dataway 来简略的配置接口。
Dataway 的形式的确给人耳目一新,一个接口居然能够如此简略的配置进去无需开发任何一行代码,也不须要做任何 Mapping 实体映射绑定。
最初放几个有用的连贯:
- Dataway 官网手册:https://www.hasor.net/web/dat…
- Dataway 在 OSC 上的我的项目地址,欢送珍藏:https://www.oschina.net/p/dat…
- DataQL 手册地址:https://www.hasor.net/web/dat…
- Hasor 我的项目的首页:https://www.hasor.net/web/ind…
作者:哈库纳 \
起源:my.oschina.net/ta8210/blog/3234639
近期热文举荐:
1.600+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!