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
1cf509c3
Unverified
Commit
1cf509c3
authored
Jul 19, 2017
by
Spencer Gibb
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1.3.x'
parents
31d19fd5
6b530b02
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
221 additions
and
118 deletions
+221
-118
spring-cloud-netflix.adoc
docs/src/main/asciidoc/spring-cloud-netflix.adoc
+1
-1
RestClientRibbonConfiguration.java
...k/cloud/netflix/ribbon/RestClientRibbonConfiguration.java
+64
-0
RibbonClientConfiguration.java
...ework/cloud/netflix/ribbon/RibbonClientConfiguration.java
+6
-117
HttpClientRibbonConfiguration.java
.../netflix/ribbon/apache/HttpClientRibbonConfiguration.java
+72
-0
OkHttpRibbonConfiguration.java
...loud/netflix/ribbon/okhttp/OkHttpRibbonConfiguration.java
+75
-0
RibbonClientConfigurationTests.java
.../cloud/netflix/ribbon/RibbonClientConfigurationTests.java
+3
-0
No files found.
docs/src/main/asciidoc/spring-cloud-netflix.adoc
View file @
1cf509c3
...
...
@@ -502,7 +502,7 @@ Netflix has created a library called https://github.com/Netflix/Hystrix[Hystrix]
.
Microservice
Graph
image
::
HystrixGraph
.
png
[]
A
service
failure
in
the
lower
level
of
services
can
cause
cascading
failure
all
the
way
up
to
the
user
.
When
calls
to
a
particular
service
reach
a
certain
threshold
(
20
failures
in
5
seconds
is
the
default
in
Hystrix
),
the
circuit
opens
and
the
call
is
not
made
.
In
cases
of
error
and
an
open
circuit
a
fallback
can
be
provided
by
the
developer
.
A
service
failure
in
the
lower
level
of
services
can
cause
cascading
failure
all
the
way
up
to
the
user
.
When
calls
to
a
particular
service
is
greater
than
`
circuitBreaker
.
requestVolumeThreshold
`
(
default
:
20
requests
)
and
failue
percentage
is
greater
than
`
circuitBreaker
.
errorThresholdPercentage
`
(
default
:
>
50
%)
in
a
rolling
window
defined
by
`
metrics
.
rollingStats
.
timeInMilliseconds
`
(
default
:
10
seconds
),
the
circuit
opens
and
the
call
is
not
made
.
In
cases
of
error
and
an
open
circuit
a
fallback
can
be
provided
by
the
developer
.
.
Hystrix
fallback
prevents
cascading
failures
image
::
HystrixFallback
.
png
[]
...
...
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RestClientRibbonConfiguration.java
0 → 100644
View file @
1cf509c3
/*
* Copyright 2013-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
.
ribbon
;
import
com.netflix.client.AbstractLoadBalancerAwareClient
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.loadbalancer.ILoadBalancer
;
import
com.netflix.niws.client.http.RestClient
;
import
com.netflix.servo.monitor.Monitors
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Lazy
;
/**
* @author Spencer Gibb
*/
@SuppressWarnings
(
"deprecation"
)
@Configuration
@RibbonAutoConfiguration
.
ConditionalOnRibbonRestClient
class
RestClientRibbonConfiguration
{
@Value
(
"${ribbon.client.name}"
)
private
String
name
=
"client"
;
/**
* Create a Netflix {@link RestClient} integrated with Ribbon if none already exists
* in the application context. It is not required for Ribbon to work properly and is
* therefore created lazily if ever another component requires it.
*
* @param config the configuration to use by the underlying Ribbon instance
* @param loadBalancer the load balancer to use by the underlying Ribbon instance
* @param serverIntrospector server introspector to use by the underlying Ribbon instance
* @param retryHandler retry handler to use by the underlying Ribbon instance
* @return a {@link RestClient} instances backed by Ribbon
*/
@Bean
@Lazy
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
public
RestClient
ribbonRestClient
(
IClientConfig
config
,
ILoadBalancer
loadBalancer
,
ServerIntrospector
serverIntrospector
,
RetryHandler
retryHandler
)
{
RestClient
client
=
new
RibbonClientConfiguration
.
OverrideRestClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
}
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java
View file @
1cf509c3
...
...
@@ -24,21 +24,14 @@ import org.apache.http.client.params.ClientPNames;
import
org.apache.http.client.params.CookiePolicy
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.boot.context.properties.EnableConfigurationProperties
;
import
org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory
;
import
org.springframework.cloud.netflix.ribbon.apache.RetryableRibbonLoadBalancingHttpClient
;
import
org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient
;
import
org.springframework.cloud.netflix.ribbon.okhttp.OkHttpLoadBalancingClient
;
import
org.springframework.cloud.netflix.ribbon.okhttp.RetryableOkHttpLoadBalancingClient
;
import
org.springframework.cloud.netflix.ribbon.apache.HttpClientRibbonConfiguration
;
import
org.springframework.cloud.netflix.ribbon.okhttp.OkHttpRibbonConfiguration
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.
Lazy
;
import
org.springframework.context.annotation.
Import
;
import
com.netflix.client.AbstractLoadBalancerAwareClient
;
import
com.netflix.client.DefaultLoadBalancerRetryHandler
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
...
...
@@ -56,7 +49,6 @@ import com.netflix.loadbalancer.ServerListUpdater;
import
com.netflix.loadbalancer.ZoneAvoidanceRule
;
import
com.netflix.loadbalancer.ZoneAwareLoadBalancer
;
import
com.netflix.niws.client.http.RestClient
;
import
com.netflix.servo.monitor.Monitors
;
import
com.sun.jersey.api.client.Client
;
import
com.sun.jersey.client.apache4.ApacheHttpClient4
;
...
...
@@ -70,6 +62,9 @@ import static org.springframework.cloud.netflix.ribbon.RibbonUtils.updateToHttps
@SuppressWarnings
(
"deprecation"
)
@Configuration
@EnableConfigurationProperties
//Order is important here, last should be the default, first should be optional
// see https://github.com/spring-cloud/spring-cloud-netflix/issues/2086#issuecomment-316281653
@Import
({
OkHttpRibbonConfiguration
.
class
,
RestClientRibbonConfiguration
.
class
,
HttpClientRibbonConfiguration
.
class
})
public
class
RibbonClientConfiguration
{
@Value
(
"${ribbon.client.name}"
)
...
...
@@ -121,112 +116,6 @@ public class RibbonClientConfiguration {
return
serverList
;
}
@Configuration
@ConditionalOnProperty
(
name
=
"ribbon.httpclient.enabled"
,
matchIfMissing
=
true
)
protected
static
class
HttpClientRibbonConfiguration
{
@Value
(
"${ribbon.client.name}"
)
private
String
name
=
"client"
;
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnMissingClass
(
value
=
"org.springframework.retry.support.RetryTemplate"
)
public
RibbonLoadBalancingHttpClient
ribbonLoadBalancingHttpClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
)
{
RibbonLoadBalancingHttpClient
client
=
new
RibbonLoadBalancingHttpClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnClass
(
name
=
"org.springframework.retry.support.RetryTemplate"
)
public
RetryableRibbonLoadBalancingHttpClient
retryableRibbonLoadBalancingHttpClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
,
LoadBalancedRetryPolicyFactory
loadBalancedRetryPolicyFactory
)
{
RetryableRibbonLoadBalancingHttpClient
client
=
new
RetryableRibbonLoadBalancingHttpClient
(
config
,
serverIntrospector
,
loadBalancedRetryPolicyFactory
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
}
@Configuration
@ConditionalOnProperty
(
"ribbon.okhttp.enabled"
)
@ConditionalOnClass
(
name
=
"okhttp3.OkHttpClient"
)
protected
static
class
OkHttpRibbonConfiguration
{
@Value
(
"${ribbon.client.name}"
)
private
String
name
=
"client"
;
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnClass
(
name
=
"org.springframework.retry.support.RetryTemplate"
)
public
RetryableOkHttpLoadBalancingClient
okHttpLoadBalancingClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
,
LoadBalancedRetryPolicyFactory
loadBalancedRetryPolicyFactory
)
{
RetryableOkHttpLoadBalancingClient
client
=
new
RetryableOkHttpLoadBalancingClient
(
config
,
serverIntrospector
,
loadBalancedRetryPolicyFactory
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnMissingClass
(
value
=
"org.springframework.retry.support.RetryTemplate"
)
public
OkHttpLoadBalancingClient
retryableOkHttpLoadBalancingClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
)
{
OkHttpLoadBalancingClient
client
=
new
OkHttpLoadBalancingClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
}
@Configuration
@RibbonAutoConfiguration
.
ConditionalOnRibbonRestClient
protected
static
class
RestClientRibbonConfiguration
{
@Value
(
"${ribbon.client.name}"
)
private
String
name
=
"client"
;
/**
* Create a Netflix {@link RestClient} integrated with Ribbon if none already exists
* in the application context. It is not required for Ribbon to work properly and is
* therefore created lazily if ever another component requires it.
*
* @param config the configuration to use by the underlying Ribbon instance
* @param loadBalancer the load balancer to use by the underlying Ribbon instance
* @param serverIntrospector server introspector to use by the underlying Ribbon instance
* @param retryHandler retry handler to use by the underlying Ribbon instance
* @return a {@link RestClient} instances backed by Ribbon
*/
@Bean
@Lazy
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
public
RestClient
ribbonRestClient
(
IClientConfig
config
,
ILoadBalancer
loadBalancer
,
ServerIntrospector
serverIntrospector
,
RetryHandler
retryHandler
)
{
RestClient
client
=
new
OverrideRestClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
}
@Bean
@ConditionalOnMissingBean
public
ServerListUpdater
ribbonServerListUpdater
(
IClientConfig
config
)
{
...
...
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/HttpClientRibbonConfiguration.java
0 → 100644
View file @
1cf509c3
/*
* Copyright 2013-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
.
ribbon
.
apache
;
import
com.netflix.client.AbstractLoadBalancerAwareClient
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.loadbalancer.ILoadBalancer
;
import
com.netflix.servo.monitor.Monitors
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory
;
import
org.springframework.cloud.netflix.ribbon.ServerIntrospector
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @author Spencer Gibb
*/
@Configuration
@ConditionalOnProperty
(
name
=
"ribbon.httpclient.enabled"
,
matchIfMissing
=
true
)
public
class
HttpClientRibbonConfiguration
{
@Value
(
"${ribbon.client.name}"
)
private
String
name
=
"client"
;
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnMissingClass
(
value
=
"org.springframework.retry.support.RetryTemplate"
)
public
RibbonLoadBalancingHttpClient
ribbonLoadBalancingHttpClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
)
{
RibbonLoadBalancingHttpClient
client
=
new
RibbonLoadBalancingHttpClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnClass
(
name
=
"org.springframework.retry.support.RetryTemplate"
)
public
RetryableRibbonLoadBalancingHttpClient
retryableRibbonLoadBalancingHttpClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
,
LoadBalancedRetryPolicyFactory
loadBalancedRetryPolicyFactory
)
{
RetryableRibbonLoadBalancingHttpClient
client
=
new
RetryableRibbonLoadBalancingHttpClient
(
config
,
serverIntrospector
,
loadBalancedRetryPolicyFactory
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
}
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/okhttp/OkHttpRibbonConfiguration.java
0 → 100644
View file @
1cf509c3
/*
* Copyright 2013-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
.
ribbon
.
okhttp
;
import
com.netflix.client.AbstractLoadBalancerAwareClient
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.loadbalancer.ILoadBalancer
;
import
com.netflix.servo.monitor.Monitors
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
;
import
org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory
;
import
org.springframework.cloud.netflix.ribbon.ServerIntrospector
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* @author Spencer Gibb
*/
@Configuration
@ConditionalOnProperty
(
"ribbon.okhttp.enabled"
)
@ConditionalOnClass
(
name
=
"okhttp3.OkHttpClient"
)
public
class
OkHttpRibbonConfiguration
{
@Value
(
"${ribbon.client.name}"
)
private
String
name
=
"client"
;
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnClass
(
name
=
"org.springframework.retry.support.RetryTemplate"
)
public
RetryableOkHttpLoadBalancingClient
okHttpLoadBalancingClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
,
LoadBalancedRetryPolicyFactory
loadBalancedRetryPolicyFactory
)
{
RetryableOkHttpLoadBalancingClient
client
=
new
RetryableOkHttpLoadBalancingClient
(
config
,
serverIntrospector
,
loadBalancedRetryPolicyFactory
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
@Bean
@ConditionalOnMissingBean
(
AbstractLoadBalancerAwareClient
.
class
)
@ConditionalOnMissingClass
(
value
=
"org.springframework.retry.support.RetryTemplate"
)
public
OkHttpLoadBalancingClient
retryableOkHttpLoadBalancingClient
(
IClientConfig
config
,
ServerIntrospector
serverIntrospector
,
ILoadBalancer
loadBalancer
,
RetryHandler
retryHandler
)
{
OkHttpLoadBalancingClient
client
=
new
OkHttpLoadBalancingClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
}
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java
View file @
1cf509c3
...
...
@@ -148,18 +148,21 @@ public class RibbonClientConfigurationTests {
return
clients
;
}
@SuppressWarnings
(
"deprecation"
)
@Test
public
void
testDefaultsToApacheHttpClient
()
{
testClient
(
RibbonLoadBalancingHttpClient
.
class
,
null
,
RestClient
.
class
,
OkHttpLoadBalancingClient
.
class
);
testClient
(
RibbonLoadBalancingHttpClient
.
class
,
"ribbon.httpclient.enabled"
,
RestClient
.
class
,
OkHttpLoadBalancingClient
.
class
);
}
@SuppressWarnings
(
"deprecation"
)
@Test
public
void
testEnableRestClient
()
{
testClient
(
RestClient
.
class
,
"ribbon.restclient.enabled"
,
RibbonLoadBalancingHttpClient
.
class
,
OkHttpLoadBalancingClient
.
class
);
}
@SuppressWarnings
(
"deprecation"
)
@Test
public
void
testEnableOkHttpClient
()
{
testClient
(
OkHttpLoadBalancingClient
.
class
,
"ribbon.okhttp.enabled"
,
RibbonLoadBalancingHttpClient
.
class
,
...
...
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