Dataway搭建数据服务

Dataway简化了大数据场景下接口开发与管理工作,通过SQL配置即可快速上线接口。本文介绍Dataway的安装配置步骤,包括依赖引入、服务启动及操作界面使用,并展示了如何通过Dataway支持Elasticsearch查询。
摘要由CSDN通过智能技术生成

        对于大数据场景,计算的业务逻辑基本都在数据处理过程中完成,最后往往会持久化下来计算的结果,存储在mysql,es,hbase等适合提供查询的地方。而对于在不同数据库上的数据,需要开发接口,管理接口也是一个不小的工作量。Dataway的出现,正好解决了这个场景下的接口开发,管理等问题。只需要通过SQL,Dataql等配置就能完成一个接口的上线,大大提高了开发效率,以及管理成本。对于数据中台建设中,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


import net.hasor.spring.boot.EnableHasor;
import net.hasor.spring.boot.EnableHasorWeb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import static net.hasor.spring.boot.WorkAt.Interceptor;


@EnableHasor
@EnableHasorWeb(at =Interceptor )
@SpringBootApplication
@Configuration
public class DatawayApplication implements WebMvcConfigurer {

	public static void main(String[] args) {
		SpringApplication.run(DatawayApplication.class, args);
	}

}

启用 Dataway

然后第二步,在应用的 application.properties 配置文件中启用 Dataway

# 启用 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/
# SQL执行器方言设置(可选,建议设置)
HASOR_DATAQL_FX_PAGE_DIALECT=mysql

初始化必要的表(例: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 发布历史。'

初始化数据源

@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);
    }
}

最后一步,将 Spring 使用的数据源导入到 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://<yourIP>:<yourProt>/interface-ui/ 就可以看到配置页面了。

高可用

多节点部署,通过nginx等做负载均衡

二、操作界面

新增

点击页面顶部的 New 就可以进入新增接口页面。

Dataway在大数据场景应用

在新增页面中,最主要的是要设置API的请求地址和方法。在保存 API 的时候 dataway 会对 Api 地址进行校验。

合法的API地址中只能包含下列字符: ! $ ' ( ) * + , - . / : ; = @ _ ~ [0-9] [a-z] [A-Z]

编辑器中开放了 POSTPUTGETDELETE 四个可选的 Http Method。

在保存时如果遇到错误会有类似下面这样的提示(下列是,API地址冲突的错误提示)

Dataway在大数据场景应用

提示

请注意 API 创建就不允许修改请求地址和方法,可以删除重建API来达到更名目的。

Dataway在大数据场景应用

新增接口时会展示一段 HelloWord 用例,这个用例中包含了请求一个接口传入一个 message 参数,然后利用 DataQL 查询获取这个参数并将其返回。

开发者可以在新建接口时直接点击工具条中的 Execute 图标执行得到运行结果。

执行

在任意的编辑器界面中(新增模式 or 编辑模式),都可以直接在编辑区编写 DataQL 查询并通过右上角的 Execute 按钮执行。

Dataway在大数据场景应用

发布

当接口开发配置完成,需要将其发布以供使用。一个接口的发布上线要经历三个过程,具体如下:

Dataway在大数据场景应用

Execute

调试当前编辑器中的 DataQL 查询。

Smork Test

冒烟测试。和 Execute 不同,Smork 同样是执行 DataQL 查询并要求查询正常执行完毕。但是区别 Execute 的是 Smork 不会使用编辑器中的 DataQL 查询语句,而是到数据库中获取对应的查询语句。

因为接口的发布也是将数据中的 DataQL 查询语句进行发布。

Publish

当冒烟测试通过之后就可以点击发布按钮把接口发布上线了。每次发布 Dataway 都会在 interface_release 表中新增一条记录。

删除/下线

Dataway在大数据场景应用

已经发布上线的接口只能执行接口下线操作。

Dataway在大数据场景应用

已经下线的接口或者正在编辑中的接口可以执行删除操作,删除操作会物理删除 interface_info 表中对应的记录。

但是删除操作并不会删除曾经的发布历史,这就留给我们了一条可以找回被删除的接口曾经发布过的历史记录。只不过这一步只能进入数据库中自行搜索。

发布历史

每个 Dataway 上的接口在发布时都会 在 interface_release 表中生成一条记录。发布历史看的就是这里的记录。

Dataway在大数据场景应用

在历史记录列表的右侧 icon 按可以恢复历史记录的内容到编辑器中。

三、ES支持

为了方便对ES的访问,增加了Dataway对Es的Sql支持;

引入依赖

<dependency>
            <groupId>org.es</groupId>
            <artifactId>sql2dsl-toolkit</artifactId>
            <version>5.4.0</version>
</dependency>

由于我们的es5.4,版本比较低,所以引入的sql2dsl-toolkit

SQL语法参见:
https://github.com/gitchennan/elasticsearch-query-toolkit/wiki/elasticsearch-query-toolkit-help-doc

添加ES属性到配置文件 application.properties

spring.data.elasticsearch.cluster-nodes=host1:port1,host2:port2
spring.data.elasticsearch.cluster-name=xxxx

增加ESSQL执行器

执行器是 DataQL 的一个 FragmentProcess 扩展


import net.hasor.core.DimModule;
import net.hasor.dataql.DimFragment;
import net.hasor.dataql.FragmentProcess;
import net.hasor.dataql.Hints;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.search.SearchHit;
import org.es.sql.bean.ElasticSqlParseResult;
import org.es.sql.parser.ElasticSql2DslParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

import static java.util.Arrays.stream;

@DimModule
@Component
@DimFragment("esV2")
public class ESQueryV2 implements FragmentProcess {

    @Autowired
    private Client esClient;


    @Override
    public Object runFragment(Hints hint, Map<String, Object> params, String fragmentString) throws Throwable {

//        System.out.println("参数:"+params);
        /**
         * sql 语法见 :https://github.com/gitchennan/elasticsearch-query-toolkit/wiki/elasticsearch-query-toolkit-help-doc
         */

        //获取 fragmentString 中#{xx} 字符替换
        String runsql = fragmentString;
        for(String key:params.keySet()){
            runsql = runsql.replace("#{"+key+"}",params.get(key).toString());
        }
        System.out.println(runsql);

        ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser(); //解析SQL
        ElasticSqlParseResult parseResult = sql2DslParser.parse(runsql); //生成DSL(可用于rest api调用)
        String dsl = parseResult.toDsl();
        System.out.println(dsl);


        //Client esClient = init();
        //toRequest方法接收一个clinet对象参数
        SearchRequestBuilder searchReq = parseResult.toRequest(esClient); //执行查询
        SearchResponse response = searchReq.execute().actionGet();
        SearchHit[] searchHits  = response.getHits().getHits();

        return stream(searchHits).map(x -> x.getSource()).toArray();
    }
}

新建HasorModule配置


import net.hasor.core.DimModule;
import net.hasor.dataql.QueryApiBinder;
import net.hasor.dataql.QueryModule;
import net.hasor.db.JdbcModule;
import net.hasor.db.Level;
import net.hasor.spring.SpringModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;

//import net.hasor.dataql.fx.db.LookupDataSourceListener;


@DimModule
@Component
public class DatawayModule implements SpringModule,QueryModule {

    @Autowired
    private DataSource dataSource = null;


    @Override
    public void loadModule(QueryApiBinder apiBinder) throws Throwable {
        apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
        apiBinder.loadFragment(ESQueryV2.class,springTypeSupplier(apiBinder));  //集成sql2dsl-toolkit

    }
}

重新启动服务即可

效果

Dataway在大数据场景应用

四、总结

数据部门使用Dataway来作为数据统一服务是比较快捷高效的选择;但是基于Dataway还有很多细节需要完善,比如多种流行的数据源的支持,接口权限的控制等,都需要实现相应的接口。

引用:

Dataway官方文档:
https://www.hasor.net/doc/

ES查询SQL语法参见:
https://github.com/gitchennan/elasticsearch-query-toolkit/wiki/elasticsearch-query-toolkit-help-doc

要登录Dataway,您可以按照以下步骤进行操作: 1. 在ruoyi-admin模块下的application.yml或者application.properties配置文件中,启用Dataway功能。您可以在配置文件中添加以下内容: ``` # 启用Dataway功能(默认不启用) HASOR_DATAQL_DATAWAY: true ``` 2. 在启动类中开启Hasor。您可以在启动类上添加`@EnableHasor`注解。 3. 访问Dataway登录页面。默认情况下,Dataway的登录页面地址为`/api/interface-ui/`。您可以在配置文件中配置ui的工作路径,确保该路径有效。例如: ``` # ui的工作路径,只有开启ui管理功能后才有效 HASOR_DATAQL_DATAWAY_UI_URL: /api/interface-ui/ ``` 4. 使用初始登录账号登录。您可以在Hasor Dataway的配置文件中找到初始登录账号信息。 请注意,为了确保生产环境的安全,您应该将`HASOR_DATAQL_DATAWAY_ADMIN`设置为`false`,以避免潜在的安全问题。 #### 引用[.reference_title] - *1* *2* [springboot整合hasor-dataway](https://blog.csdn.net/weixin_42402326/article/details/127449765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SpringBoot集成Hasor dataway,实现轻便数据查询接口](https://blog.csdn.net/weixin_44752033/article/details/115588348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值