基于GitBucket的Hook构建ES检索PDF等文档全栈方案

背景

之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo,预期建设方案是使用触发器类型从公共的文档源拉取最新的文件,然后调用Java将文件转Base64后入ES建索引,再提供封装接口给前端做查询之用。

由于全部内容过长,为了便于阅读,按照大的章节分为三部分,第一部分讲述基于WebHook的触发机制怎么搭建,包含全部实现细节!

使用Git Hook获取文件变化

我们内部使用了GitBucket,因此方案采用它的WebHook功能来实现。 GitBucket支持Webhook功能,允许你设置一个URL,当特定的Git事件发生时(如push事件),GitBucket会向这个URL发送一个POST请求。

这个功能可以在【设置】-【Service Hooks】找到!

但是看介绍这需要一个接收Webhook事件的URL,因此我们需要创建一个SpringBoot的Rest服务来提供这个功能。

SpringBoot脚手架

使用阿里云脚手架创建初始化项目:https://start.aliyun.com/

创建一个hello world接口:

java 复制代码
@GetMapping("/hello")  
public String hello() {  
    // 获取当前日期和时间  
    LocalDateTime dateTime = LocalDateTime.now();  
    // 定义日期和时间格式  
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
  
    return "Welcome! Now is:" + dateTime.format(formatter) + "\n";  
}

启动应用进行冒烟测试,使用浏览器访问:http://localhost:8080/hello 返回:Welcome! Now is:2024-03-05 15:45:57

完美!

上述测试成功后,创建一个Webhook的测试接口,代码如下:

java 复制代码
package com.es.file.search;  
  
import org.springframework.http.ResponseEntity;  
import org.springframework.web.bind.annotation.PostMapping;  
import org.springframework.web.bind.annotation.RequestBody;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class MyController {  
    @PostMapping("/gitbucket/webhook")  
    public ResponseEntity<?> handleGitBucketWebhook(@RequestBody String payload) {  
        // 处理GitBucket发送的Webhook事件  
        // 解析JSON,获取事件信息  
        // 提取变更的文件列表  
        // 处理文件  
        System.out.println(payload);  
        return ResponseEntity.ok().build();  
    }  
}

测试一下接口,使用后台curl命令发送请求:

shell 复制代码
curl -XPOST -H "Content-Type: application/json" -d '{"key1":"value1", "key2":"value2"}' http://localhost:8080/gitbucket/webhook

上述命令发送后,后台打印:

至此本地的测试Rest接口已经大功告成了。

Hook实测

登录到GitBucket,打开想监控的仓库设置,找到Webhook部分并添加一个新的Webhook:

  • Payload URL: 填写你的服务接收Webhook事件的URL,就是上面的测试接口。
  • Content type : 选择application/json
  • Events : 选择push,这样只有当有新的提交推送到仓库时,你的服务才会收到通知。
  • Active: 确保这个Webhook是激活状态。

上面第一个参数的url填好之后,它右侧直接就有一个测试按钮,点击测试通过的结果是这样的(注意响应码是200):

然后我们给仓库推送一个更新,看看打印的内容是什么。

格式化打印

在此之前我们先做一个json格式化的操作,以免打印的内容过长无法阅读。

首先引入一个新的依赖:

xml 复制代码
<dependency>  
    <groupId>org.json</groupId>  
    <artifactId>json</artifactId>  
    <version>20210307</version>  
</dependency>

然后打印的代码修改如下:

java 复制代码
import org.json.JSONObject;

JSONObject jsonObject = new JSONObject(payload);  
String formattedJsonString = jsonObject.toString(4);  
System.out.println(formattedJsonString);

重启应用。

我在后台push了一条变更之后,应用立即收到更新消息,Server端的打印截图:

WebHook发送消息体内容较多,至少包含了该提交增删改查的信息,如removed表示删除了哪些内容,added额度表示新增了哪些文件,我们可以重点关注addedmodified,针对新增和修改的内容进行进一步的处理。

下一步动作

总体思路,基于前面已经搭建的WebHook触发流程,接收到push更新消息之后,使用本地的git工具拉取最新变动。这些文件与我们的ES应用在同一台机器上,然后Java可以读取这些文件转码并交给ES处理。

相关推荐
morris1311 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
stewie630 分钟前
在IDEA中使用Git
java·git
阿伟*rui3 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
paopaokaka_luck5 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
Yaml47 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~7 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616887 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
程序媛小果8 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
晓理紫9 小时前
使用git lfs向huggingface提交较大的数据或者权重
git
AskHarries10 小时前
Spring Boot集成Access DB实现数据导入和解析
java·spring boot·后端