Spring Boot集成ChatGPT API:从本地开发到生产部署全流程实战

张开发
2026/5/10 11:59:14 15 分钟阅读

分享文章

Spring Boot集成ChatGPT API:从本地开发到生产部署全流程实战
1. 项目概述与核心价值最近在折腾一个基于Spring Boot的ChatGPT在线演示项目就是GitHub上那个PlexPt/chatgpt-online-springboot。这项目说白了就是一个能让你快速搭建一个私有ChatGPT Web对话界面的Java后端服务。它不依赖官方网页版而是直接调用OpenAI的API让你能部署在自己的服务器上实现一个功能完整、可自定义的AI对话机器人。对于Java开发者尤其是那些熟悉Spring Boot生态的朋友来说这个项目非常有价值。它提供了一个现成的、结构清晰的样板让你能跳过从零开始的繁琐步骤直接上手体验如何将大语言模型API集成到自己的Java应用中。无论是想学习AI应用开发还是想快速搭建一个内部使用的智能问答工具这个项目都是一个不错的起点。它基于Java 8、Spring Boot和Maven技术栈非常主流对国内开发者非常友好。2. 项目架构与核心思路拆解2.1 技术选型与依赖解析这个项目选择的技术栈非常经典且务实。Spring Boot作为基础框架提供了自动配置、内嵌Web服务器默认是Tomcat和强大的依赖管理能力能让我们快速构建一个可独立运行的Web应用。Java 8虽然已经不是最新版本但其LTS长期支持特性和在业界的广泛普及度确保了项目的稳定性和兼容性降低了部署环境的门槛。Maven作为构建工具负责管理项目依赖、打包和生命周期是Java生态中的标准选择。核心依赖方面项目主要围绕与OpenAI API的交互。虽然原始README没有列出具体的pom.xml依赖但根据其功能推断必然会包含以下几个关键库Spring Boot Starter Web: 提供构建Web应用的基础能力如RESTful控制器、HTTP服务等。HTTP客户端库: 用于向api.openai.com发起请求。常见的选择有Spring的RestTemplate或更现代的WebClient也可能是第三方库如OkHttp或Apache HttpClient。一个设计良好的项目通常会抽象出一个HTTP服务层以便未来切换客户端。JSON处理库: 如Jackson用于序列化请求体和反序列化OpenAI返回的JSON响应。Spring Boot默认就集成了Jackson。配置管理: Spring Boot的spring-boot-starter本身就支持通过application.yml或application.properties进行灵活配置这正是项目中用来管理API Key列表的地方。这种选型的优势在于它构建了一个松散耦合的架构。业务逻辑处理对话、网络通信调用API和配置管理Key轮询被清晰地分层这使得代码易于维护、测试和扩展。例如如果你想更换为另一个大模型厂商的API理论上只需要修改HTTP客户端发送请求的部分和对应的DTO数据转换对象即可。2.2 核心工作机制API Key轮询与代理项目README中提到了两个关键技术点API Key轮询和代理配置。这是应对实际生产环境挑战的实用设计。API Key轮询机制在application.yml中配置一个Key列表程序会按顺序或随机使用这些Key去调用OpenAI API。这样做主要有两个目的负载均衡与频率限制规避OpenAI的API对每个Key有每分钟/每天的请求次数RPM/TPM限制。当单个Key的额度用尽时自动切换到下一个Key可以有效地提升服务的整体可用性和吞吐量避免因限流导致服务中断。灾备如果某个Key意外失效或被禁用轮询机制可以快速切换到其他可用Key保证服务的持续性。在代码层面通常会实现一个KeyManager或类似的组件。它内部维护一个可用Key的列表和一个索引指针。每次需要调用API时KeyManager提供当前Key并在调用成功后或根据策略在调用后将指针移到下一个Key。如果某个Key调用失败如返回429状态码表示限流管理器应能自动将其标记为“冷却中”并跳过使用下一个Key重试。代理配置由于网络访问限制部署在国内服务器的应用无法直接连接api.openai.com。README指出可以在ChatController中配置代理。这通常意味着在初始化HTTP客户端时为其设置一个代理服务器Proxy的地址和端口。例如如果你有一个运行在本机1080端口的SOCKS5代理就需要在创建RestTemplate或OkHttpClient实例时将代理信息注入进去。注意这里需要严格区分技术上的“代理配置”与任何违规的网络访问行为。此处的代理仅指在复杂企业网络或特定开发环境下为了解决服务端网络连通性而进行的标准技术配置与任何未经授权的跨境网络访问工具无关。开发者应确保其网络访问行为完全符合所在地的法律法规。3. 环境准备与项目初始化详解3.1 本地开发环境搭建要顺利运行这个项目你需要准备好以下环境我会详细说明每个步骤的要点和可能遇到的坑。1. Java 8安装与配置下载建议从Oracle官网或AdoptOpenJDK等开源发行版获取JDK 8的安装包。安装安装过程通常很简单。关键步骤在于配置环境变量。配置JAVA_HOME新建一个系统环境变量JAVA_HOME其值指向你的JDK安装目录例如C:\Program Files\Java\jdk1.8.0_381。配置PATH在系统的PATH变量中添加%JAVA_HOME%\bin。这样在命令行中就可以直接使用java和javac命令了。验证打开终端CMD或PowerShell输入java -version和javac -version如果正确显示版本信息如1.8.0_xxx说明配置成功。2. Maven安装与配置下载从Apache Maven官网下载二进制压缩包。安装解压到任意目录例如D:\apache-maven-3.9.6。配置环境变量新建MAVEN_HOME值为你的Maven解压目录。在PATH中添加%MAVEN_HOME%\bin。验证终端输入mvn -v应输出Maven版本、Java版本等信息。配置本地仓库与镜像加速下载修改Maven安装目录下conf/settings.xml文件。可以设置本地仓库路径localRepository更重要的是配置阿里云镜像将下载源替换为国内地址能极大提升依赖下载速度。mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror3. IntelliJ IDEA准备使用社区版免费或旗舰版均可。确保IDEA中配置的JDK和Maven路径与你系统环境变量中的一致。可以在File - Project Structure - Project和Settings - Build, Execution, Deployment - Build Tools - Maven中进行检查和设置。3.2 获取与导入项目源码1. 获取源码 通常有两种方式Git Clone如果你有Git环境在终端执行git clone https://github.com/PlexPt/chatgpt-online-springboot.git。这是最推荐的方式便于后续更新。直接下载ZIP在GitHub项目页面点击“Code”按钮选择“Download ZIP”然后解压到本地目录。2. 使用IDEA打开项目启动IntelliJ IDEA选择“Open”或“Open Project”然后导航到你克隆或解压的项目根目录即包含pom.xml文件的文件夹。IDEA会自动识别这是一个Maven项目并开始导入。底部会有一个进度条提示“Maven projects need to be imported”点击“Enable Auto-Import”是个好习惯这样每次pom.xml变化时IDEA会自动下载新依赖。首次导入时Maven会下载所有项目依赖包jar文件。这个过程的速度取决于你的网络和镜像配置。如果卡住可以检查网络或镜像设置。3. 项目结构初探 导入成功后你会在IDEA的侧边栏看到标准的Maven项目结构src ├── main │ ├── java │ │ └── com.plexpt.chatgptonlinejava // 包名可能不同但结构类似 │ │ ├── ChatgptOnlineJavaApplication.java // Spring Boot主启动类 │ │ ├── controller │ │ │ └── ChatController.java // 核心控制器处理Web请求 │ │ ├── service │ │ │ └── ChatService.java // 业务逻辑层可能包含调用API的核心代码 │ │ └── config // 可能存在的配置类 │ └── resources │ ├── application.yml // 主配置文件配置Key列表等 │ └── static // 可能存放前端静态资源HTML, JS, CSS └── test // 测试代码目录 pom.xml // Maven项目依赖定义文件花几分钟熟悉这个结构对后续的理解和修改非常有帮助。4. 核心配置与本地运行实操4.1 解密application.ymlAPI Key的配置艺术项目运行的核心在于src/main/resources/application.yml文件。根据README我们需要在这里配置OpenAI API Key列表。一个典型的配置可能长这样# application.yml 示例 server: port: 8080 # 服务启动端口可自定义 chatgpt: api: keys: - sk-your-first-openai-api-key-here-123456 - sk-your-second-openai-api-key-here-abcdef - sk-your-backup-key-here-789xyz # 可能还有其他配置如模型选择、超时时间等 model: gpt-3.5-turbo timeout: 30000 # 超时时间单位毫秒配置详解与注意事项Key的格式OpenAI的API Key通常以sk-开头。请确保从OpenAI平台正确获取。绝对不要将真实的API Key提交到公开的Git仓库中。.yml文件通常被.gitignore排除但务必再次确认。Key的数量README建议至少放入2个。这是为了轮询机制能发挥作用。如果只有一个Key那么轮询就失去了意义一旦该Key被限流服务就会立即中断。在实际使用中根据你的请求量准备3-5个Key是更稳妥的做法。重复KeyREADME提到“如果没有不同的Key可以重复使用相同的Key”。这是一个非常不推荐的做法。重复使用同一个Key完全无法起到负载均衡和规避限流的作用相当于没有配置轮询。它的唯一作用可能是让配置文件格式保持正确便于程序启动但在功能上是无效的。你应该尽可能使用不同的Key。配置的热更新标准的Spring Boot应用修改application.yml后需要重启才能生效。如果你希望实现不重启服务就能动态更新Key列表需要自己实现更复杂的逻辑例如将Key列表存储在数据库或配置中心并提供一个管理界面。4.2 启动项目与初步验证配置好application.yml后就可以启动项目了。1. 找到启动类 在IDEA的项目结构中找到src/main/java下的主类通常命名为ChatgptOnlineJavaApplication或Application其中包含标准的Spring Boot启动注解SpringBootApplication和一个main方法。2. 运行项目 右键点击这个类选择“RunChatgptOnlineJavaApplication.main()”。IDEA会开始编译并启动应用。控制台会输出Spring Boot的启动日志当你看到类似以下的日志时说明启动成功Started ChatgptOnlineJavaApplication in 5.123 seconds (JVM running for 6.456) Tomcat started on port(s): 8080 (http) with context path 3. 验证服务 打开你的浏览器访问http://localhost:8080。如果项目包含前端页面你应该能看到一个ChatGPT风格的聊天界面。如果只是一个纯后端API服务你可以尝试访问其健康检查端点或API文档端点如果集成了Swagger等工具例如http://localhost:8080/actuator/health需要Spring Boot Actuator依赖应该返回{status:UP}。4. 进行首次对话测试 在Web界面如果有的输入框中发送一条消息比如“你好”。观察浏览器开发者工具F12打开切换到Network标签页中的请求和响应或者查看IDEA控制台的后端日志。你应该能看到后端收到了请求并打印出调用OpenAI API的相关日志。如果一切正常你将很快收到AI的回复。实操心得第一次运行很可能失败。常见的失败原因有1) API Key无效或过期2) 网络问题导致无法连接OpenAI3)application.yml格式错误YAML对缩进非常敏感。请优先检查控制台报错信息。如果看到401 Unauthorized肯定是Key的问题如果看到连接超时ConnectTimeoutException则是网络问题。5. 深入核心代码ChatController与代理配置5.1 ChatController请求的入口与分发ChatController是这个Web应用的核心控制器它负责接收来自前端的HTTP请求通常是POST请求内容为用户的聊天消息然后将任务交给后端的ChatService处理最后将AI的回复返回给前端。我们来看一下一个典型的ChatController可能的结构RestController // 表明这是一个RESTful风格的控制器 RequestMapping(/api/chat) // 定义请求的基础路径 public class ChatController { Autowired // 自动注入业务逻辑服务 private ChatService chatService; PostMapping(/send) // 处理发送消息的POST请求 public ResponseEntityChatResponse sendMessage(RequestBody ChatRequest request) { // 1. 参数校验 (可选但推荐) if (request.getMessage() null || request.getMessage().trim().isEmpty()) { return ResponseEntity.badRequest().body(new ChatResponse(消息不能为空)); } // 2. 调用服务层处理核心逻辑 String aiResponse; try { aiResponse chatService.chat(request.getMessage()); } catch (Exception e) { // 3. 异常处理返回友好的错误信息 log.error(调用AI服务失败: , e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ChatResponse(服务暂时不可用请稍后重试)); } // 4. 封装并返回成功响应 return ResponseEntity.ok(new ChatResponse(aiResponse)); } }代码解析RestController和RequestMapping这是Spring MVC的标准注解定义了这是一个控制器并且所有映射路径都以/api/chat开头。PostMapping(“/send”)这意味着当前端向http://你的域名:端口/api/chat/send发送一个POST请求时就会触发这个sendMessage方法。RequestBody这个注解告诉Spring将HTTP请求体中的JSON数据自动反序列化成ChatRequest对象。ChatRequest是一个简单的Java类POJO通常包含message用户消息等字段。ChatService这是真正的业务逻辑所在。控制器只负责“协调”它接收请求校验参数调用服务处理异常并组织响应。这种分层设计使得代码职责清晰易于测试。ResponseEntity这是Spring提供的用于构建完整HTTP响应的类可以方便地设置状态码、响应头和响应体。5.2 代理配置的代码级实现README中提到代理可以在ChatController中配置这其实是一种简化的说法。更合理的做法是在创建HTTP客户端的地方进行配置而HTTP客户端通常被封装在ChatService或其依赖的某个HttpClient组件中。假设项目使用Spring的RestTemplate来调用OpenAI API那么配置代理的代码可能如下所示。我们通常会在一个配置类例如RestTemplateConfig中创建并配置RestTemplateBeanConfiguration public class RestTemplateConfig { Value(${proxy.host:null}) // 从配置文件中读取代理主机默认null private String proxyHost; Value(${proxy.port:null}) // 从配置文件中读取代理端口 private Integer proxyPort; Bean public RestTemplate restTemplate() { RestTemplate restTemplate new RestTemplate(); // 仅在配置了代理主机和端口时才设置代理 if (StringUtils.hasText(proxyHost) proxyPort ! null) { SimpleClientHttpRequestFactory requestFactory new SimpleClientHttpRequestFactory(); Proxy proxy new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)); requestFactory.setProxy(proxy); restTemplate.setRequestFactory(requestFactory); log.info(RestTemplate已配置代理: {}:{}, proxyHost, proxyPort); } else { log.info(RestTemplate未配置代理使用直连。); } // 可以在这里配置其他属性如连接超时、读取超时等 // requestFactory.setConnectTimeout(30000); // requestFactory.setReadTimeout(60000); return restTemplate; } }然后在application.yml中新增代理配置proxy: host: 127.0.0.1 # 你的代理服务器地址 port: 1080 # 你的代理服务器端口关键点解析配置化将代理信息放在配置文件中而不是硬编码在代码里这样在不同环境开发、测试、生产可以轻松切换甚至关闭代理。条件装配通过判断proxy.host和proxy.port是否有有效值来决定是否启用代理。这使得代码在没有代理的环境下也能正常运行。代理类型示例中使用了Proxy.Type.HTTP这是最常见的HTTP代理类型。如果你的代理是SOCKS5类型需要改为Proxy.Type.SOCKS。同时确保你的HTTP客户端库这里是SimpleClientHttpRequestFactory支持你设置的代理类型。服务层使用在ChatService中你会通过Autowired注入这个配置好的restTemplate然后使用它来向https://api.openai.com/v1/chat/completions发送POST请求请求体中携带你的消息和API Key。注意事项配置代理是为了解决服务器端的网络连通性问题。开发者必须确保所使用的代理方式是合法合规的并且有明确的授权。在任何情况下开发者和使用者都应严格遵守关于网络数据跨境传输的相关法律法规。6. 服务端部署与生产环境考量6.1 项目打包与JAR文件详解在本地开发测试无误后下一步就是打包并部署到服务器。README给出的命令是mvn package。打包过程详解在项目根目录有pom.xml的目录打开终端。执行mvn clean package。clean会先清理旧的编译输出确保打包干净。Maven会依次执行编译compile、运行测试test如果跳过测试可加-DskipTests、打包package等生命周期阶段。打包成功后在target/目录下会生成一个jar文件名称通常为chatgptonlinejava-0.0.1-SNAPSHOT.jar具体名字由pom.xml中的artifactId和version决定。这个JAR文件的特殊性它是一个Spring Boot构建的“可执行JAR”Executable Jar或“Fat JAR”。它不仅仅包含你编写的项目代码编译后的class文件还内嵌了所有依赖的第三方库如Spring Boot本身、HTTP客户端、JSON处理器等以及一个内嵌的Web服务器如Tomcat。这就是为什么你可以直接用java -jar命令运行它而不需要额外安装Tomcat。6.2 服务器环境准备与部署流程服务器基础环境操作系统Linux如CentOS、Ubuntu是生产环境首选Windows Server也可行但较少见。Java运行环境在服务器上安装JDK 8而不仅仅是JRE。因为某些库可能在运行时需要编译或工具支持。安装步骤与本地类似下载、解压、配置JAVA_HOME和PATH环境变量。使用java -version验证。网络与防火墙确保服务器的网络可以访问OpenAI API或你所配置的代理服务器。检查防火墙如firewalld或iptables是否放行了你应用要监听的端口默认为8080。如果打算用80或443端口对外通常会在应用前部署Nginx进行反向代理。部署与启动将打包好的jar文件上传到服务器可以使用scp、sftp或FTP等工具。scp target/chatgptonlinejava-0.0.1-SNAPSHOT.jar useryour-server-ip:/path/to/app/SSH登录到服务器导航到jar文件所在目录。使用最简单的命令启动java -jar chatgptonlinejava-0.0.1-SNAPSHOT.jar应用将在前台运行日志输出在当前终端。按CtrlC可停止。生产环境进阶启动方式 前台运行的方式不适合生产环境因为终端关闭后进程就结束了。我们需要让应用在后台稳定运行。使用nohup最简单nohup java -jar chatgptonlinejava-0.0.1-SNAPSHOT.jar app.log 21 nohup让进程忽略挂断信号即使退出终端也不停止。 app.log将标准输出重定向到app.log文件。21将标准错误也重定向到标准输出即也写入app.log。在后台运行。查看日志tail -f app.log。停止进程先ps -ef | grep java找到进程IDPID然后kill [PID]。使用Systemd推荐更专业 这是Linux系统标准的服务管理方式可以设置开机自启、自动重启、集中管理日志等。创建一个服务文件sudo vim /etc/systemd/system/chatgpt-online.service写入以下内容根据实际情况修改[Unit] DescriptionChatGPT Online SpringBoot Application Afternetwork.target [Service] Typesimple Userappuser # 建议用一个非root用户运行 WorkingDirectory/path/to/app ExecStart/usr/bin/java -jar /path/to/app/chatgptonlinejava-0.0.1-SNAPSHOT.jar Restarton-failure # 失败时自动重启 RestartSec10 [Install] WantedBymulti-user.target启用并启动服务sudo systemctl daemon-reload sudo systemctl enable chatgpt-online sudo systemctl start chatgpt-online查看状态和日志sudo systemctl status chatgpt-online sudo journalctl -u chatgpt-online -f # 查看实时日志6.3 使用Nginx进行反向代理与优化直接让Spring Boot应用监听80/443端口不是好习惯。通常的做法是让应用运行在8080等高位端口然后用Nginx作为反向代理对外提供80HTTP和443HTTPS服务。Nginx配置示例server { listen 80; server_name your-domain.com; # 你的域名 # 将HTTP请求重定向到HTTPS如果需要 # return 301 https://$server_name$request_uri; location / { proxy_pass http://127.0.0.1:8080; # 转发到Spring Boot应用 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 如果需要HTTPS server { listen 443 ssl http2; server_name your-domain.com; ssl_certificate /path/to/your/certificate.crt; ssl_certificate_key /path/to/your/private.key; # ... 其他SSL优化配置 ... location / { proxy_pass http://127.0.0.1:8080; # ... 同上保持头部信息 ... } }这样做的好处是Nginx可以处理静态文件效率更高、配置SSL证书、做负载均衡如果你部署了多个应用实例、设置缓存、防止一些常见的Web攻击等。7. 常见问题排查与性能优化实战7.1 启动与运行期问题排查在部署和运行过程中你几乎一定会遇到各种问题。下面是一个快速排查指南问题现象可能原因排查步骤与解决方案启动失败Port 8080 already in use端口被其他进程占用。1. netstat -tlnp启动失败APPLICATION FAILED TO START配置错误、依赖缺失、Bean创建失败等。仔细阅读控制台抛出的异常堆栈信息。最常见的是application.yml格式错误缩进不对、数据库连接失败、或某个被Autowired的Bean找不到。根据错误提示逐项检查。调用API返回401 UnauthorizedAPI Key无效、过期或格式错误。1. 检查application.yml中的Key是否正确前后有无多余空格。2. 登录OpenAI平台确认Key是否还有额度、是否被禁用。3. 确认请求头中Authorization字段的格式是否正确应为Bearer sk-xxx。调用API超时或连接失败网络不通无法访问api.openai.com。1. 在服务器上执行curl -v https://api.openai.com测试连通性。2. 如果服务器在国内且无特殊网络配置必然失败。需要按前文所述在代码中正确配置代理并确保代理服务器本身是可达且可用的。3. 检查防火墙规则。服务运行一段时间后内存飙升内存泄漏或JVM堆内存设置过小。1. Spring Boot应用默认内存占用不高但对话频繁可能累积。使用jps查看进程ID再用jmap -heap [pid]观察堆内存使用。2. 启动时设置JVM参数java -Xms512m -Xmx1024m -jar your-app.jar。-Xms初始堆-Xmx最大堆。3. 检查代码中是否有大的静态集合类不断增长而未清理。前端能打开但发送消息没反应前端请求的API地址不对或后端CORS跨域问题。1. 打开浏览器开发者工具F12的Network面板查看发送消息时请求的URL和响应状态码。2. 如果前端页面地址和后端API地址不同源域名、端口、协议任一不同浏览器会因同源策略阻止请求。需要在后端ChatController或全局配置中添加CORS配置CrossOrigin(origins “http://你的前端域名:端口”)7.2 性能优化与高可用思考当你的服务用户量增加时以下几个优化点值得考虑1. 连接池与HTTP客户端优化 如果使用RestTemplate默认它每次请求都会创建新的连接效率低下。应该使用带有连接池的HTTP客户端如HttpComponentsClientHttpRequestFactory基于Apache HttpClient或配置OkHttp3。Bean public RestTemplate restTemplate() { HttpComponentsClientHttpRequestFactory factory new HttpComponentsClientHttpRequestFactory(); // 设置连接池 PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(100); // 最大连接数 connectionManager.setDefaultMaxPerRoute(20); // 每个路由目标主机的最大连接数 // 设置超时 factory.setConnectTimeout(5000); factory.setReadTimeout(30000); CloseableHttpClient httpClient HttpClients.custom() .setConnectionManager(connectionManager) .build(); factory.setHttpClient(httpClient); return new RestTemplate(factory); }2. 异步处理与响应流 目前的同步处理方式用户必须等待整个AI响应生成完毕才能收到回复。对于长文本体验很差。OpenAI的API支持流式响应Streaming Response可以像ChatGPT官网那样一个字一个字地返回。后端可以将这个流实时地推送给前端通过SSE或WebSocket。这需要改造后端的ChatService和前端的交互逻辑复杂度较高但能极大提升用户体验。3. 引入缓存 对于一些常见的、重复性的问题例如“你是谁”、“怎么使用”可以将其问答对缓存起来使用Redis或内存缓存如Caffeine下次用户再问相同问题时直接返回缓存结果无需调用OpenAI API既能降低延迟又能节省Token消耗。4. 高可用部署多实例部署在一台服务器的多个端口或多个不同的服务器上启动多个应用实例。负载均衡使用Nginx作为负载均衡器将请求分发到后端的多个实例。在nginx.conf中配置upstream。upstream chatgpt_backend { server 127.0.0.1:8081; server 127.0.0.1:8082; # 可以配置权重、健康检查等 } server { location / { proxy_pass http://chatgpt_backend; } }状态外置如果你的应用有会话状态Session需要将其存储到外部如Redis确保任何一个实例挂掉用户会话不会丢失。5. 监控与告警 生产环境必须要有监控。可以集成Spring Boot Actuator暴露健康检查、指标等端点然后使用Prometheus采集指标Grafana进行可视化。监控关键指标应用QPS、响应时间、错误率、JVM内存和GC情况、API Key的调用频率和额度使用情况。设置告警规则当错误率升高或API额度即将用尽时及时通知负责人。这个项目作为一个Demo为我们打开了将大模型能力集成到Java应用的大门。从本地运行到服务器部署从基础功能到性能优化每一步都充满了工程实践的细节。我个人在多次部署类似服务后最大的体会是稳定性高于一切。做好日志记录、完善的异常处理、资源的监控告警比追求 fancy 的功能更重要。尤其是在处理外部API调用时网络波动、服务限流、额度耗尽都是常态你的代码必须能优雅地应对这些故障给用户一个明确的反馈而不是一个空白或错误的页面。

更多文章