一、核心功能架构解析
GeminiClient类采用典型的依赖注入设计模式,通过构造函数接收两个核心组件:
- OkHttpClientFactory:负责HTTP客户端实例的创建与管理,支持连接池复用、超时配置等高级特性。建议实现时考虑线程安全,例如采用单例模式管理客户端实例。
- GoogleAiProperties:集中管理API配置参数,包括基础URL、模型标识、认证密钥等。推荐使用Spring Environment或配置中心实现动态刷新。
类中定义的JSON常量(application/json; charset=utf-8)确保请求体编码规范,避免因字符集问题导致的解析异常。实际开发中,可扩展支持gzip压缩等优化手段。
二、请求参数处理逻辑
方法generateContent接收四个关键参数:
- parts:List>结构,每个Map包含role和parts字段,用于构造多轮对话上下文。示例:
List<Map<String,Object>> parts = List.of(Map.of("role", "user", "parts", List.of("请解释量子计算原理")));
- generationConfig:Map类型,控制生成参数如温度系数(temperature)、最大令牌数(maxTokens)等。建议配置默认值并添加参数校验逻辑。
- apiKeyOverride:优先使用的API密钥,支持运行时动态覆盖配置。
- modelOverride:允许指定不同版本的AI模型。
参数优先级处理采用”覆盖优先”策略:当override参数非空时直接使用,否则回退到配置属性。这种设计既支持灵活调用,又保证默认配置的可用性。
三、HTTP请求构建与执行
请求构建过程包含三个关键步骤:
-
URL组装:遵循
{baseURL}/models/{model}:generateContent?key={apiKey}模式。需注意:- URL编码处理特殊字符
- 密钥安全传输(建议使用短期令牌替代硬编码密钥)
- 版本兼容性设计(如支持v1/v2等路径前缀)
-
请求体构造:使用FastJSON或Jackson将Java对象序列化为JSON。典型结构如下:
{"contents": [{"role": "user", "parts": ["输入内容"]}],"generationConfig": {"temperature": 0.7}}
建议添加请求体大小校验(如限制10MB以内),防止过大请求导致服务端拒绝。
-
客户端执行:通过工厂模式获取HTTP客户端,利用try-with-resources确保连接释放。性能监控采用Stopwatch类记录关键指标:
- TTFB(Time To First Byte):反映网络延迟和服务端初始响应速度
- 总耗时:包含请求传输、处理和响应返回全周期
四、异常处理与日志设计
代码实现三级异常处理机制:
- 配置缺失检查:未设置API密钥时抛出IllegalStateException,避免无效请求发送。
- HTTP状态码校验:非200响应触发RuntimeException,记录状态码和响应体。建议扩展支持重试机制(如5xx错误自动重试3次)。
- 响应解析异常:通过JsonUtils.requireBodyString确保响应体有效,防止NPE。
日志设计遵循结构化原则,记录:
- 调用阶段(成功/失败)
- 关键时间指标(TTFB、总耗时)
- 错误上下文(状态码、响应体片段)
示例日志输出:
【Gemini】调用成功,TTFB=125ms,总耗时=342.5ms【Gemini】HTTP 429 调用失败,TTFB=85ms,总耗时=102.3ms,响应体:{"error":"rate limit exceeded"}
五、性能优化实践建议
- 连接复用:配置HTTP客户端保持长连接(如keep-alive),减少TCP握手开销。
- 异步调用:对于非阻塞场景,可改造为CompletableFuture实现异步调用。
- 批处理优化:合并多个小请求为单个批处理请求,降低网络往返次数。
- 缓存策略:对相同输入的请求结果进行缓存,设置合理的TTL。
六、安全增强方案
- 密钥管理:建议使用Vault或KMS服务管理API密钥,避免硬编码。
- 请求签名:对关键请求添加HMAC签名,防止篡改。
- 速率限制:客户端实现令牌桶算法,避免触发服务端限流。
- 数据脱敏:对请求/响应中的敏感信息进行脱敏处理。
七、扩展性设计思考
- 插件式协议支持:通过接口抽象支持gRPC、WebSocket等协议。
- 多模型适配:设计ModelHandler接口,兼容不同AI服务提供商的API差异。
- 指标监控:集成Micrometer等库暴露Prometheus指标,支持告警。
- 回退机制:主服务不可用时自动切换备用模型或缓存结果。
该实现为AI服务调用提供了完整的解决方案框架,开发者可根据实际需求进行定制扩展。重点在于平衡功能完整性与代码简洁性,同时通过完善的监控和错误处理保障系统稳定性。在实际生产环境中,建议结合A/B测试验证不同配置参数的效果,持续优化调用性能。