fix(console): 上传代理适配服务发现模式

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 <noreply@anthropic.com>
This commit is contained in:
hy001 2026-07-10 22:53:59 +08:00
parent 8922491cbe
commit 0177ca0dce

View File

@ -1,13 +1,17 @@
package com.red.circle.console.adapter.app.party3rd;//package com.sugartime.app.server.api.app.external; 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.external.inner.endpoint.oss.OssServiceClient;
import com.red.circle.framework.core.asserts.ResponseAssert; import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.tool.core.text.StringUtils;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; 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.core.io.InputStreamResource;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
@ -26,16 +30,32 @@ import org.springframework.web.multipart.MultipartFile;
/** /**
* 阿里云服务. * 阿里云服务.
*/ */
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@RestController @RestController
@RequestMapping(value = "/ali-yun", produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/ali-yun", produces = MediaType.APPLICATION_JSON_VALUE)
public class AliYunRestController { public class AliYunRestController {
private final OssServiceClient ossServiceClient; private final OssServiceClient ossServiceClient;
@Value("${feign.external.url}") private final LoadBalancerClient loadBalancerClient;
@Value("${feign.external.url:}")
private String externalBaseUrl; 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. * 阿里云sts.
*/ */
@ -58,7 +78,7 @@ public class AliYunRestController {
fileHeaders.setContentType(MediaType.parseMediaType(file.getContentType())); fileHeaders.setContentType(MediaType.parseMediaType(file.getContentType()));
} }
String uploadUrl = externalBaseUrl.replaceAll("/+$", "") String uploadUrl = resolveExternalBaseUrl()
+ "/oss/upload/general?dir=" + encode(dir) + "/oss/upload/general?dir=" + encode(dir)
+ "&filename=" + encode(filename); + "&filename=" + encode(filename);
ResponseEntity<Map> response; ResponseEntity<Map> response;