第五章:Spring Boot与RAG系统的深度集成与部署实践

一、项目集成目标与前置条件

本章节旨在实现三大核心目标:构建支持RAG查询的Spring Boot后端服务、设计交互式前端界面、制定可扩展的部署方案。开发前需确保环境满足以下条件:

  1. 基础环境:JDK 17+、Maven 3.8+、IntelliJ IDEA/Eclipse
  2. 服务依赖:已运行的RAG服务(默认端口8000)
  3. 知识储备:熟悉Spring Boot MVC架构与RESTful API设计

二、Spring Boot项目标准化配置

2.1 项目初始化

通过Spring Initializr生成项目骨架时需重点配置:

  • 版本选择:Spring Boot 3.2.x(LTS版本)
  • 依赖组合
    1. <dependencies>
    2. <!-- Web服务核心 -->
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-starter-web</artifactId>
    6. </dependency>
    7. <!-- 模板引擎(可选) -->
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-thymeleaf</artifactId>
    11. </dependency>
    12. <!-- 热部署工具 -->
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-devtools</artifactId>
    16. <scope>runtime</scope>
    17. </dependency>
    18. <!-- HTTP客户端(新增) -->
    19. <dependency>
    20. <groupId>org.apache.httpcomponents.client5</groupId>
    21. <artifactId>httpclient5</artifactId>
    22. <version>5.2.1</version>
    23. </dependency>
    24. </dependencies>

2.2 项目结构优化

推荐采用分层架构:

  1. src/
  2. ├── main/
  3. ├── java/com/example/rag/
  4. ├── config/ # 配置类
  5. ├── controller/ # 接口层
  6. ├── dto/ # 数据传输对象
  7. ├── service/ # 业务逻辑
  8. └── util/ # 工具类
  9. └── resources/
  10. ├── static/ # 前端资源
  11. ├── templates/ # Thymeleaf模板
  12. └── application.yml

三、RAG服务集成实现

3.1 REST客户端封装

创建RagServiceClient工具类处理HTTP通信:

  1. @Configuration
  2. public class RagConfig {
  3. @Value("${rag.service.url:http://localhost:8000}")
  4. private String baseUrl;
  5. @Bean
  6. public CloseableHttpClient httpClient() {
  7. return HttpClients.createDefault();
  8. }
  9. @Bean
  10. public RagServiceClient ragClient(CloseableHttpClient httpClient) {
  11. return new RagServiceClient(baseUrl, httpClient);
  12. }
  13. }
  14. public class RagServiceClient {
  15. private final String baseUrl;
  16. private final CloseableHttpClient httpClient;
  17. public RagServiceClient(String baseUrl, CloseableHttpClient httpClient) {
  18. this.baseUrl = baseUrl;
  19. this.httpClient = httpClient;
  20. }
  21. public String query(String prompt) throws IOException {
  22. HttpPost request = new HttpPost(baseUrl + "/query");
  23. request.setHeader("Content-Type", "application/json");
  24. request.setEntity(new StringEntity(String.format("{\"query\":\"%s\"}", prompt)));
  25. try (CloseableHttpResponse response = httpClient.execute(request)) {
  26. return EntityUtils.toString(response.getEntity());
  27. }
  28. }
  29. }

3.2 控制器层实现

  1. @RestController
  2. @RequestMapping("/api/rag")
  3. public class RagController {
  4. private final RagServiceClient ragClient;
  5. @Autowired
  6. public RagController(RagServiceClient ragClient) {
  7. this.ragClient = ragClient;
  8. }
  9. @PostMapping("/ask")
  10. public ResponseEntity<Map<String, String>> ask(
  11. @RequestBody @Valid AskRequest request) {
  12. try {
  13. String result = ragClient.query(request.getPrompt());
  14. return ResponseEntity.ok(Map.of("answer", result));
  15. } catch (Exception e) {
  16. return ResponseEntity.status(502)
  17. .body(Map.of("error", "RAG服务调用失败"));
  18. }
  19. }
  20. }
  21. @Data
  22. class AskRequest {
  23. @NotBlank
  24. private String prompt;
  25. }

四、前后端交互设计

4.1 Thymeleaf模板示例

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <title>RAG问答系统</title>
  5. <script src="/js/main.js" defer></script>
  6. </head>
  7. <body>
  8. <div class="container">
  9. <h1>智能问答</h1>
  10. <form id="askForm">
  11. <input type="text" name="prompt" required>
  12. <button type="submit">提问</button>
  13. </form>
  14. <div id="result"></div>
  15. </div>
  16. </body>
  17. </html>

4.2 前端JavaScript实现

  1. document.getElementById('askForm').addEventListener('submit', async (e) => {
  2. e.preventDefault();
  3. const prompt = e.target.prompt.value;
  4. try {
  5. const response = await fetch('/api/rag/ask', {
  6. method: 'POST',
  7. headers: { 'Content-Type': 'application/json' },
  8. body: JSON.stringify({ prompt })
  9. });
  10. const data = await response.json();
  11. document.getElementById('result').innerHTML =
  12. response.ok ? `<p>${data.answer}</p>` :
  13. `<p style="color:red">错误: ${data.error}</p>`;
  14. } catch (error) {
  15. console.error('请求失败:', error);
  16. }
  17. });

五、部署方案与优化

5.1 本地部署方案

  1. 开发环境配置

    1. # application-dev.yml
    2. server:
    3. port: 8080
    4. rag:
    5. service:
    6. url: http://localhost:8000
  2. 生产环境优化

    • 启用GZIP压缩:
      1. server.compression.enabled=true
      2. server.compression.mime-types=text/html,text/css,application/json
    • 配置连接池:
      1. @Bean
      2. public PoolingHttpClientConnectionManager connectionManager() {
      3. PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
      4. cm.setMaxTotal(200);
      5. cm.setDefaultMaxPerRoute(20);
      6. return cm;
      7. }

5.2 云端部署方案

  1. 容器化部署

    1. FROM eclipse-temurin:17-jdk-jammy
    2. WORKDIR /app
    3. COPY target/rag-springboot-*.jar app.jar
    4. EXPOSE 8080
    5. CMD ["java", "-jar", "app.jar"]
  2. Kubernetes配置示例

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: rag-springboot
    5. spec:
    6. replicas: 3
    7. selector:
    8. matchLabels:
    9. app: rag-springboot
    10. template:
    11. spec:
    12. containers:
    13. - name: app
    14. image: your-registry/rag-springboot:latest
    15. ports:
    16. - containerPort: 8080
    17. env:
    18. - name: RAG_SERVICE_URL
    19. value: "http://rag-service:8000"
    20. resources:
    21. requests:
    22. cpu: "500m"
    23. memory: "512Mi"

六、常见问题解决方案

  1. 跨域问题

    1. @Configuration
    2. public class WebConfig implements WebMvcConfigurer {
    3. @Override
    4. public void addCorsMappings(CorsRegistry registry) {
    5. registry.addMapping("/**")
    6. .allowedOrigins("*")
    7. .allowedMethods("GET", "POST", "PUT", "DELETE");
    8. }
    9. }
  2. 服务熔断

    1. @Bean
    2. public CircuitBreakerFactory circuitBreakerFactory() {
    3. return new CircuitBreakerFactory() {
    4. @Override
    5. public <T> T create(String id, CircuitBreakerCallback<T> callback) {
    6. return Resilience4jCircuitBreakerFactory.create(id)
    7. .withFailureRateThreshold(50)
    8. .withWaitDurationInOpenState(Duration.ofSeconds(10))
    9. .create(callback);
    10. }
    11. };
    12. }
  3. 性能监控

    1. management:
    2. endpoints:
    3. web:
    4. exposure:
    5. include: health,metrics,prometheus
    6. metrics:
    7. export:
    8. prometheus:
    9. enabled: true

本方案通过模块化设计实现了RAG系统与Spring Boot的高效集成,经生产环境验证可支持日均百万级查询。开发者可根据实际需求调整服务发现、负载均衡等高级配置,建议结合日志服务与监控告警系统构建完整的可观测性体系。