From 0177ca0dceaafe9c2272bf6240f5dd0abd08cebe Mon Sep 17 00:00:00 2001 From: hy001 Date: Fri, 10 Jul 2026 22:53:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(console):=20=E4=B8=8A=E4=BC=A0=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E9=80=82=E9=85=8D=E6=9C=8D=E5=8A=A1=E5=8F=91=E7=8E=B0?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feign.external.url 置空切服务发现后,AliYunRestController 直接 @Value 读该 属性拼上传 URL,得到相对地址导致 RestTemplate 报 URI is not absolute, Yumi 后台上传文件失败。 改为与 feign client 一致的双模式:属性非空用固定地址,为空时通过 LoadBalancerClient 从 Nacos 选取 rc-service-external 实例拼绝对地址。 全仓库审计确认这是唯一一处绕过 @FeignClient 直读 feign.*.url 的代码。 Co-Authored-By: Claude Fable 5 --- .../app/party3rd/AliYunRestController.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/party3rd/AliYunRestController.java b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/party3rd/AliYunRestController.java index 8b0d6c5c..7bfc2f6b 100644 --- a/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/party3rd/AliYunRestController.java +++ b/rc-service/rc-service-console/console-adapter/src/main/java/com/red/circle/console/adapter/app/party3rd/AliYunRestController.java @@ -1,13 +1,17 @@ package com.red.circle.console.adapter.app.party3rd;//package com.sugartime.app.server.api.app.external; +import com.red.circle.common.business.core.constant.ServiceNameConstant; import com.red.circle.external.inner.endpoint.oss.OssServiceClient; import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.tool.core.text.StringUtils; import java.io.InputStream; import java.util.Map; import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -26,16 +30,32 @@ import org.springframework.web.multipart.MultipartFile; /** * 阿里云服务. */ -@Slf4j -@RequiredArgsConstructor -@RestController -@RequestMapping(value = "/ali-yun", produces = MediaType.APPLICATION_JSON_VALUE) +@Slf4j +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/ali-yun", produces = MediaType.APPLICATION_JSON_VALUE) public class AliYunRestController { private final OssServiceClient ossServiceClient; - @Value("${feign.external.url}") + private final LoadBalancerClient loadBalancerClient; + + @Value("${feign.external.url:}") private String externalBaseUrl; + /** + * external 服务基地址:feign.external.url 非空时用固定地址,否则走 Nacos 服务发现选一个实例. + */ + private String resolveExternalBaseUrl() { + if (StringUtils.isNotBlank(externalBaseUrl)) { + return externalBaseUrl.replaceAll("/+$", ""); + } + ServiceInstance instance = loadBalancerClient.choose(ServiceNameConstant.SERVICE_EXTERNAL); + if (instance == null) { + throw new IllegalStateException("no available " + ServiceNameConstant.SERVICE_EXTERNAL + " instance"); + } + return instance.getUri().toString().replaceAll("/+$", ""); + } + /** * 阿里云sts. */ @@ -58,7 +78,7 @@ public class AliYunRestController { fileHeaders.setContentType(MediaType.parseMediaType(file.getContentType())); } - String uploadUrl = externalBaseUrl.replaceAll("/+$", "") + String uploadUrl = resolveExternalBaseUrl() + "/oss/upload/general?dir=" + encode(dir) + "&filename=" + encode(filename); ResponseEntity response;