Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
sl-gateway
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhouwei
sl-gateway
Commits
39891e5c
Commit
39891e5c
authored
Apr 16, 2025
by
zhouwei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add timeout
parent
0745b64b
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
43 additions
and
1 deletion
+43
-1
FailoverGatewayFilterFactory.java
...yan/securitylink/filter/FailoverGatewayFilterFactory.java
+43
-1
No files found.
src/main/java/com/nanyan/securitylink/filter/FailoverGatewayFilterFactory.java
View file @
39891e5c
...
@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
...
@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import
com.nanyan.securitylink.config.AppConfig
;
import
com.nanyan.securitylink.config.AppConfig
;
import
com.nanyan.securitylink.service.AlertService
;
import
com.nanyan.securitylink.service.AlertService
;
import
com.nanyan.securitylink.service.TokenRouteMappingService
;
import
com.nanyan.securitylink.service.TokenRouteMappingService
;
import
io.netty.channel.ChannelOption
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -16,17 +17,20 @@ import org.springframework.http.HttpHeaders;
...
@@ -16,17 +17,20 @@ import org.springframework.http.HttpHeaders;
import
org.springframework.http.HttpMethod
;
import
org.springframework.http.HttpMethod
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.MediaType
;
import
org.springframework.http.MediaType
;
import
org.springframework.http.client.reactive.ReactorClientHttpConnector
;
import
org.springframework.http.server.reactive.ServerHttpRequest
;
import
org.springframework.http.server.reactive.ServerHttpRequest
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.reactive.function.BodyInserters
;
import
org.springframework.web.reactive.function.BodyInserters
;
import
org.springframework.web.reactive.function.client.WebClient
;
import
org.springframework.web.reactive.function.client.WebClient
;
import
org.springframework.web.server.ServerWebExchange
;
import
org.springframework.web.server.ServerWebExchange
;
import
reactor.core.publisher.Mono
;
import
reactor.core.publisher.Mono
;
import
reactor.netty.http.client.HttpClient
;
import
java.nio.charset.StandardCharsets
;
import
java.nio.charset.StandardCharsets
;
import
java.time.Duration
;
import
java.time.Duration
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.TimeoutException
;
@Slf4j
@Slf4j
@Component
@Component
...
@@ -182,6 +186,37 @@ public class FailoverGatewayFilterFactory extends AbstractGatewayFilterFactory<F
...
@@ -182,6 +186,37 @@ public class FailoverGatewayFilterFactory extends AbstractGatewayFilterFactory<F
true
,
true
,
errorStats
errorStats
).
timeout
(
Duration
.
ofMillis
(
appConfig
.
getRequestTimeout
()))
).
timeout
(
Duration
.
ofMillis
(
appConfig
.
getRequestTimeout
()))
.
onErrorResume
(
TimeoutException
.
class
,
ex
->
{
// 记录超时错误
long
duration
=
System
.
currentTimeMillis
()
-
startTime
;
log
.
warn
(
"Source request timed out after {}ms, switching to target: {}"
,
duration
,
uriConfig
.
getTargetUri
());
String
targetUri
=
tokenRouteMappingService
.
resolveTargetUri
(
sourceUri
,
uriConfig
);
// 直接转发到 target
return
tryRequest
(
uriConfig
.
getFallbackUrl
(),
targetUri
,
uriConfig
.
getFallbackHost
(),
uriConfig
.
getModel
(),
uriConfig
.
getModelKey
(),
exchange
,
false
,
null
);
})
.
onErrorResume
(
Exception
.
class
,
ex
->
{
// 处理其他错误
log
.
error
(
"Source request failed: {}"
,
ex
.
getMessage
());
log
.
info
(
"Source request timed out after {}ms, switching to target: {}"
,
System
.
currentTimeMillis
()
-
startTime
,
uriConfig
.
getTargetUri
());
String
targetUri
=
tokenRouteMappingService
.
resolveTargetUri
(
sourceUri
,
uriConfig
);
return
tryRequest
(
uriConfig
.
getFallbackUrl
(),
targetUri
,
uriConfig
.
getFallbackHost
(),
uriConfig
.
getModel
(),
uriConfig
.
getModelKey
(),
exchange
,
false
,
null
);
})
.
onErrorResume
(
primaryError
->
{
.
onErrorResume
(
primaryError
->
{
log
.
error
(
"Primary endpoint failed: {}, error: {}"
,
log
.
error
(
"Primary endpoint failed: {}, error: {}"
,
uriConfig
.
getPrimaryUrl
()
+
sourceUri
,
uriConfig
.
getPrimaryUrl
()
+
sourceUri
,
...
@@ -250,7 +285,14 @@ public class FailoverGatewayFilterFactory extends AbstractGatewayFilterFactory<F
...
@@ -250,7 +285,14 @@ public class FailoverGatewayFilterFactory extends AbstractGatewayFilterFactory<F
log
.
info
(
"Starting {} request to: {}"
,
isSourceRequest
?
"source"
:
"target"
,
fullUrl
);
log
.
info
(
"Starting {} request to: {}"
,
isSourceRequest
?
"source"
:
"target"
,
fullUrl
);
long
startTime
=
System
.
currentTimeMillis
();
long
startTime
=
System
.
currentTimeMillis
();
WebClient
.
RequestBodySpec
requestBodySpec
=
webClientBuilder
.
build
()
// 创建 WebClient 请求
WebClient
client
=
webClientBuilder
.
clone
()
.
clientConnector
(
new
ReactorClientHttpConnector
(
HttpClient
.
create
()
.
option
(
ChannelOption
.
CONNECT_TIMEOUT_MILLIS
,
appConfig
.
getRequestTimeout
())
.
responseTimeout
(
Duration
.
ofMillis
(
appConfig
.
getRequestTimeout
()))))
.
build
();
WebClient
.
RequestBodySpec
requestBodySpec
=
client
.
method
(
request
.
getMethod
())
.
method
(
request
.
getMethod
())
.
uri
(
fullUrl
+
(
request
.
getQueryParams
().
isEmpty
()
?
""
:
.
uri
(
fullUrl
+
(
request
.
getQueryParams
().
isEmpty
()
?
""
:
"?"
+
request
.
getQueryParams
().
toString
().
substring
(
1
)));
"?"
+
request
.
getQueryParams
().
toString
().
substring
(
1
)));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment