Commit 1dc3420c authored by godkaikai's avatar godkaikai

支持非分离部署与页面优化

parent d8db52d0
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
实时即未来,Dlink 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。 实时即未来,Dlink 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。
Dlink 是一个交互式的 FlinkSQL Studio,可以在线开发、补全、校验 、执行、预览 FlinkSQL,支持 Flink 官方所有语法及其增强语法,并且可以同时对多 Flink 集群实例进行提交、停止、SavePoint 等运维操作,如同您的 IntelliJ IDEA For Flink SQL。 Dlink 是一个专业的 FlinkSQL Studio,可以在线开发、补全、校验 、执行、调试、预览 FlinkSQL,支持 Flink 官方所有语法及其增强语法,并且可以同时对多 Flink 集群实例进行提交、停止、SavePoint 等运维操作,如同您的 IntelliJ IDEA For Flink SQL。
需要注意的是:Dlink 更专注于 FlinkSQL 的应用,而不是 DataStream。在开发过程中您不会看到任何一句 java、scala 或者 python。所以,它的目标是基于 100% FlinkSQL 来实现批流一体的实时计算平台。 需要注意的是:Dlink 更专注于 FlinkSQL 的应用,而不是 DataStream。在开发过程中您不会看到任何一句 java、scala 或者 python。所以,它的目标是基于 100% FlinkSQL 来实现批流一体的实时计算平台。
...@@ -82,6 +82,10 @@ Dlink 是一个交互式的 FlinkSQL Studio,可以在线开发、补全、校 ...@@ -82,6 +82,10 @@ Dlink 是一个交互式的 FlinkSQL Studio,可以在线开发、补全、校
| | | 新增 savepoint 触发接口 | 0.5.0 | | | | 新增 savepoint 触发接口 | 0.5.0 |
| 关于 | 关于 Dlink | 版本更新记录 | 0.4.0 | | 关于 | 关于 Dlink | 版本更新记录 | 0.4.0 |
## 优势
## 部署 ## 部署
### 版本 ### 版本
...@@ -120,14 +124,15 @@ plugins/ ...@@ -120,14 +124,15 @@ plugins/
|- flink-table_2.11-1.13.3.jar |- flink-table_2.11-1.13.3.jar
|- mysql-connector-java-8.0.21.jar |- mysql-connector-java-8.0.21.jar
sql/ sql/
|- dlink.sql --Mysql初始化脚本 |- dlink.sql -- Mysql初始化脚本(首次部署执行这个)
|- dlink_history.sql -- Mysql各版本及时间点升级脚本
auto.sh --启动停止脚本 auto.sh --启动停止脚本
dlink-admin.jar --程序包 dlink-admin.jar --程序包
``` ```
解压后结构如上所示,修改配置文件内容。lib 文件夹下存放 dlink 自身的扩展文件,plugins 文件夹下存放 flink 及 hadoop 的官方扩展文件。其中 plugins 中的所有 jar 需要根据版本号自行下载并添加,才能体验完整功能,当然也可以放自己修改的 Flink 源码编译包。extends 文件夹只作为扩展插件的备份管理,不会被 dlink 加载。 解压后结构如上所示,修改配置文件内容。lib 文件夹下存放 dlink 自身的扩展文件,plugins 文件夹下存放 flink 及 hadoop 的官方扩展文件( 如果plugins下引入了flink-shaded-hadoop-3-uber 或者其他可能冲突的jar,请手动删除内部的 javax.servlet 等冲突内容)。其中 plugins 中的所有 jar 需要根据版本号自行下载并添加,才能体验完整功能,当然也可以放自己修改的 Flink 源码编译包。extends 文件夹只作为扩展插件的备份管理,不会被 dlink 加载。
在Mysql数据库中创建数据库并执行初始化脚本 在Mysql数据库中创建 dlink 数据库并执行初始化脚本 dlink.sql
执行以下命令管理应用。 执行以下命令管理应用。
...@@ -137,9 +142,12 @@ sh auto.sh stop ...@@ -137,9 +142,12 @@ sh auto.sh stop
sh auto.sh restart sh auto.sh restart
sh auto.sh status sh auto.sh status
``` ```
前端快捷访问(推荐):
如果plugins下引入了flink-shaded-hadoop-3-uber 的jar,请手动删除内部的 javax.servlet 后既可以访问默认 8888 端口号(如127.0.0.1:8888),正常打开前端页面。
前端 Nginx 部署: 前后端分离部署—— Nginx 部署(可选):
将 html 文件夹上传至 nginx 的 html 文件夹下,修改 nginx 配置文件并重启。 Nginx 如何部署请见百度或谷歌。
将 html 文件夹上传至 nginx 的 html 文件夹下或者指定 nginx 配置文件的静态资源绝对路径,修改 nginx 配置文件并重启。
```shell ```shell
server { server {
...@@ -183,7 +191,7 @@ sh auto.sh status ...@@ -183,7 +191,7 @@ sh auto.sh status
1. server.listen 填写前端访问端口 1. server.listen 填写前端访问端口
2. proxy_pass 填写后端地址如 http://127.0.0.1:8888 2. proxy_pass 填写后端地址如 http://127.0.0.1:8888
3. 将 html 文件夹下打包好的前端资源上传到 nginx 的 html 文件夹中,重启 nginx,访问即可。 3. 将 html 文件夹下打包好的前端资源上传到 nginx 的 html 文件夹中,如果 nginx 已经启动,则执行 nginx -s reload 重载配置,访问即可。
### 从源码编译 ### 从源码编译
...@@ -205,9 +213,9 @@ dlink -- 父项目 ...@@ -205,9 +213,9 @@ dlink -- 父项目
|-dlink-core -- 执行中心 |-dlink-core -- 执行中心
|-dlink-doc -- 文档 |-dlink-doc -- 文档
| |-bin -- 启动脚本 | |-bin -- 启动脚本
| |-bug -- bug 反馈
| |-config -- 配置文件 | |-config -- 配置文件
| |-doc -- 使用文档 | |-doc -- 使用文档
| |-extends -- Docker K8S模板
| |-sql -- sql脚本 | |-sql -- sql脚本
|-dlink-executor -- 执行中心 |-dlink-executor -- 执行中心
|-dlink-extends -- 扩展中心 |-dlink-extends -- 扩展中心
...@@ -241,11 +249,11 @@ mvn clean install -Dmaven.test.skip=true ...@@ -241,11 +249,11 @@ mvn clean install -Dmaven.test.skip=true
#### 扩展Connector及UDF #### 扩展Connector及UDF
将 Flink 集群上已扩展好的 Connector 和 UDF 直接放入 Dlink 的 lib 或者 plugins 下,然后重启即可。定制 Connector 过程同 Flink 官方一样。 将 Flink 集群上已扩展好的 Connector 和 UDF 直接放入 Dlink 的 plugins 下,然后重启即可。定制 Connector 过程同 Flink 官方一样。
#### 扩展Metadata #### 扩展Metadata
遵循SPI。 遵循SPI。请参考 dlink-meta-mysql 的实现。
#### 扩展其他版本的Flink #### 扩展其他版本的Flink
...@@ -329,6 +337,8 @@ AGG BY TOP2(value) as (value,rank); ...@@ -329,6 +337,8 @@ AGG BY TOP2(value) as (value,rank);
7.[Dlink On Yarn 三种 Flink 执行方式的实践](https://github.com/DataLinkDC/dlink/blob/main/dlink-doc/doc/DlinkOnYarn%E4%B8%89%E7%A7%8DFlink%E6%89%A7%E8%A1%8C%E6%96%B9%E5%BC%8F%E7%9A%84%E5%AE%9E%E8%B7%B5.md) 7.[Dlink On Yarn 三种 Flink 执行方式的实践](https://github.com/DataLinkDC/dlink/blob/main/dlink-doc/doc/DlinkOnYarn%E4%B8%89%E7%A7%8DFlink%E6%89%A7%E8%A1%8C%E6%96%B9%E5%BC%8F%E7%9A%84%E5%AE%9E%E8%B7%B5.md)
8.[Dlink 在 Flink-mysql-cdc 到 Doris 的实践](https://gitee.com/DataLinkDC/dlink/blob/main/dlink-doc/doc/Dlink%E5%9C%A8Flink-mysql-cdc%E5%88%B0Doris%E7%9A%84%E5%AE%9E%E8%B7%B5.md)
#### 常见问题及解决 #### 常见问题及解决
期待您提出问题。 期待您提出问题。
......
...@@ -126,6 +126,11 @@ ...@@ -126,6 +126,11 @@
<groupId>com.dlink</groupId> <groupId>com.dlink</groupId>
<artifactId>dlink-gateway</artifactId> <artifactId>dlink-gateway</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-mysql</artifactId>
<version>0.5.0-SNAPSHOT</version>
</dependency>
<!--<dependency> <!--<dependency>
<groupId>com.dlink</groupId> <groupId>com.dlink</groupId>
<artifactId>dlink-metadata-clickhouse</artifactId> <artifactId>dlink-metadata-clickhouse</artifactId>
...@@ -211,7 +216,7 @@ ...@@ -211,7 +216,7 @@
</configuration> </configuration>
</plugin>--> </plugin>-->
<!--<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>${maven.resource.version}</version> <version>${maven.resource.version}</version>
...@@ -227,14 +232,14 @@ ...@@ -227,14 +232,14 @@
<overwrite>true</overwrite> <overwrite>true</overwrite>
<resources> <resources>
<resource> <resource>
&lt;!&ndash; 因为dlink-web打包目录在项目跟目录,所以从这里复制 &ndash;&gt; <!-- 因为dlink-web打包目录在项目跟目录,所以从这里复制 -->
<directory>../dlink-web/dist</directory> <directory>../dlink-web/dist</directory>
</resource> </resource>
</resources> </resources>
</configuration> </configuration>
</execution> </execution>
</executions> </executions>
</plugin>--> </plugin>
</plugins> </plugins>
<finalName>${project.artifactId}-${project.version}</finalName> <finalName>${project.artifactId}-${project.version}</finalName>
</build> </build>
......
...@@ -18,7 +18,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { ...@@ -18,7 +18,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
// 注册Sa-Token的路由拦截器 // 注册Sa-Token的路由拦截器
registry.addInterceptor(new SaRouteInterceptor()) registry.addInterceptor(new SaRouteInterceptor())
.addPathPatterns("/**") .addPathPatterns("/api/*")
.excludePathPatterns("/api/login") .excludePathPatterns("/api/login")
.excludePathPatterns("/openapi/**"); .excludePathPatterns("/openapi/**");
} }
......
...@@ -11,11 +11,6 @@ import java.sql.SQLException; ...@@ -11,11 +11,6 @@ import java.sql.SQLException;
**/ **/
public abstract class AbstractDBQuery implements IDBQuery { public abstract class AbstractDBQuery implements IDBQuery {
@Override
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return false;
}
@Override @Override
public String[] columnCustom() { public String[] columnCustom() {
return null; return null;
......
...@@ -114,12 +114,4 @@ public interface IDBQuery { ...@@ -114,12 +114,4 @@ public interface IDBQuery {
* 自定义字段名称 * 自定义字段名称
*/ */
String[] columnCustom(); String[] columnCustom();
/**
* 判断主键是否为identity,目前仅对mysql进行检查
*
* @param results ResultSet
* @return 主键是否为identity
* @throws SQLException ignore
*/
boolean isKeyIdentity(ResultSet results) throws SQLException;
} }
...@@ -31,48 +31,36 @@ public class ClickHouseQuery extends AbstractDBQuery { ...@@ -31,48 +31,36 @@ public class ClickHouseQuery extends AbstractDBQuery {
return "db"; return "db";
} }
@Override @Override
public String tableName() { public String tableName() {
return "name"; return "name";
} }
@Override @Override
public String tableComment() { public String tableComment() {
return "comment"; return "comment";
} }
@Override @Override
public String columnName() { public String columnName() {
return "name"; return "name";
} }
@Override @Override
public String columnType() { public String columnType() {
return "type"; return "type";
} }
@Override @Override
public String columnComment() { public String columnComment() {
return "comment"; return "comment";
} }
@Override @Override
public String columnKey() { public String columnKey() {
return "KEY"; return "KEY";
} }
@Override
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return "auto_increment".equals(results.getString("Extra"));
}
@Override @Override
public String isNullable() { public String isNullable() {
return "NULL"; return "NULL";
......
...@@ -38,8 +38,4 @@ public class MySqlQuery extends AbstractDBQuery { ...@@ -38,8 +38,4 @@ public class MySqlQuery extends AbstractDBQuery {
return "Database"; return "Database";
} }
@Override
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return "auto_increment".equals(results.getString("Extra"));
}
} }
...@@ -42,37 +42,31 @@ public class OracleQuery extends AbstractDBQuery { ...@@ -42,37 +42,31 @@ public class OracleQuery extends AbstractDBQuery {
return "OWNER"; return "OWNER";
} }
@Override @Override
public String tableName() { public String tableName() {
return "TABLE_NAME"; return "TABLE_NAME";
} }
@Override @Override
public String tableComment() { public String tableComment() {
return "COMMENTS"; return "COMMENTS";
} }
@Override @Override
public String columnName() { public String columnName() {
return "COLUMN_NAME"; return "COLUMN_NAME";
} }
@Override @Override
public String columnType() { public String columnType() {
return "DATA_TYPE"; return "DATA_TYPE";
} }
@Override @Override
public String columnComment() { public String columnComment() {
return "COMMENTS"; return "COMMENTS";
} }
@Override @Override
public String columnKey() { public String columnKey() {
return "KEY"; return "KEY";
......
...@@ -17,7 +17,6 @@ public class PostgreSqlQuery extends AbstractDBQuery { ...@@ -17,7 +17,6 @@ public class PostgreSqlQuery extends AbstractDBQuery {
return "SELECT A.tablename, obj_description(relfilenode, 'pg_class') AS comments FROM pg_tables A, pg_class B WHERE A.schemaname='"+schemaName+"' AND A.tablename = B.relname"; return "SELECT A.tablename, obj_description(relfilenode, 'pg_class') AS comments FROM pg_tables A, pg_class B WHERE A.schemaname='"+schemaName+"' AND A.tablename = B.relname";
} }
@Override @Override
public String columnsSql(String schemaName,String tableName) { public String columnsSql(String schemaName,String tableName) {
return "SELECT A.attname AS name,format_type (A.atttypid,A.atttypmod) AS type,col_description (A.attrelid,A.attnum) AS comment,\n" + return "SELECT A.attname AS name,format_type (A.atttypid,A.atttypmod) AS type,col_description (A.attrelid,A.attnum) AS comment,\n" +
...@@ -30,37 +29,31 @@ public class PostgreSqlQuery extends AbstractDBQuery { ...@@ -30,37 +29,31 @@ public class PostgreSqlQuery extends AbstractDBQuery {
return null; return null;
} }
@Override @Override
public String tableName() { public String tableName() {
return "tablename"; return "tablename";
} }
@Override @Override
public String tableComment() { public String tableComment() {
return "comments"; return "comments";
} }
@Override @Override
public String columnName() { public String columnName() {
return "name"; return "name";
} }
@Override @Override
public String columnType() { public String columnType() {
return "type"; return "type";
} }
@Override @Override
public String columnComment() { public String columnComment() {
return "comment"; return "comment";
} }
@Override @Override
public String columnKey() { public String columnKey() {
return "key"; return "key";
......
...@@ -38,45 +38,46 @@ export default [ ...@@ -38,45 +38,46 @@ export default [
icon: 'task', icon: 'task',
component: './Task', component: './Task',
},*/ },*/
{
path: '/taskcenter/jar',
name: 'jar',
icon: 'code-sandbox',
component: './Jar',
},
], ],
}, },
{ {
path: '/clusters', path: '/registration',
name: 'clusters', name: 'registration',
icon: 'cluster', icon: 'appstore',
routes: [ routes: [
{ {
path: '/clusters/cluster', path: '/registration/cluster',
name: 'cluster', name: 'cluster',
icon: 'cluster', icon: 'cluster',
component: './Cluster', component: './Cluster',
}, },
{ {
path: '/clusters/clusterConfiguration', path: '/registration/clusterConfiguration',
name: 'clusterConfiguration', name: 'clusterConfiguration',
icon: 'setting', icon: 'setting',
component: './ClusterConfiguration', component: './ClusterConfiguration',
}, },
], {
path: '/registration/jar',
name: 'jar',
icon: 'code-sandbox',
component: './Jar',
}, },
{ {
path: '/database', path: '/registration/database',
name: 'database', name: 'database',
icon: 'database', icon: 'database',
component: './DataBase', component: './DataBase',
}, },
{ {
path: '/document', path: '/registration/document',
name: 'document', name: 'document',
icon: 'container', icon: 'container',
component: './Document', component: './Document',
}, },
],
},
{ {
path: '/', path: '/',
redirect: '/welcome', redirect: '/welcome',
......
...@@ -144,7 +144,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -144,7 +144,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
result.then(result=>{ result.then(result=>{
let newTabs = tabs; let newTabs = tabs;
let newPane:any = { let newPane:any = {
title: node!.name, title: <>{node!.icon} {node!.name}</>,
key: node!.taskId, key: node!.taskId,
value:(result.datas.statement?result.datas.statement:''), value:(result.datas.statement?result.datas.statement:''),
closable: true, closable: true,
......
This diff is collapsed.
...@@ -30,6 +30,17 @@ ...@@ -30,6 +30,17 @@
.ant-tabs-top > .ant-tabs-nav, .ant-tabs-bottom > .ant-tabs-nav, .ant-tabs-top > div > .ant-tabs-nav, .ant-tabs-bottom > div > .ant-tabs-nav { .ant-tabs-top > .ant-tabs-nav, .ant-tabs-bottom > .ant-tabs-nav, .ant-tabs-top > div > .ant-tabs-nav, .ant-tabs-bottom > div > .ant-tabs-nav {
margin: 0; margin: 0;
} }
.ant-tabs-card.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab {
padding: 4px 8px;
}
.ant-tabs-small>.ant-tabs-nav .ant-tabs-tab {
padding: 5px 0;
font-size: 14px;
}
.ant-tabs-editable-card .ant-tabs-tab .anticon {
margin-right: 4px;
vertical-align: text-top;
}
/* --- 水平 tabs --- end */ /* --- 水平 tabs --- end */
/* --- card 内偏移样式 --- start */ /* --- card 内偏移样式 --- start */
#studio_card > .ant-card-body { #studio_card > .ant-card-body {
......
...@@ -50,16 +50,16 @@ export default { ...@@ -50,16 +50,16 @@ export default {
'menu.editor.mind': '脑图编辑器', 'menu.editor.mind': '脑图编辑器',
'menu.editor.koni': '拓扑编辑器', 'menu.editor.koni': '拓扑编辑器',
'menu.demo': 'Demo 开发模板', 'menu.demo': 'Demo 开发模板',
'menu.clusters': '集群中心', 'menu.registration': '注册中心',
'menu.clusters.cluster': '集群实例', 'menu.registration.cluster': '集群实例',
'menu.clusters.clusterConfiguration': '集群配置', 'menu.registration.clusterConfiguration': '集群配置',
'menu.database': '数据源中心', 'menu.registration.database': '数据源管理',
'menu.studio': 'FlinkSql IDE', 'menu.studio': 'FlinkSql IDE',
'menu.flinksqlstudio': 'FlinkSql Studio', 'menu.flinksqlstudio': 'FlinkSQL Studio',
'menu.taskcenter': '作业中心', 'menu.taskcenter': '作业中心',
'menu.taskcenter.task': '作业管理', 'menu.taskcenter.task': '作业管理',
'menu.taskcenter.jar': 'Jar 管理', 'menu.registration.jar': 'Jar 管理',
'menu.document': '文档中心', 'menu.registration.document': '文档管理',
'menu.settings': '系统设置', 'menu.settings': '系统设置',
'menu.dev.flink': 'Flink 计算框架', 'menu.dev.flink': 'Flink 计算框架',
'menu.dev.flink.docs': '官方文档', 'menu.dev.flink.docs': '官方文档',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment