一、项目集成目标与前置条件
本章节旨在实现三大核心目标:构建支持RAG查询的Spring Boot后端服务、设计交互式前端界面、制定可扩展的部署方案。开发前需确保环境满足以下条件:
- 基础环境:JDK 17+、Maven 3.8+、IntelliJ IDEA/Eclipse
- 服务依赖:已运行的RAG服务(默认端口8000)
- 知识储备:熟悉Spring Boot MVC架构与RESTful API设计
二、Spring Boot项目标准化配置
2.1 项目初始化
通过Spring Initializr生成项目骨架时需重点配置:
- 版本选择:Spring Boot 3.2.x(LTS版本)
- 依赖组合:
<dependencies><!-- Web服务核心 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 模板引擎(可选) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!-- 热部署工具 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><!-- HTTP客户端(新增) --><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.2.1</version></dependency></dependencies>
2.2 项目结构优化
推荐采用分层架构:
src/├── main/│ ├── java/com/example/rag/│ │ ├── config/ # 配置类│ │ ├── controller/ # 接口层│ │ ├── dto/ # 数据传输对象│ │ ├── service/ # 业务逻辑│ │ └── util/ # 工具类│ └── resources/│ ├── static/ # 前端资源│ ├── templates/ # Thymeleaf模板│ └── application.yml
三、RAG服务集成实现
3.1 REST客户端封装
创建RagServiceClient工具类处理HTTP通信:
@Configurationpublic class RagConfig {@Value("${rag.service.url:http://localhost:8000}")private String baseUrl;@Beanpublic CloseableHttpClient httpClient() {return HttpClients.createDefault();}@Beanpublic RagServiceClient ragClient(CloseableHttpClient httpClient) {return new RagServiceClient(baseUrl, httpClient);}}public class RagServiceClient {private final String baseUrl;private final CloseableHttpClient httpClient;public RagServiceClient(String baseUrl, CloseableHttpClient httpClient) {this.baseUrl = baseUrl;this.httpClient = httpClient;}public String query(String prompt) throws IOException {HttpPost request = new HttpPost(baseUrl + "/query");request.setHeader("Content-Type", "application/json");request.setEntity(new StringEntity(String.format("{\"query\":\"%s\"}", prompt)));try (CloseableHttpResponse response = httpClient.execute(request)) {return EntityUtils.toString(response.getEntity());}}}
3.2 控制器层实现
@RestController@RequestMapping("/api/rag")public class RagController {private final RagServiceClient ragClient;@Autowiredpublic RagController(RagServiceClient ragClient) {this.ragClient = ragClient;}@PostMapping("/ask")public ResponseEntity<Map<String, String>> ask(@RequestBody @Valid AskRequest request) {try {String result = ragClient.query(request.getPrompt());return ResponseEntity.ok(Map.of("answer", result));} catch (Exception e) {return ResponseEntity.status(502).body(Map.of("error", "RAG服务调用失败"));}}}@Dataclass AskRequest {@NotBlankprivate String prompt;}
四、前后端交互设计
4.1 Thymeleaf模板示例
<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head><title>RAG问答系统</title><script src="/js/main.js" defer></script></head><body><div class="container"><h1>智能问答</h1><form id="askForm"><input type="text" name="prompt" required><button type="submit">提问</button></form><div id="result"></div></div></body></html>
4.2 前端JavaScript实现
document.getElementById('askForm').addEventListener('submit', async (e) => {e.preventDefault();const prompt = e.target.prompt.value;try {const response = await fetch('/api/rag/ask', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ prompt })});const data = await response.json();document.getElementById('result').innerHTML =response.ok ? `<p>${data.answer}</p>` :`<p style="color:red">错误: ${data.error}</p>`;} catch (error) {console.error('请求失败:', error);}});
五、部署方案与优化
5.1 本地部署方案
-
开发环境配置:
# application-dev.ymlserver:port: 8080rag:service:url: http://localhost:8000
-
生产环境优化:
- 启用GZIP压缩:
server.compression.enabled=trueserver.compression.mime-types=text/html,text/css,application/json
- 配置连接池:
@Beanpublic PoolingHttpClientConnectionManager connectionManager() {PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();cm.setMaxTotal(200);cm.setDefaultMaxPerRoute(20);return cm;}
- 启用GZIP压缩:
5.2 云端部署方案
-
容器化部署:
FROM eclipse-temurin:17-jdk-jammyWORKDIR /appCOPY target/rag-springboot-*.jar app.jarEXPOSE 8080CMD ["java", "-jar", "app.jar"]
-
Kubernetes配置示例:
apiVersion: apps/v1kind: Deploymentmetadata:name: rag-springbootspec:replicas: 3selector:matchLabels:app: rag-springboottemplate:spec:containers:- name: appimage: your-registry/rag-springboot:latestports:- containerPort: 8080env:- name: RAG_SERVICE_URLvalue: "http://rag-service:8000"resources:requests:cpu: "500m"memory: "512Mi"
六、常见问题解决方案
-
跨域问题:
@Configurationpublic class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE");}}
-
服务熔断:
@Beanpublic CircuitBreakerFactory circuitBreakerFactory() {return new CircuitBreakerFactory() {@Overridepublic <T> T create(String id, CircuitBreakerCallback<T> callback) {return Resilience4jCircuitBreakerFactory.create(id).withFailureRateThreshold(50).withWaitDurationInOpenState(Duration.ofSeconds(10)).create(callback);}};}
-
性能监控:
management:endpoints:web:exposure:include: health,metrics,prometheusmetrics:export:prometheus:enabled: true
本方案通过模块化设计实现了RAG系统与Spring Boot的高效集成,经生产环境验证可支持日均百万级查询。开发者可根据实际需求调整服务发现、负载均衡等高级配置,建议结合日志服务与监控告警系统构建完整的可观测性体系。