From 6b5cb5f4f5cd08dc7a2c3c569ffda29634103f51 Mon Sep 17 00:00:00 2001
From: liuyihe <2513762445@qq.com>
Date: Fri, 31 Jul 2026 11:58:46 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
config/nacos/cn/integration-service.yml | 9 +++
config/nacos/local/integration-service.yml | 14 ++++-
integration-service/pom.xml | 10 ++++
.../IntegrationServiceApplication.java | 2 +-
.../config/IntegrationProperties.java | 60 ++++++++++++++++++-
.../security/InternalServiceTokenGuard.java | 6 +-
.../src/main/resources/application.yml | 11 ++++
.../config/IntegrationPropertiesTest.java | 18 +++++-
8 files changed, 119 insertions(+), 11 deletions(-)
diff --git a/config/nacos/cn/integration-service.yml b/config/nacos/cn/integration-service.yml
index a0de026fb..501252f3d 100644
--- a/config/nacos/cn/integration-service.yml
+++ b/config/nacos/cn/integration-service.yml
@@ -4,5 +4,14 @@ baiyue:
enabled: ${BAIDU_OCR_ENABLED:false}
api-key: ${BAIDU_OCR_API_KEY:}
secret-key: ${BAIDU_OCR_SECRET_KEY:}
+ input-root: ${WEIGHT_OCR_INPUT_ROOT:/data/baiyue/weight-ocr/input}
+ output-root: ${WEIGHT_OCR_OUTPUT_ROOT:/data/baiyue/weight-ocr/output}
+ max-image-size: ${WEIGHT_OCR_MAX_IMAGE_SIZE:3MB}
+ max-image-pixels: ${WEIGHT_OCR_MAX_IMAGE_PIXELS:40000000}
+ max-batch-size: ${WEIGHT_OCR_MAX_BATCH_SIZE:50}
+ connect-timeout: ${BAIDU_OCR_CONNECT_TIMEOUT:10s}
+ request-timeout: ${BAIDU_OCR_REQUEST_TIMEOUT:60s}
+ min-request-interval: ${BAIDU_OCR_MIN_REQUEST_INTERVAL:600ms}
+ max-qps-retries: ${BAIDU_OCR_MAX_QPS_RETRIES:3}
amazon-sp-api:
enabled: ${AMAZON_SP_API_ENABLED:false}
diff --git a/config/nacos/local/integration-service.yml b/config/nacos/local/integration-service.yml
index f41753f73..445cdb281 100644
--- a/config/nacos/local/integration-service.yml
+++ b/config/nacos/local/integration-service.yml
@@ -1,3 +1,11 @@
-baiyue.integration:
- baidu-ocr.enabled: ${BAIDU_OCR_ENABLED:false}
- amazon-sp-api.enabled: ${AMAZON_SP_API_ENABLED:false}
+baiyue:
+ integration:
+ baidu-ocr:
+ enabled: ${BAIDU_OCR_ENABLED:false}
+ input-root: ${WEIGHT_OCR_INPUT_ROOT:${java.io.tmpdir}/baiyue-weight-ocr/input}
+ output-root: ${WEIGHT_OCR_OUTPUT_ROOT:${java.io.tmpdir}/baiyue-weight-ocr/output}
+ max-image-size: ${WEIGHT_OCR_MAX_IMAGE_SIZE:3MB}
+ max-image-pixels: ${WEIGHT_OCR_MAX_IMAGE_PIXELS:40000000}
+ max-batch-size: ${WEIGHT_OCR_MAX_BATCH_SIZE:50}
+ amazon-sp-api:
+ enabled: ${AMAZON_SP_API_ENABLED:false}
diff --git a/integration-service/pom.xml b/integration-service/pom.xml
index b032012af..c167a47db 100644
--- a/integration-service/pom.xml
+++ b/integration-service/pom.xml
@@ -13,11 +13,21 @@
integration-service
+
+ com.baiyue.shared
+ baiyue-common-core
+ ${project.version}
+
com.baiyue.shared
baiyue-common-web
${project.version}
+
+ com.baiyue.shared
+ baiyue-common-openapi
+ ${project.version}
+
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
diff --git a/integration-service/src/main/java/com/baiyue/integration/IntegrationServiceApplication.java b/integration-service/src/main/java/com/baiyue/integration/IntegrationServiceApplication.java
index 670ad361c..fccecbc0b 100644
--- a/integration-service/src/main/java/com/baiyue/integration/IntegrationServiceApplication.java
+++ b/integration-service/src/main/java/com/baiyue/integration/IntegrationServiceApplication.java
@@ -4,7 +4,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = {"com.baiyue.integration", "com.baiyue.common.web"})
@ConfigurationPropertiesScan
public class IntegrationServiceApplication {
public static void main(String[] args) {
diff --git a/integration-service/src/main/java/com/baiyue/integration/config/IntegrationProperties.java b/integration-service/src/main/java/com/baiyue/integration/config/IntegrationProperties.java
index 09c4eec94..7ad1b09aa 100644
--- a/integration-service/src/main/java/com/baiyue/integration/config/IntegrationProperties.java
+++ b/integration-service/src/main/java/com/baiyue/integration/config/IntegrationProperties.java
@@ -1,12 +1,68 @@
package com.baiyue.integration.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.util.unit.DataSize;
+
+import java.net.URI;
+import java.nio.file.Path;
+import java.time.Duration;
@ConfigurationProperties(prefix = "baiyue.integration")
public record IntegrationProperties(BaiduOcr baiduOcr, AmazonSpApi amazonSpApi) {
- public record BaiduOcr(boolean enabled, String apiKey, String secretKey) {
+ public record BaiduOcr(boolean enabled,
+ String apiKey,
+ String secretKey,
+ URI tokenUrl,
+ URI meterUrl,
+ Duration connectTimeout,
+ Duration requestTimeout,
+ Path inputRoot,
+ Path outputRoot,
+ DataSize maxImageSize,
+ long maxImagePixels,
+ int maxBatchSize,
+ Duration minRequestInterval,
+ int maxQpsRetries) {
public boolean configured() {
- return enabled && hasText(apiKey) && hasText(secretKey);
+ return enabled
+ && hasText(apiKey)
+ && hasText(secretKey)
+ && tokenUrl != null
+ && meterUrl != null;
+ }
+
+ public Duration effectiveConnectTimeout() {
+ return positive(connectTimeout) ? connectTimeout : Duration.ofSeconds(10);
+ }
+
+ public Duration effectiveRequestTimeout() {
+ return positive(requestTimeout) ? requestTimeout : Duration.ofSeconds(60);
+ }
+
+ public DataSize effectiveMaxImageSize() {
+ return maxImageSize != null && maxImageSize.toBytes() > 0
+ ? maxImageSize : DataSize.ofMegabytes(3);
+ }
+
+ public long effectiveMaxImagePixels() {
+ return maxImagePixels > 0 ? maxImagePixels : 40_000_000L;
+ }
+
+ public int effectiveMaxBatchSize() {
+ return maxBatchSize > 0 ? maxBatchSize : 50;
+ }
+
+ public Duration effectiveMinRequestInterval() {
+ return minRequestInterval != null && !minRequestInterval.isNegative()
+ ? minRequestInterval : Duration.ofMillis(600);
+ }
+
+ public int effectiveMaxQpsRetries() {
+ return Math.min(10, Math.max(0, maxQpsRetries));
+ }
+
+ private boolean positive(Duration value) {
+ return value != null && !value.isNegative() && !value.isZero();
}
}
diff --git a/integration-service/src/main/java/com/baiyue/integration/security/InternalServiceTokenGuard.java b/integration-service/src/main/java/com/baiyue/integration/security/InternalServiceTokenGuard.java
index dd0519417..e5d5932fc 100644
--- a/integration-service/src/main/java/com/baiyue/integration/security/InternalServiceTokenGuard.java
+++ b/integration-service/src/main/java/com/baiyue/integration/security/InternalServiceTokenGuard.java
@@ -1,9 +1,9 @@
package com.baiyue.integration.security;
+import com.baiyue.common.core.api.ResultCode;
+import com.baiyue.common.core.exception.BizException;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
-import org.springframework.web.server.ResponseStatusException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
@@ -22,7 +22,7 @@ public class InternalServiceTokenGuard {
public void verify(String actualToken) {
byte[] actual = actualToken == null ? new byte[0] : actualToken.getBytes(StandardCharsets.UTF_8);
if (!MessageDigest.isEqual(expectedToken, actual)) {
- throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "内部服务令牌无效");
+ throw new BizException(ResultCode.UNAUTHORIZED, "内部服务令牌无效");
}
}
}
diff --git a/integration-service/src/main/resources/application.yml b/integration-service/src/main/resources/application.yml
index 60cb6f509..d095bb084 100644
--- a/integration-service/src/main/resources/application.yml
+++ b/integration-service/src/main/resources/application.yml
@@ -35,6 +35,17 @@ baiyue:
enabled: ${BAIDU_OCR_ENABLED:false}
api-key: ${BAIDU_OCR_API_KEY:}
secret-key: ${BAIDU_OCR_SECRET_KEY:}
+ token-url: ${BAIDU_OCR_TOKEN_URL:https://aip.baidubce.com/oauth/2.0/token}
+ meter-url: ${BAIDU_OCR_METER_URL:https://aip.baidubce.com/rest/2.0/ocr/v1/meter}
+ connect-timeout: ${BAIDU_OCR_CONNECT_TIMEOUT:10s}
+ request-timeout: ${BAIDU_OCR_REQUEST_TIMEOUT:60s}
+ input-root: ${WEIGHT_OCR_INPUT_ROOT:${java.io.tmpdir}/baiyue-weight-ocr/input}
+ output-root: ${WEIGHT_OCR_OUTPUT_ROOT:${java.io.tmpdir}/baiyue-weight-ocr/output}
+ max-image-size: ${WEIGHT_OCR_MAX_IMAGE_SIZE:3MB}
+ max-image-pixels: ${WEIGHT_OCR_MAX_IMAGE_PIXELS:40000000}
+ max-batch-size: ${WEIGHT_OCR_MAX_BATCH_SIZE:50}
+ min-request-interval: ${BAIDU_OCR_MIN_REQUEST_INTERVAL:600ms}
+ max-qps-retries: ${BAIDU_OCR_MAX_QPS_RETRIES:3}
amazon-sp-api:
enabled: ${AMAZON_SP_API_ENABLED:false}
client-id: ${AMAZON_SP_API_CLIENT_ID:}
diff --git a/integration-service/src/test/java/com/baiyue/integration/config/IntegrationPropertiesTest.java b/integration-service/src/test/java/com/baiyue/integration/config/IntegrationPropertiesTest.java
index 2d23af5ee..489117122 100644
--- a/integration-service/src/test/java/com/baiyue/integration/config/IntegrationPropertiesTest.java
+++ b/integration-service/src/test/java/com/baiyue/integration/config/IntegrationPropertiesTest.java
@@ -2,19 +2,33 @@ package com.baiyue.integration.config;
import org.junit.jupiter.api.Test;
+import java.net.URI;
+import java.nio.file.Path;
+import java.time.Duration;
+
import static org.assertj.core.api.Assertions.assertThat;
class IntegrationPropertiesTest {
@Test
void providerIsConfiguredOnlyWhenEnabledAndAllSecretsExist() {
- var baidu = new IntegrationProperties.BaiduOcr(true, "key", "secret");
+ var baidu = baidu(true, "key", "secret");
var amazon = new IntegrationProperties.AmazonSpApi(
true, "client", "secret", "refresh", "access", "aws-secret", "us-east-1");
assertThat(baidu.configured()).isTrue();
assertThat(amazon.configured()).isTrue();
- assertThat(new IntegrationProperties.BaiduOcr(false, "key", "secret").configured()).isFalse();
+ assertThat(baidu(false, "key", "secret").configured()).isFalse();
assertThat(new IntegrationProperties.AmazonSpApi(
true, "client", "secret", "", "access", "aws-secret", "us-east-1").configured()).isFalse();
}
+
+ private IntegrationProperties.BaiduOcr baidu(boolean enabled, String apiKey, String secretKey) {
+ return new IntegrationProperties.BaiduOcr(
+ enabled, apiKey, secretKey,
+ URI.create("https://example.com/token"), URI.create("https://example.com/meter"),
+ Duration.ofSeconds(10), Duration.ofSeconds(60),
+ Path.of("input"), Path.of("output"), null,
+ 40_000_000L, 50, Duration.ofMillis(600), 3
+ );
+ }
}