ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SqlRest 1.6 PG版IDEA启动实战:SQL秒变REST API

SqlRest 1.6 PG版IDEA启动实战:SQL秒变REST API 做数据服务中间层的同学多少都遇到过这种场景数据库里SQL写得飞起但每次要提供给前端或第三方系统一个接口就得写一大圈Controller、Service、Mapper。SqlRest这个开源项目就是冲这个痛点来的而我今天要聊的SqlRest 1.6算是这个项目里比较成熟的版本PG版则是用PostgreSQL作为目标数据源的适配方案。这篇文章就拿我的实际经历来说讲清楚怎么在IDEA里把SqlRest 1.6PG版跑起来包括环境检查、配置修改、完整启动流程以及我踩过的一些坑适合想把SQL快速发布成REST API、又不想先搭一套部署环境的同学。1. SqlRest是干什么的为什么非要跑PG版1.1 数据服务化的核心思路先把这个项目的定位说透。绝大多数企业内部的数据对接本质上是“某张表或某个查询结果需要以HTTP接口形式被别人调用”。传统做法是写一套后端服务把SQL包在Mapper里再通过Service、Controller一层层暴露出去。这本身没问题但如果你有十几个业务库、上百张表每个表都要单独写接口开发和维护成本就上来了。SqlRest做的事情就一句话你在页面上写SQL它帮你把这个SQL发布成一个HTTP接口。请求参数可以自动绑定到SQL变量里返回结果统一处理成JSON。这样遇到临时统计、报表查询、数据导出这类需求不用再写后端代码只要会写SQL就能出接口效率完全是另一个量级。PG版就是它的一个特定形态。SqlRest本身可以连多种数据库而我在实际项目里用的是PostgreSQL所以直接选了PG版。这里的“PG版”不是说这个软件只能用PG而是指它内置的方言适配、连接配置、初始化脚本都优先按PostgreSQL来设计的对用PG库的团队来说上手更顺。1.2 为什么选择在IDEA里启动而不是打包部署很多人会问既然项目都开源了为什么不直接下载一个发行包跑起来非要放到IDEA里启动我的理由很实在如果你只是为了试用发行包确实更快但如果你要改数据源、调SQL、改返回字段、甚至二次开发IDEA里启动才是正确打开方式。SqlRest 1.6本身是Spring Boot项目源码结构里包含服务端、管理页面、数据源模块等。放在IDEA里跑的好处有三个改完配置直接重启不用打镜像、传服务器调试成本低日志、断点、依赖关系都在IDE里出了问题能直接定位后面对接公司内部的数据源、做权限扩展可以直接在源码层面改。而且说实话在IDEA里启动一个Spring Boot项目本来就是Java后端工程师的日常操作SqlRest在这里面并没有额外增加什么门槛。真正麻烦的其实是配置和依赖这部分恰恰是我这次踩坑最多的地方后面一块儿说。1.3 PG版和默认版的关键差异这里要提醒第一次接触的同学SqlRest的PG版不是说下载下来就能直接用它和MySQL版的差异主要在几个地方驱动依赖不同默认工程可能带的是MySQL驱动PG版需要pom里明确引入postgresql驱动版本要和你的PG数据库对应配置文件里的URL写法不同PG连接串是jdbc:postgresql://ip:port/database不是MySQL那种jdbc:mysql://ip:port/database初始化脚本不同SqlRest启动时需要维护一些系统表PG语法和MySQL语法有差异脚本文件不能混用。我见过有人直接用MySQL版的配置去跑PG版结果启动报driver not found或者建表语法错误这就是没搞清楚两者差异造成的。后面我会把每一步的配置贴出来。2. 启动前必须确认的环境版本和准备工作2.1 JDK、IDEA、Maven的组合怎么选说实话SqlRest 1.6对环境的挑剔程度不算高但版本选不对启动时会出现各种莫名其妙的问题。我这里列一下我自己验证过的一套组合不一定是最新的但绝对稳定组件版本说明JDK8或11我用的11如果项目里有老依赖8也能跑IntelliJ IDEA2021.3及以上社区版也行功能不影响启动Maven3.6.3以上主要影响依赖下载速度PostgreSQL12及以上9.6也能跑但建议12Lombok插件IDEA自带项目里用了不少Lombok注解编译需要它有一个容易忽略的点IDEA里设置JDK时要确保Project SDK和Maven使用的JDK一致。我之前遇到过IDEA编译用的JDK17但Maven走的是系统环境变量里的JDK8结果启动时类编译和运行时不匹配报了一堆NoSuchMethodError。后来把IDEA的Project Structure里的SDK和Maven Runner的JRE都统一到同一版本问题就没了。2.2 Maven依赖下载慢的解决办法SqlRest 1.6的依赖不算少尤其第一次导入项目时要拉Spring Boot、MyBatis、各种连接池、工具包网络不好的话可能挂很久。这里我建议先把Maven镜像切到国内源在~/.m2/settings.xml里配置阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror另外IDEA里尽量开启Maven的自动导入但不要同时开两个模块的自动构建。SqlRest是多模块工程模块之间有依赖关系如果IDEA还在后台编译的时候你就急着启动经常出现“找不到符号”或类加载不完整的情况。我现在的习惯是刚拉完代码先让IDEA构建一会儿等右下角的后台任务全走完再操作。2.3 PostgreSQL数据库的正确初始化这一步很多人会忽略但SqlRest不是连上一个PG库就能跑的它自己也需要一些元数据表来管理API配置、用户信息、审计日志之类的。如果你直接启动日志里会出现类似relation does not exist的错误其实就是初始化脚本没执行。PG版通常带有对应的初始化SQL文件一般在doc或sql目录下名字里会带pg。执行时需要注意在目标数据库上执行比如先建一个sqlrest数据库用psql -U 用户名 -d sqlrest -f 初始化脚本.sql执行执行前确认脚本里没有MySQL特有的语法比如反引号、ENGINEInnoDB这类。执行完之后可以简单查一下系统表\dt如果能看到api_info、data_source这类表说明初始化没问题。2.4 一个容易翻车的细节连接串和时区PostgreSQL的连接串和MySQL相比参数少很多但也正因为少很多人会漏掉一个关键项currentSchema。如果你的SqlRest系统表和你要发布的业务表不在同一个schema下最好在连接串里显式指定不然发布接口后可能查不到表jdbc:postgresql://127.0.0.1:5432/sqlrest?currentSchemapublic另外时区参数也建议加上。PostgreSQL本身能处理带时区的timestamp但JDBC驱动层如果和应用服务器时区不一致返回给前端的时间字段可能多八个小时。我习惯在连接串后面带一个TimeZoneAsia/Shanghai或者在PG的url上写成jdbc:postgresql://127.0.0.1:5432/sqlrest?currentSchemapublicTimeZoneAsia/Shanghai这个问题在后续接口联调时才会暴露排查起来很浪费时间提前配好能省不少事。3. IDEA里完整启动流程从拉源码到控制台出现启动成功3.1 获取源码并导入IDEASqlRest 1.6 PG版的源码在Gitee上有对应的仓库搜“SqlRest”一般能找到官方仓库注意选择PG分支或者带pg标识的版本。下载方式我建议直接用IDEA的Git集成拉取git clone -b 分支名 仓库地址拉下来之后IDEA里选择Open或New - Project from Existing Sources选中根目录的pom.xml用Maven方式导入。这里有个经验之谈不要直接打开文件夹然后等IDEA自行识别那样容易把多模块结构搞乱。选中pom.xml导入IDEA会自动识别所有子模块并且把依赖关系梳理出来。导入完成后检查一下右边Maven面板如果Modules里展示出server、api、common之类的模块就说明结构识别正常。如果只显示一个根工程多半是IDEA没正确解析可以在pom.xml上右键选择Add as Maven Project。3.2 配置文件要改的四个位置跑通整个项目理论上你只需要改一处核心配置application.yml里的数据源。但以我实际经验看如果你所在的网络环境、数据库账号权限有限制还需要多留意几个位置第一处数据源配置。我把改造后的核心内容贴一下注意我标注的字段server: port: 8181 servlet: context-path: / spring: datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://127.0.0.1:5432/sqlrest?currentSchemapublicTimeZoneAsia/Shanghai username: postgres password: 你的密码 hikari: maximum-pool-size: 10driver-class-name这个字段很关键。很多人在IDEA里跑默认工程时看到依赖里有postgresql的jar就以为驱动没问题但Spring Boot启动时如果没明确指定driver它会按照url自动推断推断失败的报错非常隐晦。建议直接把上面这段抄进去。第二处如果工程里还有单独的redis或缓存配置按需修改地址。SqlRest 1.6某些版本会把部分配置缓存放到redis里不配置时走本地缓存所以这个看版本而定不用强求。第三处日志级别。启动排查时可以把日志调到DEBUGlogging: level: com.sqlrest: DEBUG正常跑通后记得调回INFO不然日志会多得刷屏。第四处端口冲突。server.port默认值在不同版本里不一样一般以你自己工程里的配置为准。如果启动时提示端口被占用不要急着改配置文件先查是谁占用的。3.3 启动类的正确选择多模块工程最容易踩的坑就是启动类选错。SqlRest工程里可能同时存在多个带SpringBootApplication或EnableAutoConfiguration的类有管理后台的有服务端的甚至还有测试模块里的。启动哪个取决于你要跑哪个端。以数据服务发布为主的话启动类一般在server模块下类的名字和包名里通常带server或application字样。启动方式有两种在启动类左侧点绿色三角形直接Run或者在IDEA右上角配置一个Spring Boot运行配置指定Main class。我自己习惯用第二种因为可以在VM options里加一些临时参数比如不想改配置文件时临时指定端口-Dserver.port8182注意启动类所在的模块其pom.xml里应该依赖了其它所有模块。如果Module里没有显示依赖完整运行时会直接ClassNotFoundException这个问题我后面专门说。3.4 看到哪些日志才算启动成功很多新手启动Spring Boot项目看到一堆日志刷出来就以为成功了等访问页面发现打不开再回头看日志才发现根本没起来。这里给一个判定标准包括两个阶段的信号第一阶段Spring Boot的启动日志里出现Started Application in x.xxx seconds这个日志出现说明应用上下文初始化完成、端口也已经绑定成功。第二阶段访问管理端页面或接口文档页面页面正常返回。如果前后端分离管理页面可能有单独的端口或路径需要确认前端资源是否被正确加载。一般日志里出现Tomcat started on port(s): 8181之后打开浏览器访问http://localhost:8181能出页面就算基本成功。启动过程如果持续输出ERROR不要慌先把第一行完整的异常堆栈看完再往后翻Caused by。大多数时候问题都出在数据库连接和初始化SQL上。4. 启动过程中最常见的五类报错与排查链路4.1 数据库连接不上的完整排查思路我在IDEA里跑SqlRest时遇到最多的就是数据库连接相关报错。常见表现是启动日志里出现Cannot create PoolableConnectionFactory Connection to 127.0.0.1:5432 refused遇到这个别急着怀疑程序按下面顺序排查确认PostgreSQL服务真的在监听。命令行执行psql -h 127.0.0.1 -p 5432 -U postgres能连上就说明服务正常排查防火墙。如果PostgreSQL装在虚拟机或远程服务器上确认5432端口放行本机直连一般没这个问题检查pg_hba.conf。PG默认只监听本机或特定网段如果IDEA和数据库不在同一台机器连接串可以通但认证会因pg_hba.conf的规则被拒报错是password authentication failed或者no pg_hba.conf entry确认连接串里数据库名是否存在。很多人把初装时默认的postgres库当业务库但这库一般不能用来自建表建议按前面说的建一个专用库。这里给个对照表方便快速定位报错关键字常见原因处理方式Connection refused服务没启/端口不对/防火墙先本地用psql验证password authentication failed密码错误或pg_hba认证方式问题检查user/password检查pg_hba.confrelation does not exist初始化SQL没执行执行doc目录下的PG初始化脚本FATAL: database does not existURL里数据库名错误手动创建sqlrest库No suitable driver缺驱动或没配driver-class-name确认pom里有postgresql依赖配driver4.2 编译错误和依赖缺失的排查多模块工程在IDEA里启动第二类高频报错是编译期或类加载期出错典型的有java: package com.sqlrest.api does not exist这个问题的根源绝大多数情况下是模块依赖没被IDEA正确识别。解决办法是打开Maven面板先执行根工程的clean再执行install让所有模块的产物安装到本地仓库mvn clean install -DskipTests -Uinstall成功后IDEA里右键项目根目录选择Reload Maven Project再重新启动。如果还不行把IDEA缓存清理一下File - Invalidate Caches / Restart。这个过程看着粗暴实际解决90%的IDEA多模块问题。还有一个细节如果你用的IDEA社区版且没装Lombok插件编译时会报找不到Slf4j相关的getter/setter方法。确认插件市场里Lombok已经启用并且开启了Annotation ProcessingSettings - Build, Execution, Deployment - Compiler - Annotation Processors 勾选 Enable annotation processing4.3 启动成功后页面打不开的排查日志显示启动成功但浏览器访问不到页面这种问题往往比启动失败还让人烦躁。我遇到的几种情况按出现频率排一下第一端口被人改了。有些人喜欢在启动参数里指定多个--server.port结果实际生效的和自己心里记的对不上。直接看日志里的Tomcat initialized with port(s): 8181到底写的多少。第二context-path不是根路径。有的初始化配置文件把server.servlet.context-path设成了/api那么访问地址就变成了http://localhost:8181/api。页面打不开很可能是路径漏了。第三前端资源没编译。SqlRest如果带了管理后台页面并且是用Vue之类的前端工程那么启动时可能还需要先构建前端资源把dist目录里的静态文件放到后端资源目录下。这个在新手阶段最容易懵——明明后端起来了页面就是白屏或404。解决方法是回到工程里看是否有前端构建文档。4.4 连接池初始化慢或超时PG数据库连接池初始化一般很快但如果你发现启动卡在HikariPool-1 - Start completed后面很久没反应很可能是连接池在尝试获取连接时等了很久因为网络原因或认证超时才失败。此时日志里通常会有Connection is not available, request timed out after xxxms的错误。处理办法把hikari的connection-timeout调低比如3000毫秒这样连接失败能快速暴露不用等默认30秒。另外确认一下maximum-pool-size是否设置过大远程连PG时默认10就够用不需要调太高否则只是白白占用数据库连接数。4.5 时区、JSON序列化等隐性问题最后这一类排查起来比较费时间因为启动过程完全不报错是到了接口返回数据时才出问题。比如时间字段比数据库时间多了8小时或少了8小时。前面已经提到连接串加TimeZoneAsia/Shanghai这里再补充一点如果返回JSON里时间格式还是带T的UTC格式看下工程里是否有全局Jackson配置通常在application.yml里可以加spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai这个配置加上后时间相关字段的展示会清爽很多和前端联调时少很多扯皮。5. 启动之后的接口验证与日常开发提效5.1 用接口文档页验证服务是否正常SqlRest启动成功后通常自带接口文档页面一般是一个Swagger UI或者类似的API管理页面。我习惯先打开这个页面做三件事验证服务健康查看是否有数据源管理入口确认我配置的PG数据源已经被正确识别查看系统表初始化是否完整比如用户、权限、API配置等页面能不能正常显示新建一个最简单的查询接口比如select 1 as id然后通过文档页面的调试按钮直接调用确认整个链路通顺。这里有个小技巧不要一上来就发布复杂的业务SQL先用最简单的SQL跑通全链路。如果最简单的接口能返回正常JSON说明数据源、驱动、配置都没问题后续SQL有问题基本可以界定为SQL语法或表权限问题排查面小很多。5.2 发布第一个数据服务接口的完整操作当你确认服务健康后可以尝试发布一个真实的数据服务接口。整个过程大致分成四步第一在数据源管理里找到你已经配置好的PG数据源测试连接确认连通性。第二新建API填写接口路径比如/api/v1/user/list在SQL编辑区写你的查询语句SELECT id, name, email FROM users WHERE org_id :orgId这里的:参数表示可以从HTTP请求里动态传入的变量SqlRest会自动把请求参数绑定进去。第三设置参数和返回格式。你可以控制哪些字段暴露给调用方、响应格式是JSON还是其它格式这里按业务需要配置。第四保存并发布。发布后试着用curl调用curl -X POST http://localhost:8181/api/v1/user/list \ -H Content-Type: application/json \ -d {orgId: 12}如果正常返回JSON数据那么这个接口就已经可以被业务方直接调用了。5.3 IDEA里的三个提效配置项目跑通之后日常开发中还有几个配置能让体验好很多。第一个是热部署。SqlRest是Spring Boot工程如果你频繁改SQL或配置每次手动重启很浪费时间。在pom里引入spring-boot-devtools后IDEA里双按CtrlF9就能触发重启。不过这里要注意devtools会让完整上下文重启连接池、缓存都会重建临时调试可行但不要在生产打包时带上。第二个是让IDEA自动生成运行参数。如果你经常要切换数据库环境可以在Run Configuration的Active profiles里配置不同的profile不用反复改application.yml。比如开发环境用dev测试环境用test前提是工程里已经有多套配置文件。第三个是建立HTTP Client请求集合。IDEA自带的.http文件可以直接保存接口调用记录比在Swagger页面上反复点按钮舒服得多。我会把常用接口的请求保存下来包括参数、Header这样回归测试时直接跑一遍就行。6. 最后再说几句实际体会SqlRest 1.6 PG版在IDEA里启动本质上是一个标准的Spring Boot项目启动流程难点不在IDEA本身而在于对项目结构、数据库初始化、模块依赖关系的理解。我把这次折腾的经验总结成几句话先确认PG库初始化好再改数据源配置然后等到IDEA完全索引完再启动报错时从头看完整异常栈最后用最简单的SQL验证服务健康。如果你照着这条路走半天内把服务在本地跑起来是完全可以做到的。后续不管是做二次开发还是把数据服务接口交给业务方使用都能在这个基础上顺畅进行。我最后悔的一点是刚开始没仔细看文档里的初始化SQL导致在表缺失的问题上卡了两个小时希望大家不要再踩这个坑。
返回列表