Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
spring-cloud-netflix
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
openSource
spring-cloud-netflix
Commits
24d0bedf
Commit
24d0bedf
authored
Sep 08, 2017
by
Ryan Baxter
Committed by
GitHub
Sep 08, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2255 from DominikMostek/fallback_cause
Fallback cause is propagated to fallback provider
parents
38b8786e
4dc5088f
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
386 additions
and
2 deletions
+386
-2
spring-cloud-netflix.adoc
docs/src/main/asciidoc/spring-cloud-netflix.adoc
+62
-0
FallbackProvider.java
...rk/cloud/netflix/zuul/filters/route/FallbackProvider.java
+36
-0
ZuulFallbackProvider.java
...loud/netflix/zuul/filters/route/ZuulFallbackProvider.java
+2
-0
AbstractRibbonCommand.java
...lix/zuul/filters/route/support/AbstractRibbonCommand.java
+22
-2
RibbonCommandCauseFallbackPropagationTest.java
...te/support/RibbonCommandCauseFallbackPropagationTest.java
+264
-0
No files found.
docs/src/main/asciidoc/spring-cloud-netflix.adoc
View file @
24d0bedf
...
@@ -1978,6 +1978,68 @@ class MyFallbackProvider implements ZuulFallbackProvider {
...
@@ -1978,6 +1978,68 @@ class MyFallbackProvider implements ZuulFallbackProvider {
}
}
----
----
If
you
would
like
to
choose
the
response
based
on
the
cause
of
the
failure
use
`
FallbackProvider
`
which
will
replace
`
ZuulFallbackProvder
`
in
future
versions
.
[
source
,
java
]
----
class
MyFallbackProvider
implements
FallbackProvider
{
@
Override
public
String
getRoute
()
{
return
"*"
;
}
@
Override
public
ClientHttpResponse
fallbackResponse
(
final
Throwable
cause
)
{
if
(
cause
instanceof
HystrixTimeoutException
)
{
return
response
(
HttpStatus
.
GATEWAY_TIMEOUT
);
}
else
{
return
fallbackResponse
();
}
}
@
Override
public
ClientHttpResponse
fallbackResponse
()
{
return
response
(
HttpStatus
.
INTERNAL_SERVER_ERROR
);
}
private
ClientHttpResponse
response
(
final
HttpStatus
status
)
{
return
new
ClientHttpResponse
()
{
@
Override
public
HttpStatus
getStatusCode
()
throws
IOException
{
return
status
;
}
@
Override
public
int
getRawStatusCode
()
throws
IOException
{
return
status
.
value
();
}
@
Override
public
String
getStatusText
()
throws
IOException
{
return
status
.
getReasonPhrase
();
}
@
Override
public
void
close
()
{
}
@
Override
public
InputStream
getBody
()
throws
IOException
{
return
new
ByteArrayInputStream
(
"fallback"
.
getBytes
());
}
@
Override
public
HttpHeaders
getHeaders
()
{
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
setContentType
(
MediaType
.
APPLICATION_JSON
);
return
headers
;
}
};
}
}
----
[[
zuul
-
redirect
-
location
-
rewrite
]]
[[
zuul
-
redirect
-
location
-
rewrite
]]
===
Rewriting
`
Location
`
header
===
Rewriting
`
Location
`
header
...
...
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/FallbackProvider.java
0 → 100644
View file @
24d0bedf
/*
* Copyright 2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
cloud
.
netflix
.
zuul
.
filters
.
route
;
import
org.springframework.http.client.ClientHttpResponse
;
/**
* Extension of {@link ZuulFallbackProvider} which adds possibility to choose proper response
* based on the exception which caused the main method to fail.
*
* @author Dominik Mostek
*/
public
interface
FallbackProvider
extends
ZuulFallbackProvider
{
/**
* Provides a fallback response based on the cause of the failed execution.
*
* @param cause cause of the main method failure
* @return the fallback response
*/
ClientHttpResponse
fallbackResponse
(
Throwable
cause
);
}
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/ZuulFallbackProvider.java
View file @
24d0bedf
...
@@ -23,7 +23,9 @@ import org.springframework.http.client.ClientHttpResponse;
...
@@ -23,7 +23,9 @@ import org.springframework.http.client.ClientHttpResponse;
/**
/**
* Provides fallback when a failure occurs on a route.
* Provides fallback when a failure occurs on a route.
* @author Ryan Baxter
* @author Ryan Baxter
* @deprecated Use {@link FallbackProvider}
*/
*/
@Deprecated
public
interface
ZuulFallbackProvider
{
public
interface
ZuulFallbackProvider
{
/**
/**
...
...
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/support/AbstractRibbonCommand.java
View file @
24d0bedf
...
@@ -23,6 +23,7 @@ import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
...
@@ -23,6 +23,7 @@ import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import
org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand
;
import
org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand
;
import
org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandContext
;
import
org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandContext
;
import
org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider
;
import
org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider
;
import
org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider
;
import
org.springframework.http.client.ClientHttpResponse
;
import
org.springframework.http.client.ClientHttpResponse
;
import
com.netflix.client.AbstractLoadBalancerAwareClient
;
import
com.netflix.client.AbstractLoadBalancerAwareClient
;
import
com.netflix.client.ClientRequest
;
import
com.netflix.client.ClientRequest
;
...
@@ -69,7 +70,13 @@ public abstract class AbstractRibbonCommand<LBC extends AbstractLoadBalancerAwar
...
@@ -69,7 +70,13 @@ public abstract class AbstractRibbonCommand<LBC extends AbstractLoadBalancerAwar
public
AbstractRibbonCommand
(
String
commandKey
,
LBC
client
,
public
AbstractRibbonCommand
(
String
commandKey
,
LBC
client
,
RibbonCommandContext
context
,
ZuulProperties
zuulProperties
,
RibbonCommandContext
context
,
ZuulProperties
zuulProperties
,
ZuulFallbackProvider
fallbackProvider
,
IClientConfig
config
)
{
ZuulFallbackProvider
fallbackProvider
,
IClientConfig
config
)
{
super
(
getSetter
(
commandKey
,
zuulProperties
));
this
(
getSetter
(
commandKey
,
zuulProperties
),
client
,
context
,
fallbackProvider
,
config
);
}
protected
AbstractRibbonCommand
(
Setter
setter
,
LBC
client
,
RibbonCommandContext
context
,
ZuulFallbackProvider
fallbackProvider
,
IClientConfig
config
)
{
super
(
setter
);
this
.
client
=
client
;
this
.
client
=
client
;
this
.
context
=
context
;
this
.
context
=
context
;
this
.
zuulFallbackProvider
=
fallbackProvider
;
this
.
zuulFallbackProvider
=
fallbackProvider
;
...
@@ -126,11 +133,24 @@ public abstract class AbstractRibbonCommand<LBC extends AbstractLoadBalancerAwar
...
@@ -126,11 +133,24 @@ public abstract class AbstractRibbonCommand<LBC extends AbstractLoadBalancerAwar
@Override
@Override
protected
ClientHttpResponse
getFallback
()
{
protected
ClientHttpResponse
getFallback
()
{
if
(
zuulFallbackProvider
!=
null
)
{
if
(
zuulFallbackProvider
!=
null
)
{
return
zuulFallbackProvider
.
f
allbackResponse
();
return
getF
allbackResponse
();
}
}
return
super
.
getFallback
();
return
super
.
getFallback
();
}
}
protected
ClientHttpResponse
getFallbackResponse
()
{
if
(
zuulFallbackProvider
instanceof
FallbackProvider
)
{
Throwable
cause
=
getFailedExecutionException
();
cause
=
cause
==
null
?
getExecutionException
()
:
cause
;
if
(
cause
==
null
)
{
zuulFallbackProvider
.
fallbackResponse
();
}
else
{
return
((
FallbackProvider
)
zuulFallbackProvider
).
fallbackResponse
(
cause
);
}
}
return
zuulFallbackProvider
.
fallbackResponse
();
}
public
LBC
getClient
()
{
public
LBC
getClient
()
{
return
client
;
return
client
;
}
}
...
...
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/support/RibbonCommandCauseFallbackPropagationTest.java
0 → 100644
View file @
24d0bedf
This diff is collapsed.
Click to expand it.
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