地理位置服务设计文档
概述: 本文档描述系统提供的地理位置相关接口(当前仅包含“最近位置”查询),包含外部服务调用、错误处理、配置建议与使用示例。对应实现:src/main/java/.../controller/GeoController.java。
目标: 根据给定经纬度返回最近的位置信息字符串,供前端展示或作为地址回填使用;对外部地理服务调用做统一封装、错误与超时处理,以及可配置的服务端点。
接口清单:
获取最近位置
GET /geo/nearestlatitude 与 longitude 查询最近位置字符串(同步返回)。latitude (double) - 纬度,必填longitude (double) - 经度,必填R<String>,成功返回 200 和字符串内容;失败返回 ErrorCode.GEO_REQUEST_FAILED。示例:
GET /geo/nearest?latitude=30.12345&longitude=114.12345
实现细节(目前代码)
RestTemplate 直接拼接请求 URL:
http://45.207.222.6/geo/nearest.php?latitude={latitude}&longitude={longitude}。restTemplate.getForEntity(url, String.class) 获取原始响应体并直接返回给客户端。R.fail(ErrorCode.GEO_REQUEST_FAILED)。问题与改进建议
配置化外部服务地址与超时
application.yml(例如 geo.service.url),避免在代码中硬编码 IP/路径,方便切换环境与容错。RestTemplate(或 WebClient)并从配置加载超时值,防止外部服务阻塞线程。错误处理与降级策略
GEO_SERVICE_UNAVAILABLE)。响应格式与语义
缓存与频次限制
安全与审计
建议的配置示例 (application.yml)
geo:
service:
url: "http://45.207.222.6/geo/nearest.php"
connect-timeout-ms: 2000
read-timeout-ms: 3000
cache-ttl-seconds: 60
参考实现建议要点
RestTemplateBuilder 或 WebClient 从配置构造带超时的 HTTP 客户端。GeoService,Controller 只负责参数校验与统一响应。GeoService 中实现:配置化 URL、参数编码、错误分类、重试/熔断策略、缓存层(如 Caffeine 或 Redis)的接入点。错误码与日志策略
ErrorCode.GEO_REQUEST_FAILED 作为通用失败返回;可考虑增加 GEO_SERVICE_UNAVAILABLE(已在 ErrorCode 中预留)用于第三方服务不可用场景。userId(如果可用)、latitude、longitude、externalUrl、statusCode、latencyMs、errorMessage。示例:改进后的调用流程(伪代码)
geoService.getNearest(latitude, longitude)GeoService:
示例响应
R.success(200, "ok", "湖北省武汉市xx区...")R.fail(ErrorCode.GEO_REQUEST_FAILED.getCode(), ErrorCode.GEO_REQUEST_FAILED.getMessage(), null)后续工作建议