data gateway_交通运输部监测调度

data gateway_交通运输部监测调度对于大数据场景,计算的业务逻辑基本都在数据处理过程中完成,最后往往会持久化下来计算的结果,存储在mysql,es,hbase等适合提供查询的地方。而对于在不同数据库上的数据,需要开发接口,管理接口也是一个不小的工作量。Dataway的出现,正好解决了这个场景下的接口开发,管理等问题。只需要通过SQL,Dataql等配置就能完成一个接口的上线,大大提高了开发效率,以及管理成本。对于数据中台建设中,Dataway可以使用在统一服务层,对接各种数据源,管理数据出口。一、安装引入依赖Da…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

        对于大数据场景,计算的业务逻辑基本都在数据处理过程中完成,最后往往会持久化下来计算的结果,存储在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>

Jetbrains全家桶1年46,售后保障稳定

启用 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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234563.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 解决Pycharm运行速度慢的方法「建议收藏」

    解决Pycharm运行速度慢的方法「建议收藏」用惯了Jupyter,Spyder的开发者切换到Pycharm时,发现不论是打开IDE的速度,还是调试的速度都慢的让人想砸电脑,笔者在这花了好长时间生闷气,最终总结了几个坑来解决运行速度慢的问题,希望能帮到大家。1.扩大Pycharm运行内存打开后找到-Xms-Xmx两行,增加运行内存(根据电脑配置,笔者是8G内存),可明显改善打开IDE的速度2.新建工程选择Python解释器笔者常用Anaconda,因此选用了它3.解决运行时查看变量速度慢的方法File->Setting-&gt

  • vuetify富文本编辑器_vue富文本编辑器的使用

    vuetify富文本编辑器_vue富文本编辑器的使用最近再弄一个后台管理系统,挑选了不少的编辑器,最终选择了tinymce,UI精美,功能模块多,可按需加载配置来一张tinymce官网的完整功能的图(没梯子可能访问速度有点慢…)下面开始工作:插件安装tinymce官方提供了一个vue的组件tinymce-vue如果有注册或购买过服务的话,直接通过组件配置api-key直接使用,像我这种懒的注册或者购买的直接下载tinymce,自力更生…

  • 视频标清、高清、全高清的分类分辨率码率帧率参考(附图)

    视频标清、高清、全高清的分类分辨率码率帧率参考(附图)视频标清、高清、全高清的分类分辨率码率帧率参考(附图)视频标清、高清、全高清的分类分辨率码率帧率参考(附图)

  • eclipse下载及安装教程[通俗易懂]

    eclipse下载及安装教程[通俗易懂]eclipse下载及安装教程Java编程最好的集成开发工具就是IBM研发的Eclipse软件,Eclipse完全免费,是java开发人员的必备平台。进入eclipse下载页,界面如下图所示:(附加官网下载链接:https://www.eclipse.org/downloads/)eclispe提供了两种下载方式。一种是下载安装程序,下载后直接运行安装程序,根据安装程序的提示选择安装选项并完成安装;一种是下载具有不同功能项的eclispe压缩包,下载后手动解压即可。第一种——安装程序方式

  • 浅谈C++多态性

    浅谈C++多态性

  • Laravel之队列「建议收藏」

    Laravel之队列「建议收藏」Laravel之队列

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号