Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
thythm
ribbon
提交
3275c24d
R
ribbon
项目概览
thythm
/
ribbon
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
ribbon
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
3275c24d
编写于
3月 18, 2019
作者:
E
elandau
提交者:
GitHub
3月 18, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #401 from elandau/feature/decouple_archaius
configuration: Decouple static archaius
上级
a219149d
8d9d700b
变更
53
展开全部
隐藏空白更改
内联
并排
Showing
53 changed file
with
1121 addition
and
1066 deletion
+1121
-1066
gradle.properties
gradle.properties
+1
-0
ribbon-archaius/build.gradle
ribbon-archaius/build.gradle
+1
-1
ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java
...va/com/netflix/client/config/DefaultClientConfigImpl.java
+424
-331
ribbon-core/build.gradle
ribbon-core/build.gradle
+2
-1
ribbon-core/src/main/java/com/netflix/client/config/CommonClientConfigKey.java
...java/com/netflix/client/config/CommonClientConfigKey.java
+5
-5
ribbon-core/src/main/java/com/netflix/client/config/IClientConfig.java
...rc/main/java/com/netflix/client/config/IClientConfig.java
+13
-2
ribbon-core/src/main/java/com/netflix/client/config/IClientConfigKey.java
...main/java/com/netflix/client/config/IClientConfigKey.java
+41
-1
ribbon-core/src/main/java/com/netflix/client/config/Property.java
...ore/src/main/java/com/netflix/client/config/Property.java
+34
-0
ribbon-core/src/main/java/com/netflix/client/config/UnboxedIntProperty.java
...in/java/com/netflix/client/config/UnboxedIntProperty.java
+19
-0
ribbon-eureka/build.gradle
ribbon-eureka/build.gradle
+2
-2
ribbon-eureka/src/main/java/com/netflix/niws/loadbalancer/DefaultNIWSServerListFilter.java
...etflix/niws/loadbalancer/DefaultNIWSServerListFilter.java
+0
-29
ribbon-eureka/src/main/java/com/netflix/niws/loadbalancer/DiscoveryEnabledNIWSServerList.java
...lix/niws/loadbalancer/DiscoveryEnabledNIWSServerList.java
+1
-1
ribbon-eureka/src/test/java/com/netflix/niws/loadbalancer/DefaultNIWSServerListFilterTest.java
...ix/niws/loadbalancer/DefaultNIWSServerListFilterTest.java
+3
-1
ribbon-eureka/src/test/java/com/netflix/niws/loadbalancer/LBBuilderTest.java
...est/java/com/netflix/niws/loadbalancer/LBBuilderTest.java
+5
-2
ribbon-eureka/src/test/resources/log4j.properties
ribbon-eureka/src/test/resources/log4j.properties
+4
-0
ribbon-evcache/build.gradle
ribbon-evcache/build.gradle
+1
-1
ribbon-httpclient/build.gradle
ribbon-httpclient/build.gradle
+3
-4
ribbon-httpclient/src/main/java/com/netflix/http4/ConnectionPoolCleaner.java
...rc/main/java/com/netflix/http4/ConnectionPoolCleaner.java
+9
-14
ribbon-httpclient/src/main/java/com/netflix/http4/NFHttpClient.java
...pclient/src/main/java/com/netflix/http4/NFHttpClient.java
+56
-54
ribbon-httpclient/src/main/java/com/netflix/http4/NFHttpClientConstants.java
...rc/main/java/com/netflix/http4/NFHttpClientConstants.java
+0
-30
ribbon-httpclient/src/main/java/com/netflix/http4/NFHttpClientFactory.java
.../src/main/java/com/netflix/http4/NFHttpClientFactory.java
+8
-4
ribbon-httpclient/src/main/java/com/netflix/http4/ssl/AcceptAllSocketFactory.java
...in/java/com/netflix/http4/ssl/AcceptAllSocketFactory.java
+1
-1
ribbon-httpclient/src/main/java/com/netflix/niws/client/http/RestClient.java
...rc/main/java/com/netflix/niws/client/http/RestClient.java
+47
-106
ribbon-httpclient/src/test/java/com/netflix/client/testutil/SimpleSSLTestServer.java
...java/com/netflix/client/testutil/SimpleSSLTestServer.java
+6
-2
ribbon-httpclient/src/test/java/com/netflix/niws/client/http/SecureAcceptAllGetTest.java
.../com/netflix/niws/client/http/SecureAcceptAllGetTest.java
+19
-35
ribbon-httpclient/src/test/java/com/netflix/niws/client/http/SecureGetTest.java
...test/java/com/netflix/niws/client/http/SecureGetTest.java
+10
-15
ribbon-httpclient/src/test/resources/log4j.properties
ribbon-httpclient/src/test/resources/log4j.properties
+4
-0
ribbon-loadbalancer/build.gradle
ribbon-loadbalancer/build.gradle
+2
-3
ribbon-loadbalancer/src/main/java/com/netflix/client/PrimeConnections.java
...er/src/main/java/com/netflix/client/PrimeConnections.java
+3
-3
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/AbstractServerPredicate.java
...ava/com/netflix/loadbalancer/AbstractServerPredicate.java
+12
-7
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/AvailabilityFilteringRule.java
...a/com/netflix/loadbalancer/AvailabilityFilteringRule.java
+2
-2
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/AvailabilityPredicate.java
.../java/com/netflix/loadbalancer/AvailabilityPredicate.java
+41
-26
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/BaseLoadBalancer.java
.../main/java/com/netflix/loadbalancer/BaseLoadBalancer.java
+3
-2
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerContext.java
...in/java/com/netflix/loadbalancer/LoadBalancerContext.java
+3
-3
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerStats.java
...main/java/com/netflix/loadbalancer/LoadBalancerStats.java
+79
-74
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/PollingServerListUpdater.java
...va/com/netflix/loadbalancer/PollingServerListUpdater.java
+19
-65
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ServerListSubsetFilter.java
...java/com/netflix/loadbalancer/ServerListSubsetFilter.java
+40
-25
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ServerStats.java
...r/src/main/java/com/netflix/loadbalancer/ServerStats.java
+31
-69
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAffinityPredicate.java
.../java/com/netflix/loadbalancer/ZoneAffinityPredicate.java
+5
-14
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAffinityServerListFilter.java
...om/netflix/loadbalancer/ZoneAffinityServerListFilter.java
+38
-40
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAvoidancePredicate.java
...java/com/netflix/loadbalancer/ZoneAvoidancePredicate.java
+30
-30
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAvoidanceRule.java
...main/java/com/netflix/loadbalancer/ZoneAvoidanceRule.java
+1
-4
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAwareLoadBalancer.java
.../java/com/netflix/loadbalancer/ZoneAwareLoadBalancer.java
+53
-31
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/PredicatesTest.java
...rc/test/java/com/netflix/loadbalancer/PredicatesTest.java
+5
-3
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/ServerStatsTest.java
...c/test/java/com/netflix/loadbalancer/ServerStatsTest.java
+1
-1
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/SubsetFilterTest.java
.../test/java/com/netflix/loadbalancer/SubsetFilterTest.java
+12
-18
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/ZoneAwareLoadBalancerTest.java
...a/com/netflix/loadbalancer/ZoneAwareLoadBalancerTest.java
+6
-0
ribbon-loadbalancer/src/test/resources/log4j.properties
ribbon-loadbalancer/src/test/resources/log4j.properties
+4
-0
ribbon-transport/build.gradle
ribbon-transport/build.gradle
+2
-2
ribbon-transport/src/test/resources/log4j.properties
ribbon-transport/src/test/resources/log4j.properties
+4
-0
ribbon/build.gradle
ribbon/build.gradle
+1
-1
ribbon/src/main/java/com/netflix/ribbon/ClientOptions.java
ribbon/src/main/java/com/netflix/ribbon/ClientOptions.java
+1
-1
ribbon/src/test/resources/log4j.properties
ribbon/src/test/resources/log4j.properties
+4
-0
未找到文件。
gradle.properties
浏览文件 @
3275c24d
...
...
@@ -6,6 +6,7 @@ guava_version=14.0.1
archaius_version
=
0.7.6
eureka_version
=
1.7.2
jersey_version
=
1.19.1
slf4j_version
=
1.7.2
junit_version
=
4.12
powermock_version
=
1.6.2
...
...
ribbon-archaius/build.gradle
浏览文件 @
3275c24d
dependencies
{
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"org.slf4j:slf4j-api:${slf4j_version}"
compile
'com.google.code.findbugs:annotations:2.0.0'
compile
"com.google.guava:guava:${guava_version}"
compile
'commons-configuration:commons-configuration:1.8'
...
...
ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java
浏览文件 @
3275c24d
此差异已折叠。
点击以展开。
ribbon-core/build.gradle
浏览文件 @
3275c24d
dependencies
{
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"org.slf4j:slf4j-api:${slf4j_version}"
compile
'com.google.code.findbugs:annotations:2.0.0'
compile
"com.google.guava:guava:${guava_version}"
compile
'commons-lang:commons-lang:2.6'
testCompile
'junit:junit:4.11'
testCompile
"org.slf4j:slf4j-log4j12:${slf4j_version}"
testCompile
project
(
":ribbon-archaius"
)
}
ribbon-core/src/main/java/com/netflix/client/config/CommonClientConfigKey.java
浏览文件 @
3275c24d
...
...
@@ -106,9 +106,9 @@ public abstract class CommonClientConfigKey<T> implements IClientConfigKey<T> {
public
static
final
IClientConfigKey
<
Integer
>
SendBufferSize
=
new
CommonClientConfigKey
<
Integer
>(
"SendBufferSize"
){};
public
static
final
IClientConfigKey
<
Boolean
>
StaleCheckingEnabled
=
new
CommonClientConfigKey
<
Boolean
>(
"StaleCheckingEnabled"
){};
public
static
final
IClientConfigKey
<
Boolean
>
StaleCheckingEnabled
=
new
CommonClientConfigKey
<
Boolean
>(
"StaleCheckingEnabled"
,
false
){};
public
static
final
IClientConfigKey
<
Integer
>
Linger
=
new
CommonClientConfigKey
<
Integer
>(
"Linger"
){};
public
static
final
IClientConfigKey
<
Integer
>
Linger
=
new
CommonClientConfigKey
<
Integer
>(
"Linger"
,
0
){};
public
static
final
IClientConfigKey
<
Integer
>
ConnectionManagerTimeout
=
new
CommonClientConfigKey
<
Integer
>(
"ConnectionManagerTimeout"
,
2000
){};
...
...
@@ -116,9 +116,9 @@ public abstract class CommonClientConfigKey<T> implements IClientConfigKey<T> {
public
static
final
IClientConfigKey
<
Boolean
>
ConnectionPoolCleanerTaskEnabled
=
new
CommonClientConfigKey
<
Boolean
>(
"ConnectionPoolCleanerTaskEnabled"
,
true
){};
public
static
final
IClientConfigKey
<
Integer
>
ConnIdleEvictTimeMilliSeconds
=
new
CommonClientConfigKey
<
Integer
>(
"ConnIdleEvictTimeMilliSeconds"
){};
public
static
final
IClientConfigKey
<
Integer
>
ConnIdleEvictTimeMilliSeconds
=
new
CommonClientConfigKey
<
Integer
>(
"ConnIdleEvictTimeMilliSeconds"
,
30
*
1000
){};
public
static
final
IClientConfigKey
<
Integer
>
ConnectionCleanerRepeatInterval
=
new
CommonClientConfigKey
<
Integer
>(
"ConnectionCleanerRepeatInterval"
){};
public
static
final
IClientConfigKey
<
Integer
>
ConnectionCleanerRepeatInterval
=
new
CommonClientConfigKey
<
Integer
>(
"ConnectionCleanerRepeatInterval"
,
30
*
1000
){};
public
static
final
IClientConfigKey
<
Boolean
>
EnableGZIPContentEncodingFilter
=
new
CommonClientConfigKey
<
Boolean
>(
"EnableGZIPContentEncodingFilter"
,
false
){};
...
...
@@ -282,6 +282,6 @@ public abstract class CommonClientConfigKey<T> implements IClientConfigKey<T> {
}
@Override
public
T
getD
efaultValue
()
{
return
defaultValue
;
}
public
T
d
efaultValue
()
{
return
defaultValue
;
}
}
ribbon-core/src/main/java/com/netflix/client/config/IClientConfig.java
浏览文件 @
3275c24d
...
...
@@ -106,9 +106,20 @@ public interface IClientConfig {
* <br><br>
*/
default
<
T
>
T
getOrDefault
(
IClientConfigKey
<
T
>
key
)
{
return
get
(
key
,
key
.
getD
efaultValue
());
return
get
(
key
,
key
.
d
efaultValue
());
}
/**
* @return Return a global dynamic property not scoped to the specific client. The property will be looked up as is using the
* key without any client name or namespace prefix
*/
<
T
>
Property
<
T
>
getGlobalProperty
(
IClientConfigKey
<
T
>
key
);
/**
* @return Return a dynamic property scoped to the client name or namespace.
*/
<
T
>
Property
<
T
>
getDynamicProperty
(
IClientConfigKey
<
T
>
key
);
/**
* Returns a typed property. If the property of IClientConfigKey is not set,
* it returns the default value passed in as the parameter.
...
...
@@ -119,7 +130,7 @@ public interface IClientConfig {
* Set the typed property with the given value.
*/
<
T
>
IClientConfig
set
(
IClientConfigKey
<
T
>
key
,
T
value
);
class
Builder
{
private
IClientConfig
config
;
...
...
ribbon-core/src/main/java/com/netflix/client/config/IClientConfigKey.java
浏览文件 @
3275c24d
...
...
@@ -43,5 +43,45 @@ public interface IClientConfigKey<T> {
*/
Class
<
T
>
type
();
default
T
getDefaultValue
()
{
return
null
;
}
default
T
defaultValue
()
{
return
null
;
}
default
IClientConfigKey
<
T
>
format
(
Object
...
args
)
{
return
create
(
String
.
format
(
key
(),
args
),
type
(),
defaultValue
());
}
default
IClientConfigKey
<
T
>
create
(
String
key
,
Class
<
T
>
type
,
T
defaultValue
)
{
return
new
IClientConfigKey
<
T
>()
{
@Override
public
int
hashCode
()
{
return
key
().
hashCode
();
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
obj
instanceof
IClientConfigKey
)
{
return
key
().
equals
(((
IClientConfigKey
)
obj
).
key
());
}
return
false
;
}
@Override
public
String
toString
()
{
return
key
();
}
@Override
public
String
key
()
{
return
key
;
}
@Override
public
Class
<
T
>
type
()
{
return
type
;
}
@Override
public
T
defaultValue
()
{
return
defaultValue
;
}
};
}
}
ribbon-core/src/main/java/com/netflix/client/config/Property.java
0 → 100644
浏览文件 @
3275c24d
package
com.netflix.client.config
;
import
java.util.function.Consumer
;
/**
* Ribbon specific encapsulation of a dynamic configuration property
* @param <T>
*/
public
interface
Property
<
T
>
{
/**
* Register a consumer to be called when the configuration changes
* @param consumer
*/
void
onChange
(
Consumer
<
T
>
consumer
);
/**
* @return Get the current value or default value
*/
T
get
();
static
<
T
>
Property
<
T
>
of
(
T
value
)
{
return
new
Property
<
T
>()
{
@Override
public
void
onChange
(
Consumer
<
T
>
consumer
)
{
}
@Override
public
T
get
()
{
return
value
;
}
};
}
}
ribbon-core/src/main/java/com/netflix/client/config/UnboxedIntProperty.java
0 → 100644
浏览文件 @
3275c24d
package
com.netflix.client.config
;
public
class
UnboxedIntProperty
{
private
volatile
int
value
;
public
UnboxedIntProperty
(
Property
<
Integer
>
delegate
)
{
this
.
value
=
delegate
.
get
();
delegate
.
onChange
(
newValue
->
this
.
value
=
newValue
);
}
public
UnboxedIntProperty
(
int
constantValue
)
{
this
.
value
=
constantValue
;
}
public
int
get
()
{
return
value
;
}
}
ribbon-eureka/build.gradle
浏览文件 @
3275c24d
...
...
@@ -3,10 +3,10 @@ dependencies {
compile
project
(
':ribbon-loadbalancer'
)
compile
"com.netflix.eureka:eureka-client:${eureka_version}"
compile
'com.google.code.findbugs:annotations:2.0.0'
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"com.netflix.archaius:archaius-core:${archaius_version}"
compile
"org.slf4j:slf4j-api:${slf4j_version}"
testCompile
project
(
":ribbon-archaius"
)
testCompile
"org.slf4j:slf4j-log4j12:${slf4j_version}"
testCompile
"junit:junit:${junit_version}"
testCompile
"org.powermock:powermock-easymock-release-full:${powermock_version}"
testCompile
"org.powermock:powermock-mockito-release-full:${powermock_version}"
...
...
ribbon-eureka/src/main/java/com/netflix/niws/loadbalancer/DefaultNIWSServerListFilter.java
已删除
100644 → 0
浏览文件 @
a219149d
/*
*
* Copyright 2013 Netflix, Inc.
*
* 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
com.netflix.niws.loadbalancer
;
import
com.netflix.loadbalancer.Server
;
import
com.netflix.loadbalancer.ZoneAffinityServerListFilter
;
/**
* The Default NIWS Filter - deals with filtering out servers based on the Zone affinity and other related properties
* @author stonse
*
*/
public
class
DefaultNIWSServerListFilter
<
T
extends
Server
>
extends
ZoneAffinityServerListFilter
<
T
>
{
}
ribbon-eureka/src/main/java/com/netflix/niws/loadbalancer/DiscoveryEnabledNIWSServerList.java
浏览文件 @
3275c24d
...
...
@@ -56,7 +56,7 @@ public class DiscoveryEnabledNIWSServerList extends AbstractServerList<Discovery
String
datacenter
;
String
targetRegion
;
int
overridePort
=
CommonClientConfigKey
.
Port
.
getD
efaultValue
();
int
overridePort
=
CommonClientConfigKey
.
Port
.
d
efaultValue
();
boolean
shouldUseOverridePort
=
false
;
boolean
shouldUseIpAddr
=
false
;
...
...
ribbon-eureka/src/test/java/com/netflix/niws/loadbalancer/DefaultNIWSServerListFilterTest.java
浏览文件 @
3275c24d
...
...
@@ -23,6 +23,8 @@ import static org.junit.Assert.assertTrue;
import
java.util.ArrayList
;
import
java.util.List
;
import
com.netflix.config.ConfigurationBasedDeploymentContext
;
import
org.junit.Assert
;
import
org.junit.BeforeClass
;
import
org.junit.Test
;
...
...
@@ -40,7 +42,7 @@ import com.netflix.loadbalancer.ZoneAffinityServerListFilter;
public
class
DefaultNIWSServerListFilterTest
{
@BeforeClass
public
static
void
init
()
{
ConfigurationManager
.
getDeploymentContext
().
setValue
(
ContextKey
.
zone
,
"us-eAst-1C"
);
ConfigurationManager
.
getConfigInstance
().
setProperty
(
ContextKey
.
zone
.
getKey
()
,
"us-eAst-1C"
);
}
private
DiscoveryEnabledServer
createServer
(
String
host
,
String
zone
)
{
...
...
ribbon-eureka/src/test/java/com/netflix/niws/loadbalancer/LBBuilderTest.java
浏览文件 @
3275c24d
...
...
@@ -25,6 +25,7 @@ import com.netflix.loadbalancer.ZoneAffinityServerListFilter;
import
com.netflix.loadbalancer.ZoneAwareLoadBalancer
;
import
org.apache.commons.configuration.Configuration
;
import
org.junit.Before
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.powermock.api.easymock.PowerMock
;
...
...
@@ -79,10 +80,11 @@ public class LBBuilderTest {
}
@Test
@Ignore
public
void
testBuildWithDiscoveryEnabledNIWSServerList
()
{
IRule
rule
=
new
AvailabilityFilteringRule
();
ServerList
<
DiscoveryEnabledServer
>
list
=
new
DiscoveryEnabledNIWSServerList
(
"dummy:7001"
);
ServerListFilter
<
DiscoveryEnabledServer
>
filter
=
new
ZoneAffinityServerListFilter
<
DiscoveryEnabledServer
>();
ServerListFilter
<
DiscoveryEnabledServer
>
filter
=
new
ZoneAffinityServerListFilter
<>();
ZoneAwareLoadBalancer
<
DiscoveryEnabledServer
>
lb
=
LoadBalancerBuilder
.<
DiscoveryEnabledServer
>
newBuilder
()
.
withDynamicServerList
(
list
)
.
withRule
(
rule
)
...
...
@@ -98,10 +100,11 @@ public class LBBuilderTest {
}
@Test
@Ignore
public
void
testBuildWithDiscoveryEnabledNIWSServerListAndUpdater
()
{
IRule
rule
=
new
AvailabilityFilteringRule
();
ServerList
<
DiscoveryEnabledServer
>
list
=
new
DiscoveryEnabledNIWSServerList
(
"dummy:7001"
);
ServerListFilter
<
DiscoveryEnabledServer
>
filter
=
new
ZoneAffinityServerListFilter
<
DiscoveryEnabledServer
>();
ServerListFilter
<
DiscoveryEnabledServer
>
filter
=
new
ZoneAffinityServerListFilter
<>();
ServerListUpdater
updater
=
new
PollingServerListUpdater
();
ZoneAwareLoadBalancer
<
DiscoveryEnabledServer
>
lb
=
LoadBalancerBuilder
.<
DiscoveryEnabledServer
>
newBuilder
()
.
withDynamicServerList
(
list
)
...
...
ribbon-eureka/src/test/resources/log4j.properties
0 → 100644
浏览文件 @
3275c24d
log4j.rootCategory
=
INFO,stdout
log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=
%d %-5p %C:%L [%t] [%M] %m%n
ribbon-evcache/build.gradle
浏览文件 @
3275c24d
...
...
@@ -2,7 +2,7 @@ dependencies {
compile
project
(
':ribbon'
)
compile
'com.netflix.evcache:evcache-client:1.0.5'
compile
"io.reactivex:rxjava:${rx_java_version}"
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"org.slf4j:slf4j-api:${slf4j_version}"
testCompile
project
(
':ribbon-test'
)
testCompile
project
(
path:
':ribbon'
,
configuration:
'test'
)
testCompile
"junit:junit:${junit_version}"
...
...
ribbon-httpclient/build.gradle
浏览文件 @
3275c24d
dependencies
{
compile
project
(
':ribbon-core'
)
compile
project
(
':ribbon-archaius'
)
compile
project
(
':ribbon-loadbalancer'
)
compile
'commons-collections:commons-collections:3.2.2'
compile
'org.apache.httpcomponents:httpclient:4.2.1'
compile
'com.google.code.findbugs:annotations:2.0.0'
compile
"com.sun.jersey:jersey-client:${jersey_version}"
compile
"com.sun.jersey.contribs:jersey-apache-client4:${jersey_version}"
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"org.slf4j:slf4j-api:${slf4j_version}"
compile
"com.netflix.servo:servo-core:${servo_version}"
compile
"com.google.guava:guava:${guava_version}"
compile
"com.netflix.archaius:archaius-core:${archaius_version}"
compile
'com.netflix.netflix-commons:netflix-commons-util:0.1.1'
testCompile
'junit:junit:4.11'
testCompile
'org.slf4j:slf4j-log4j12:1.7.2'
testCompile
"org.slf4j:slf4j-log4j12:${slf4j_version}"
testCompile
'commons-io:commons-io:2.0.1'
testCompile
"com.sun.jersey:jersey-server:${jersey_version}"
testCompile
'com.google.mockwebserver:mockwebserver:20130505'
testCompile
project
(
':ribbon-archaius'
)
testCompile
project
(
":ribbon-loadbalancer"
).
sourceSets
.
test
.
output
}
ribbon-httpclient/src/main/java/com/netflix/http4/ConnectionPoolCleaner.java
浏览文件 @
3275c24d
...
...
@@ -17,16 +17,14 @@
*/
package
com.netflix.http4
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledFuture
;
import
java.util.concurrent.TimeUnit
;
import
com.netflix.client.config.Property
;
import
org.apache.http.conn.ClientConnectionManager
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledFuture
;
import
java.util.concurrent.TimeUnit
;
/**
* Class that is responsible to cleanup connections based on a policy
...
...
@@ -41,14 +39,12 @@ public class ConnectionPoolCleaner {
String
name
=
"default"
;
ClientConnectionManager
connMgr
;
ScheduledExecutorService
scheduler
;
private
DynamicIntProperty
connIdleEvictTimeMilliSeconds
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
"default.nfhttpclient.connIdleEvictTimeMilliSeconds"
,
NFHttpClientConstants
.
DEFAULT_CONNECTIONIDLE_TIME_IN_MSECS
);
private
Property
<
Integer
>
connIdleEvictTimeMilliSeconds
=
Property
.
of
(
30
*
1000
);
volatile
boolean
enableConnectionPoolCleanerTask
=
false
;
long
connectionCleanerTimerDelay
=
10
;
long
connectionCleanerRepeatInterval
=
NFHttpClientConstants
.
DEFAULT_CONNECTION_IDLE_TIMERTASK_REPEAT_IN_MSECS
;
long
connectionCleanerRepeatInterval
=
30
*
1000
;
private
volatile
ScheduledFuture
<?>
scheduledFuture
;
public
ConnectionPoolCleaner
(
String
name
,
ClientConnectionManager
connMgr
,
ScheduledExecutorService
scheduler
){
...
...
@@ -57,12 +53,11 @@ public class ConnectionPoolCleaner {
this
.
scheduler
=
scheduler
;
}
public
DynamicIntProperty
getConnIdleEvictTimeMilliSeconds
()
{
public
Property
<
Integer
>
getConnIdleEvictTimeMilliSeconds
()
{
return
connIdleEvictTimeMilliSeconds
;
}
public
void
setConnIdleEvictTimeMilliSeconds
(
DynamicIntProperty
connIdleEvictTimeMilliSeconds
)
{
public
void
setConnIdleEvictTimeMilliSeconds
(
Property
<
Integer
>
connIdleEvictTimeMilliSeconds
)
{
this
.
connIdleEvictTimeMilliSeconds
=
connIdleEvictTimeMilliSeconds
;
}
...
...
ribbon-httpclient/src/main/java/com/netflix/http4/NFHttpClient.java
浏览文件 @
3275c24d
...
...
@@ -17,16 +17,17 @@
*/
package
com.netflix.http4
;
import
java.io.IOException
;
import
java.net.URI
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ThreadFactory
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
com.google.common.util.concurrent.ThreadFactoryBuilder
;
import
com.netflix.client.config.ClientConfigFactory
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.Property
;
import
com.netflix.servo.annotations.DataSourceType
;
import
com.netflix.servo.annotations.Monitor
;
import
com.netflix.servo.monitor.Monitors
;
import
com.netflix.servo.monitor.Stopwatch
;
import
com.netflix.servo.monitor.Timer
;
import
org.apache.http.Header
;
import
org.apache.http.HttpHost
;
import
org.apache.http.HttpRequest
;
...
...
@@ -47,18 +48,15 @@ import org.apache.http.protocol.HttpContext;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.util.concurrent.ThreadFactoryBuilder
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
com.netflix.servo.annotations.DataSourceType
;
import
com.netflix.servo.annotations.Monitor
;
import
com.netflix.servo.monitor.Monitors
;
import
com.netflix.servo.monitor.Stopwatch
;
import
com.netflix.servo.monitor.Timer
;
import
com.netflix.utils.ScheduledThreadPoolExectuorWithDynamicSize
;
import
java.io.IOException
;
import
java.net.URI
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ThreadFactory
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicInteger
;
/**
* Netflix extension of Apache 4.0 HttpClient
...
...
@@ -71,6 +69,10 @@ public class NFHttpClient extends DefaultHttpClient {
private
static
final
Logger
LOGGER
=
LoggerFactory
.
getLogger
(
NFHttpClient
.
class
);
private
static
IClientConfigKey
<
Integer
>
RETRIES
=
new
CommonClientConfigKey
<
Integer
>(
"%s.nfhttpclient.retries"
,
3
)
{};
private
static
IClientConfigKey
<
Integer
>
SLEEP_TIME_FACTOR_MS
=
new
CommonClientConfigKey
<
Integer
>(
"%s.nfhttpclient.sleepTimeFactorMs"
,
10
)
{};
private
static
IClientConfigKey
<
Integer
>
CONN_IDLE_EVICT_TIME_MILLIS
=
new
CommonClientConfigKey
<
Integer
>(
"%s.nfhttpclient.connIdleEvictTimeMilliSeconds"
,
30
*
1000
)
{};
protected
static
final
String
EXECUTE_TRACER
=
"HttpClient-ExecuteTimer"
;
private
static
ScheduledExecutorService
connectionPoolCleanUpScheduler
;
...
...
@@ -84,15 +86,15 @@ public class NFHttpClient extends DefaultHttpClient {
ConnectionPoolCleaner
connPoolCleaner
;
DynamicIntProperty
connIdleEvictTimeMilliSeconds
;
Property
<
Integer
>
connIdleEvictTimeMilliSeconds
;
private
DynamicIntProperty
retriesProperty
;
private
DynamicIntProperty
sleepTimeFactorMsProperty
;
private
Property
<
Integer
>
retriesProperty
;
private
Property
<
Integer
>
sleepTimeFactorMsProperty
;
private
Timer
tracer
;
private
DynamicIntProperty
maxTotalConnectionProperty
;
private
DynamicIntProperty
maxConnectionPerHostProperty
;
private
Property
<
Integer
>
maxTotalConnectionProperty
;
private
Property
<
Integer
>
maxConnectionPerHostProperty
;
static
{
ThreadFactory
factory
=
(
new
ThreadFactoryBuilder
()).
setDaemon
(
true
)
...
...
@@ -106,17 +108,25 @@ public class NFHttpClient extends DefaultHttpClient {
this
.
name
=
"UNNAMED_"
+
numNonNamedHttpClients
.
incrementAndGet
();
httpHost
=
new
HttpHost
(
host
,
port
);
httpRoute
=
new
HttpRoute
(
httpHost
);
init
(
DefaultClientConfigImpl
.
getClientConfigWithDefaultValues
(),
false
);
init
(
createDefaultConfig
(),
false
);
}
protected
NFHttpClient
(){
super
(
new
ThreadSafeClientConnManager
());
this
.
name
=
"UNNAMED_"
+
numNonNamedHttpClients
.
incrementAndGet
();
init
(
DefaultClientConfigImpl
.
getClientConfigWithDefaultValues
(),
false
);
init
(
createDefaultConfig
(),
false
);
}
private
static
IClientConfig
createDefaultConfig
()
{
IClientConfig
config
=
ClientConfigFactory
.
DEFAULT
.
newConfig
();
config
.
loadProperties
(
"default"
);
return
config
;
}
protected
NFHttpClient
(
String
name
)
{
this
(
name
,
DefaultClientConfigImpl
.
getClientConfigWithDefaultValues
(),
true
);
this
(
name
,
createDefaultConfig
(),
true
);
}
protected
NFHttpClient
(
String
name
,
IClientConfig
config
)
{
...
...
@@ -144,8 +154,9 @@ public class NFHttpClient extends DefaultHttpClient {
connPoolCleaner
=
new
ConnectionPoolCleaner
(
name
,
this
.
getConnectionManager
(),
connectionPoolCleanUpScheduler
);
this
.
retriesProperty
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
this
.
name
+
".nfhttpclient"
+
".retries"
,
3
);
this
.
sleepTimeFactorMsProperty
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
this
.
name
+
".nfhttpclient"
+
".sleepTimeFactorMs"
,
10
);
this
.
retriesProperty
=
config
.
getGlobalProperty
(
RETRIES
.
format
(
name
));
this
.
sleepTimeFactorMsProperty
=
config
.
getGlobalProperty
(
SLEEP_TIME_FACTOR_MS
.
format
(
name
));
setHttpRequestRetryHandler
(
new
NFHttpMethodRetryHandler
(
this
.
name
,
this
.
retriesProperty
.
get
(),
false
,
this
.
sleepTimeFactorMsProperty
.
get
()));
...
...
@@ -153,22 +164,17 @@ public class NFHttpClient extends DefaultHttpClient {
if
(
registerMonitor
)
{
Monitors
.
registerObject
(
name
,
this
);
}
maxTotalConnectionProperty
=
new
DynamicIntProperty
(
this
.
name
+
"."
+
config
.
getNameSpace
()
+
"."
+
CommonClientConfigKey
.
MaxTotalHttpConnections
.
key
(),
DefaultClientConfigImpl
.
DEFAULT_MAX_TOTAL_HTTP_CONNECTIONS
);
maxTotalConnectionProperty
.
addCallback
(
new
Runnable
()
{
@Override
public
void
run
()
{
((
ThreadSafeClientConnManager
)
getConnectionManager
()).
setMaxTotal
(
maxTotalConnectionProperty
.
get
());
}
});
maxConnectionPerHostProperty
=
new
DynamicIntProperty
(
this
.
name
+
"."
+
config
.
getNameSpace
()
+
"."
+
CommonClientConfigKey
.
MaxHttpConnectionsPerHost
.
key
(),
DefaultClientConfigImpl
.
DEFAULT_MAX_HTTP_CONNECTIONS_PER_HOST
);
maxConnectionPerHostProperty
.
addCallback
(
new
Runnable
()
{
@Override
public
void
run
()
{
((
ThreadSafeClientConnManager
)
getConnectionManager
()).
setDefaultMaxPerRoute
(
maxConnectionPerHostProperty
.
get
());
}
});
maxTotalConnectionProperty
=
config
.
getDynamicProperty
(
CommonClientConfigKey
.
MaxTotalHttpConnections
);
maxTotalConnectionProperty
.
onChange
(
newValue
->
((
ThreadSafeClientConnManager
)
getConnectionManager
()).
setMaxTotal
(
newValue
)
);
maxConnectionPerHostProperty
=
config
.
getDynamicProperty
(
CommonClientConfigKey
.
MaxHttpConnectionsPerHost
);
maxConnectionPerHostProperty
.
onChange
(
newValue
->
((
ThreadSafeClientConnManager
)
getConnectionManager
()).
setDefaultMaxPerRoute
(
newValue
)
);
connIdleEvictTimeMilliSeconds
=
config
.
getGlobalProperty
(
CONN_IDLE_EVICT_TIME_MILLIS
.
format
(
name
));
}
public
void
initConnectionCleanerTask
(){
...
...
@@ -188,11 +194,7 @@ public class NFHttpClient extends DefaultHttpClient {
}
@Monitor
(
name
=
"HttpClient-ConnIdleEvictTimeMilliSeconds"
,
type
=
DataSourceType
.
INFORMATIONAL
)
public
DynamicIntProperty
getConnIdleEvictTimeMilliSeconds
()
{
if
(
connIdleEvictTimeMilliSeconds
==
null
){
connIdleEvictTimeMilliSeconds
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
name
+
".nfhttpclient.connIdleEvictTimeMilliSeconds"
,
NFHttpClientConstants
.
DEFAULT_CONNECTIONIDLE_TIME_IN_MSECS
);
}
public
Property
<
Integer
>
getConnIdleEvictTimeMilliSeconds
()
{
return
connIdleEvictTimeMilliSeconds
;
}
...
...
@@ -234,7 +236,7 @@ public class NFHttpClient extends DefaultHttpClient {
return
this
.
retriesProperty
.
get
();
}
public
void
setConnIdleEvictTimeMilliSeconds
(
DynamicIntProperty
connIdleEvictTimeMilliSeconds
)
{
public
void
setConnIdleEvictTimeMilliSeconds
(
Property
<
Integer
>
connIdleEvictTimeMilliSeconds
)
{
this
.
connIdleEvictTimeMilliSeconds
=
connIdleEvictTimeMilliSeconds
;
}
...
...
ribbon-httpclient/src/main/java/com/netflix/http4/NFHttpClientConstants.java
已删除
100644 → 0
浏览文件 @
a219149d
/*
*
* Copyright 2013 Netflix, Inc.
*
* 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
com.netflix.http4
;
public
class
NFHttpClientConstants
{
public
static
final
boolean
DEFAULT_CONNECTIONIDLE_TIMETASK_ENABLED
=
false
;
public
static
final
int
DEFAULT_CONNECTION_IDLE_TIMERTASK_REPEAT_IN_MSECS
=
30
*
1000
;
// every half minute (30 secs)
public
static
final
int
DEFAULT_CONNECTIONIDLE_TIME_IN_MSECS
=
30
*
1000
;
// all connections idle for 30 secs
public
static
final
int
DEFAULT_CONNECTION_MAXAGE_IN_MSECS
=
5
*
60
*
1000
;
// max age
}
ribbon-httpclient/src/main/java/com/netflix/http4/NFHttpClientFactory.java
浏览文件 @
3275c24d
...
...
@@ -20,9 +20,9 @@ package com.netflix.http4;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
import
com.netflix.client.config.ClientConfigFactory
;
import
org.apache.commons.collections.keyvalue.MultiKey
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.servo.monitor.Monitors
;
...
...
@@ -52,15 +52,19 @@ public class NFHttpClientFactory {
}
public
static
NFHttpClient
getNamedNFHttpClient
(
String
name
)
{
return
getNamedNFHttpClient
(
name
,
DefaultClientConfigImpl
.
getClientConfigWithDefaultValues
(
name
),
true
);
IClientConfig
config
=
ClientConfigFactory
.
DEFAULT
.
newConfig
();
config
.
loadProperties
(
name
);
return
getNamedNFHttpClient
(
name
,
config
,
true
);
}
public
static
NFHttpClient
getNamedNFHttpClient
(
String
name
,
IClientConfig
config
)
{
return
getNamedNFHttpClient
(
name
,
config
,
true
);
}
public
static
NFHttpClient
getNamedNFHttpClient
(
String
name
,
boolean
registerMonitor
)
{
return
getNamedNFHttpClient
(
name
,
DefaultClientConfigImpl
.
getClientConfigWithDefaultValues
(
name
),
registerMonitor
);
public
static
NFHttpClient
getNamedNFHttpClient
(
String
name
,
boolean
registerMonitor
)
{
IClientConfig
config
=
ClientConfigFactory
.
DEFAULT
.
newConfig
();
config
.
loadProperties
(
name
);
return
getNamedNFHttpClient
(
name
,
config
,
registerMonitor
);
}
public
static
NFHttpClient
getNamedNFHttpClient
(
String
name
,
IClientConfig
config
,
boolean
registerMonitor
)
{
...
...
ribbon-httpclient/src/main/java/com/netflix/http4/ssl/AcceptAllSocketFactory.java
浏览文件 @
3275c24d
...
...
@@ -64,7 +64,7 @@ public class AcceptAllSocketFactory extends SSLSocketFactory implements IClientC
return
;
}
if
(
clientConfig
.
getProperty
(
CommonClientConfigKey
.
TrustStore
)
!=
null
)
{
if
(
clientConfig
.
getOrDefault
(
CommonClientConfigKey
.
TrustStore
)
!=
null
)
{
throw
new
IllegalArgumentException
(
"Client configured with an AcceptAllSocketFactory cannot utilize a truststore"
);
}
}
...
...
ribbon-httpclient/src/main/java/com/netflix/niws/client/http/RestClient.java
浏览文件 @
3275c24d
...
...
@@ -28,6 +28,7 @@ import java.security.KeyStore;
import
java.util.Collection
;
import
java.util.Map
;
import
com.netflix.client.config.Property
;
import
org.apache.http.HttpHost
;
import
org.apache.http.client.HttpClient
;
import
org.apache.http.client.UserTokenHandler
;
...
...
@@ -52,7 +53,6 @@ import com.netflix.client.ClientException;
import
com.netflix.client.ClientFactory
;
import
com.netflix.client.RequestSpecificRetryHandler
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.http.HttpRequest
;
...
...
@@ -60,11 +60,7 @@ import com.netflix.client.http.HttpResponse;
import
com.netflix.client.ssl.AbstractSslContextFactory
;
import
com.netflix.client.ssl.ClientSslSocketFactoryException
;
import
com.netflix.client.ssl.URLSslContextFactory
;
import
com.netflix.config.ConfigurationManager
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
com.netflix.http4.NFHttpClient
;
import
com.netflix.http4.NFHttpClientConstants
;
import
com.netflix.http4.NFHttpClientFactory
;
import
com.netflix.http4.NFHttpMethodRetryHandler
;
import
com.netflix.http4.ssl.KeyStoreAwareSocketFactory
;
...
...
@@ -92,13 +88,17 @@ import com.sun.jersey.client.apache4.config.DefaultApacheHttpClient4Config;
@Deprecated
public
class
RestClient
extends
AbstractLoadBalancerAwareClient
<
HttpRequest
,
HttpResponse
>
{
private
static
IClientConfigKey
<
Integer
>
CONN_IDLE_EVICT_TIME_MILLIS
=
new
CommonClientConfigKey
<
Integer
>(
"%s.nfhttpclient.connIdleEvictTimeMilliSeconds"
)
{};
private
Client
restClient
;
private
HttpClient
httpClient4
;
private
IClientConfig
ncc
;
private
String
restClientName
;
private
boolean
enableConnectionPoolCleanerTask
=
false
;
private
DynamicIntProperty
connIdleEvictTimeMilliSeconds
;
private
Property
<
Integer
>
connIdleEvictTimeMilliSeconds
;
private
int
connectionCleanerRepeatInterval
;
private
int
maxConnectionsperHost
;
private
int
maxTotalConnections
;
...
...
@@ -112,7 +112,7 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
private
boolean
ignoreUserToken
;
private
ApacheHttpClient4Config
config
;
boolean
bFollowRedirects
=
DefaultClientConfigImpl
.
DEFAULT_FOLLOW_REDIRECTS
;
boolean
bFollowRedirects
=
CommonClientConfigKey
.
FollowRedirects
.
defaultValue
()
;
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
RestClient
.
class
);
...
...
@@ -164,6 +164,11 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
this
.
setRetryHandler
(
new
HttpClientLoadBalancerErrorHandler
(
ncc
));
}
private
void
throwInvalidValue
(
IClientConfigKey
<?>
key
,
Exception
e
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
key
,
e
);
}
protected
Client
apacheHttpClientSpecificInitialization
()
{
httpClient4
=
NFHttpClientFactory
.
getNamedNFHttpClient
(
restClientName
,
this
.
ncc
,
true
);
...
...
@@ -182,98 +187,64 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
NFHttpClient
nfHttpClient
=
(
NFHttpClient
)
httpClient4
;
// should we enable connection cleanup for idle connections?
try
{
enableConnectionPoolCleanerTask
=
Boolean
.
parseBoolean
(
ncc
.
getProperty
(
CommonClientConfigKey
.
ConnectionPoolCleanerTaskEnabled
,
NFHttpClientConstants
.
DEFAULT_CONNECTIONIDLE_TIMETASK_ENABLED
).
toString
());
enableConnectionPoolCleanerTask
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ConnectionPoolCleanerTaskEnabled
);
nfHttpClient
.
getConnPoolCleaner
().
setEnableConnectionPoolCleanerTask
(
enableConnectionPoolCleanerTask
);
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ConnectionPoolCleanerTaskEnabled
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
ConnectionPoolCleanerTaskEnabled
,
e1
);
}
if
(
enableConnectionPoolCleanerTask
)
{
try
{
connectionCleanerRepeatInterval
=
Integer
.
parseInt
(
String
.
valueOf
(
ncc
.
getProperty
(
CommonClientConfigKey
.
ConnectionCleanerRepeatInterval
,
NFHttpClientConstants
.
DEFAULT_CONNECTION_IDLE_TIMERTASK_REPEAT_IN_MSECS
)));
connectionCleanerRepeatInterval
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ConnectionCleanerRepeatInterval
);
nfHttpClient
.
getConnPoolCleaner
().
setConnectionCleanerRepeatInterval
(
connectionCleanerRepeatInterval
);
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ConnectionCleanerRepeatInterval
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
ConnectionCleanerRepeatInterval
,
e1
);
}
try
{
int
iConnIdleEvictTimeMilliSeconds
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
ConnIdleEvictTimeMilliSeconds
,
NFHttpClientConstants
.
DEFAULT_CONNECTIONIDLE_TIME_IN_MSECS
));
connIdleEvictTimeMilliSeconds
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
restClientName
+
".nfhttpclient.connIdleEvictTimeMilliSeconds"
,
iConnIdleEvictTimeMilliSeconds
);
connIdleEvictTimeMilliSeconds
=
ncc
.
getDynamicProperty
(
CommonClientConfigKey
.
ConnIdleEvictTimeMilliSeconds
);
nfHttpClient
.
setConnIdleEvictTimeMilliSeconds
(
connIdleEvictTimeMilliSeconds
);
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ConnIdleEvictTimeMilliSeconds
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
ConnIdleEvictTimeMilliSeconds
,
e1
);
}
nfHttpClient
.
initConnectionCleanerTask
();
}
try
{
maxConnectionsperHost
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
MaxHttpConnectionsPerHost
,
maxConnectionsperHost
));
maxConnectionsperHost
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
MaxHttpConnectionsPerHost
);
ClientConnectionManager
connMgr
=
httpClient4
.
getConnectionManager
();
if
(
connMgr
instanceof
ThreadSafeClientConnManager
)
{
((
ThreadSafeClientConnManager
)
connMgr
)
.
setDefaultMaxPerRoute
(
maxConnectionsperHost
);
}
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
MaxHttpConnectionsPerHost
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
MaxHttpConnectionsPerHost
,
e1
);
}
try
{
maxTotalConnections
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
MaxTotalHttpConnections
,
maxTotalConnections
));
ClientConnectionManager
connMgr
=
httpClient4
.
getConnectionManager
();
maxTotalConnections
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
MaxTotalHttpConnections
);
ClientConnectionManager
connMgr
=
httpClient4
.
getConnectionManager
();
if
(
connMgr
instanceof
ThreadSafeClientConnManager
)
{
((
ThreadSafeClientConnManager
)
connMgr
)
.
setMaxTotal
(
maxTotalConnections
);
}
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
MaxTotalHttpConnections
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
MaxTotalHttpConnections
,
e1
);
}
try
{
connectionTimeout
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
ConnectTimeout
,
connectionTimeout
));
connectionTimeout
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ConnectTimeout
);
HttpConnectionParams
.
setConnectionTimeout
(
httpClientParams
,
connectionTimeout
);
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ConnectTimeout
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
ConnectTimeout
,
e1
);
}
try
{
readTimeout
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
ReadTimeout
,
readTimeout
));
readTimeout
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ReadTimeout
);
HttpConnectionParams
.
setSoTimeout
(
httpClientParams
,
readTimeout
);
}
catch
(
Exception
e1
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ReadTimeout
,
e1
);
throwInvalidValue
(
CommonClientConfigKey
.
ReadTimeout
,
e1
);
}
// httpclient 4 seems to only have one buffer size controlling both
...
...
@@ -282,30 +253,18 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
int
bufferSize
=
Integer
.
MIN_VALUE
;
if
(
ncc
.
getProperty
(
CommonClientConfigKey
.
ReceiveBufferSize
)
!=
null
)
{
try
{
bufferSize
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
ReceiveBufferSize
));
bufferSize
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ReceiveBufferSize
);
}
catch
(
Exception
e
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ReceiveBufferSize
,
e
);
throwInvalidValue
(
CommonClientConfigKey
.
ReceiveBufferSize
,
e
);
}
if
(
ncc
.
getProperty
(
CommonClientConfigKey
.
SendBufferSize
)
!=
null
)
{
try
{
int
sendBufferSize
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
SendBufferSize
));
int
sendBufferSize
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
SendBufferSize
);
if
(
sendBufferSize
>
bufferSize
)
{
bufferSize
=
sendBufferSize
;
}
}
catch
(
Exception
e
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
SendBufferSize
,
e
);
throwInvalidValue
(
CommonClientConfigKey
.
SendBufferSize
,
e
);
}
}
}
...
...
@@ -316,45 +275,30 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
if
(
ncc
.
getProperty
(
CommonClientConfigKey
.
StaleCheckingEnabled
)
!=
null
)
{
try
{
HttpConnectionParams
.
setStaleCheckingEnabled
(
httpClientParams
,
Boolean
.
parseBoolean
(
ncc
.
getProperty
(
CommonClientConfigKey
.
StaleCheckingEnabled
,
false
).
toString
()));
HttpConnectionParams
.
setStaleCheckingEnabled
(
httpClientParams
,
ncc
.
getOrDefault
(
CommonClientConfigKey
.
StaleCheckingEnabled
));
}
catch
(
Exception
e
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
StaleCheckingEnabled
,
e
);
throwInvalidValue
(
CommonClientConfigKey
.
StaleCheckingEnabled
,
e
);
}
}
if
(
ncc
.
getProperty
(
CommonClientConfigKey
.
Linger
)
!=
null
)
{
try
{
HttpConnectionParams
.
setLinger
(
httpClientParams
,
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
Linger
)));
HttpConnectionParams
.
setLinger
(
httpClientParams
,
ncc
.
getOrDefault
(
CommonClientConfigKey
.
Linger
));
}
catch
(
Exception
e
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
Linger
,
e
);
throwInvalidValue
(
CommonClientConfigKey
.
Linger
,
e
);
}
}
if
(
ncc
.
getProperty
(
CommonClientConfigKey
.
ProxyHost
)
!=
null
)
{
try
{
proxyHost
=
(
String
)
ncc
.
getProperty
(
CommonClientConfigKey
.
ProxyHost
);
proxyPort
=
Integer
.
parseInt
(
""
+
ncc
.
getProperty
(
CommonClientConfigKey
.
ProxyPort
));
proxyHost
=
(
String
)
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ProxyHost
);
proxyPort
=
ncc
.
getOrDefault
(
CommonClientConfigKey
.
ProxyPort
);
HttpHost
proxy
=
new
HttpHost
(
proxyHost
,
proxyPort
);
httpClient4
.
getParams
()
.
setParameter
(
ConnRouteParams
.
DEFAULT_PROXY
,
proxy
);
httpClient4
.
getParams
()
.
setParameter
(
ConnRouteParams
.
DEFAULT_PROXY
,
proxy
);
}
catch
(
Exception
e
)
{
throw
new
IllegalArgumentException
(
"Invalid value for property:"
+
CommonClientConfigKey
.
ProxyHost
,
e
);
throwInvalidValue
(
CommonClientConfigKey
.
ProxyHost
,
e
);
}
}
...
...
@@ -370,8 +314,7 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
if
(
// if client auth is required, need both a truststore and a keystore to warrant configuring
// if client is not is not required, we only need a keystore OR a truststore to warrant configuring
(
isClientAuthRequired
&&
(
trustStoreUrl
!=
null
&&
keyStoreUrl
!=
null
))
||
(!
isClientAuthRequired
&&
(
trustStoreUrl
!=
null
||
keyStoreUrl
!=
null
))
||
(!
isClientAuthRequired
&&
(
trustStoreUrl
!=
null
||
keyStoreUrl
!=
null
))
)
{
try
{
...
...
@@ -413,17 +356,15 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
// custom SSL Factory handler
String
customSSLFactoryClassName
=
(
String
)
ncc
.
getProperty
(
CommonClientConfigKey
.
CustomSSLSocketFactoryClassName
);
if
(
customSSLFactoryClassName
!=
null
){
if
(
customSSLFactoryClassName
!=
null
){
try
{
SSLSocketFactory
customSocketFactory
=
(
SSLSocketFactory
)
ClientFactory
.
instantiateInstanceWithClientConfig
(
customSSLFactoryClassName
,
ncc
);
httpClient4
.
getConnectionManager
().
getSchemeRegistry
().
register
(
new
Scheme
(
"https"
,
443
,
customSocketFactory
));
}
catch
(
Exception
e
){
throw
new
IllegalArgumentException
(
"Invalid value associated with property:"
+
CommonClientConfigKey
.
CustomSSLSocketFactoryClassName
,
e
);
}
catch
(
Exception
e
){
throwInvalidValue
(
CommonClientConfigKey
.
CustomSSLSocketFactoryClassName
,
e
);
}
}
...
...
@@ -478,11 +419,11 @@ public class RestClient extends AbstractLoadBalancerAwareClient<HttpRequest, Htt
}
if
(
url
==
null
)
{
// attempt to load from the system classpath
url
=
ConfigurationManager
.
class
.
getResource
(
resourceName
);
url
=
RestClient
.
class
.
getResource
(
resourceName
);
}
if
(
url
==
null
)
{
// attempt to load from the system classpath
url
=
ConfigurationManager
.
class
.
getClassLoader
().
getResource
(
resourceName
);
url
=
RestClient
.
class
.
getClassLoader
().
getResource
(
resourceName
);
}
if
(
url
==
null
)
{
try
{
...
...
ribbon-httpclient/src/test/java/com/netflix/client/testutil/SimpleSSLTestServer.java
浏览文件 @
3275c24d
...
...
@@ -61,7 +61,7 @@ public class SimpleSSLTestServer {
@edu
.
umd
.
cs
.
findbugs
.
annotations
.
SuppressWarnings
public
SimpleSSLTestServer
(
final
File
truststore
,
final
String
truststorePass
,
final
File
keystore
,
final
String
keystorePass
,
final
int
port
,
final
boolean
clientAuthRequred
)
throws
Exception
{
final
File
keystore
,
final
String
keystorePass
,
final
boolean
clientAuthRequred
)
throws
Exception
{
KeyStore
ks
=
KeyStore
.
getInstance
(
"JKS"
);
ks
.
load
(
new
FileInputStream
(
keystore
),
keystorePass
.
toCharArray
());
...
...
@@ -76,7 +76,7 @@ public class SimpleSSLTestServer {
SSLContext
sc
=
SSLContext
.
getInstance
(
"TLS"
);
sc
.
init
(
kmf
.
getKeyManagers
(),
tmf
.
getTrustManagers
(),
null
);
ss
=
sc
.
getServerSocketFactory
().
createServerSocket
(
port
);
ss
=
sc
.
getServerSocketFactory
().
createServerSocket
(
0
);
((
SSLServerSocket
)
ss
).
setNeedClientAuth
(
clientAuthRequred
);
}
...
...
@@ -122,5 +122,9 @@ public class SimpleSSLTestServer {
ss
.
close
();
}
public
int
getPort
()
{
return
ss
.
getLocalPort
();
}
}
ribbon-httpclient/src/test/java/com/netflix/niws/client/http/SecureAcceptAllGetTest.java
浏览文件 @
3275c24d
...
...
@@ -26,6 +26,7 @@ import com.netflix.config.ConfigurationManager;
import
com.sun.jersey.core.util.Base64
;
import
org.apache.commons.configuration.AbstractConfiguration
;
import
org.junit.*
;
import
org.junit.rules.TestName
;
import
javax.net.ssl.SSLPeerUnverifiedException
;
import
java.io.File
;
...
...
@@ -47,7 +48,6 @@ import static org.junit.Assert.fail;
*/
public
class
SecureAcceptAllGetTest
{
private
static
int
TEST_PORT
;
private
static
String
TEST_SERVICE_URI
;
private
static
File
TEST_FILE_KS
;
...
...
@@ -55,14 +55,12 @@ public class SecureAcceptAllGetTest {
private
static
SimpleSSLTestServer
TEST_SERVER
;
@Rule
public
TestName
testName
=
new
TestName
();
@BeforeClass
public
static
void
init
()
throws
Exception
{
// setup server 1, will use first keystore/truststore with client auth
TEST_PORT
=
new
Random
().
nextInt
(
1000
)
+
4000
;
TEST_SERVICE_URI
=
"https://127.0.0.1:"
+
TEST_PORT
+
"/"
;
// jks format
byte
[]
sampleTruststore1
=
Base64
.
decode
(
SecureGetTest
.
TEST_TS1
);
byte
[]
sampleKeystore1
=
Base64
.
decode
(
SecureGetTest
.
TEST_KS1
);
...
...
@@ -84,13 +82,16 @@ public class SecureAcceptAllGetTest {
truststoreFileOut
.
close
();
}
try
{
TEST_SERVER
=
new
SimpleSSLTestServer
(
TEST_FILE_TS
,
SecureGetTest
.
PASSWORD
,
TEST_FILE_KS
,
SecureGetTest
.
PASSWORD
,
TEST_PORT
,
false
);
try
{
TEST_SERVER
=
new
SimpleSSLTestServer
(
TEST_FILE_TS
,
SecureGetTest
.
PASSWORD
,
TEST_FILE_KS
,
SecureGetTest
.
PASSWORD
,
false
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
fail
(
e
.
getMessage
());
}
// setup server 1, will use first keystore/truststore with client auth
TEST_SERVICE_URI
=
"https://127.0.0.1:"
+
TEST_SERVER
.
getPort
()
+
"/"
;
}
...
...
@@ -113,7 +114,7 @@ public class SecureAcceptAllGetTest {
AbstractConfiguration
cm
=
ConfigurationManager
.
getConfigInstance
();
String
name
=
"GetPostSecureTest
"
+
".testPositiveAcceptAllSSLSocketFactory"
;
String
name
=
"GetPostSecureTest
."
+
testName
.
getMethodName
()
;
String
configPrefix
=
name
+
"."
+
"ribbon"
;
...
...
@@ -136,7 +137,7 @@ public class SecureAcceptAllGetTest {
AbstractConfiguration
cm
=
ConfigurationManager
.
getConfigInstance
();
String
name
=
"GetPostSecureTest
"
+
".testNegativeAcceptAllSSLSocketFactoryCannotWorkWithTrustStore"
;
String
name
=
"GetPostSecureTest
."
+
testName
.
getMethodName
()
;
String
configPrefix
=
name
+
"."
+
"ribbon"
;
...
...
@@ -146,25 +147,19 @@ public class SecureAcceptAllGetTest {
boolean
foundCause
=
false
;
try
{
try
{
ClientFactory
.
getNamedClient
(
name
);
}
catch
(
Throwable
t
){
while
(
t
!=
null
&&
!
foundCause
){
if
(
t
instanceof
IllegalArgumentException
&&
t
.
getMessage
().
startsWith
(
"Invalid value associated with property:CustomSSLSocketFactoryClassName"
)){
}
catch
(
Throwable
t
){
while
(
t
!=
null
&&
!
foundCause
){
if
(
t
instanceof
IllegalArgumentException
&&
t
.
getMessage
().
startsWith
(
"Invalid value for property:CustomSSLSocketFactoryClassName"
)){
foundCause
=
true
;
break
;
}
t
=
t
.
getCause
();
}
}
assertTrue
(
foundCause
);
}
...
...
@@ -173,7 +168,7 @@ public class SecureAcceptAllGetTest {
// test exception is thrown connecting to a random SSL endpoint without explicitly setting factory to allow all
String
name
=
"GetPostSecureTest
"
+
".testNegativeAcceptAllSSLSocketFactory"
;
String
name
=
"GetPostSecureTest
."
+
testName
.
getMethodName
()
;
// don't set any interesting properties -- really we're just setting the defaults
...
...
@@ -184,31 +179,20 @@ public class SecureAcceptAllGetTest {
URI
getUri
=
new
URI
(
TEST_SERVICE_URI
+
"test/"
);
HttpRequest
request
=
HttpRequest
.
newBuilder
().
uri
(
getUri
).
queryParams
(
"name"
,
"test"
).
build
();
boolean
foundCause
=
false
;
try
{
try
{
rc
.
execute
(
request
);
}
catch
(
Throwable
t
){
while
(
t
!=
null
&&
!
foundCause
){
if
(
t
instanceof
SSLPeerUnverifiedException
&&
t
.
getMessage
().
startsWith
(
"peer not authenticated"
)){
}
catch
(
Throwable
t
){
while
(
t
!=
null
&&
!
foundCause
){
if
(
t
instanceof
SSLPeerUnverifiedException
&&
t
.
getMessage
().
startsWith
(
"peer not authenticated"
)){
foundCause
=
true
;
break
;
}
t
=
t
.
getCause
();
}
}
assertTrue
(
foundCause
);
}
}
ribbon-httpclient/src/test/java/com/netflix/niws/client/http/SecureGetTest.java
浏览文件 @
3275c24d
...
...
@@ -24,7 +24,6 @@ import static org.junit.Assert.fail;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.net.URI
;
import
java.util.Random
;
import
org.apache.commons.configuration.AbstractConfiguration
;
import
org.junit.AfterClass
;
...
...
@@ -243,10 +242,7 @@ public class SecureGetTest {
private
static
String
SERVICE_URI1
;
private
static
int
PORT1
;
private
static
String
SERVICE_URI2
;
private
static
int
PORT2
;
private
static
SimpleSSLTestServer
testServer1
;
private
static
SimpleSSLTestServer
testServer2
;
...
...
@@ -264,8 +260,6 @@ public class SecureGetTest {
public
static
void
init
()
throws
Exception
{
// setup server 1, will use first keystore/truststore with client auth
PORT1
=
new
Random
().
nextInt
(
1000
)
+
4000
;
SERVICE_URI1
=
"https://127.0.0.1:"
+
PORT1
+
"/"
;
// jks format
byte
[]
sampleTruststore1
=
Base64
.
decode
(
TEST_TS1
);
...
...
@@ -289,16 +283,15 @@ public class SecureGetTest {
}
try
{
testServer1
=
new
SimpleSSLTestServer
(
FILE_TS1
,
PASSWORD
,
FILE_KS1
,
PASSWORD
,
PORT1
,
true
);
testServer1
=
new
SimpleSSLTestServer
(
FILE_TS1
,
PASSWORD
,
FILE_KS1
,
PASSWORD
,
true
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
fail
(
e
.
getMessage
());
}
// setup server 2, will use second keystore truststore without client auth
SERVICE_URI1
=
"https://127.0.0.1:"
+
testServer1
.
getPort
()
+
"/"
;
PORT2
=
PORT1
+
1
;
SERVICE_URI2
=
"https://127.0.0.1:"
+
PORT2
+
"/"
;
// setup server 2, will use second keystore truststore without client auth
// jks format
byte
[]
sampleTruststore2
=
Base64
.
decode
(
TEST_TS2
);
...
...
@@ -322,11 +315,13 @@ public class SecureGetTest {
}
try
{
testServer2
=
new
SimpleSSLTestServer
(
FILE_TS2
,
PASSWORD
,
FILE_KS2
,
PASSWORD
,
PORT2
,
false
);
testServer2
=
new
SimpleSSLTestServer
(
FILE_TS2
,
PASSWORD
,
FILE_KS2
,
PASSWORD
,
false
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
fail
(
e
.
getMessage
());
}
SERVICE_URI2
=
"https://127.0.0.1:"
+
testServer2
.
getPort
()
+
"/"
;
}
@AfterClass
...
...
@@ -356,7 +351,7 @@ public class SecureGetTest {
String
configPrefix
=
name
+
"."
+
"ribbon"
;
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsSecure
,
"true"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
PORT1
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
testServer1
.
getPort
()
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsHostnameValidationRequired
,
"false"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsClientAuthRequired
,
"true"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
KeyStore
,
FILE_KS1
.
getAbsolutePath
());
...
...
@@ -385,7 +380,7 @@ public class SecureGetTest {
String
configPrefix
=
name
+
"."
+
"ribbon"
;
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsSecure
,
"true"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
PORT2
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
testServer2
.
getPort
()
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsHostnameValidationRequired
,
"false"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
TrustStore
,
FILE_TS2
.
getAbsolutePath
());
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
TrustStorePassword
,
PASSWORD
);
...
...
@@ -411,7 +406,7 @@ public class SecureGetTest {
String
configPrefix
=
name
+
"."
+
"ribbon"
;
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsSecure
,
"true"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
PORT1
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
testServer2
.
getPort
()
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsHostnameValidationRequired
,
"true"
);
// <--
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsClientAuthRequired
,
"true"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
KeyStore
,
FILE_KS1
.
getAbsolutePath
());
...
...
@@ -447,7 +442,7 @@ public class SecureGetTest {
String
configPrefix
=
name
+
"."
+
"ribbon"
;
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsSecure
,
"true"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
PORT2
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
SecurePort
,
Integer
.
toString
(
testServer2
.
getPort
()
));
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
IsHostnameValidationRequired
,
"false"
);
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
TrustStore
,
FILE_TS1
.
getAbsolutePath
());
// <--
cm
.
setProperty
(
configPrefix
+
"."
+
CommonClientConfigKey
.
TrustStorePassword
,
PASSWORD
);
...
...
ribbon-httpclient/src/test/resources/log4j.properties
0 → 100644
浏览文件 @
3275c24d
log4j.rootCategory
=
INFO,stdout
log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=
%d %-5p %C:%L [%t] [%M] %m%n
ribbon-loadbalancer/build.gradle
浏览文件 @
3275c24d
...
...
@@ -2,16 +2,15 @@ dependencies {
compile
project
(
':ribbon-core'
)
compile
'com.netflix.netflix-commons:netflix-statistics:0.1.1'
compile
"io.reactivex:rxjava:${rx_java_version}"
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"org.slf4j:slf4j-api:${slf4j_version}"
compile
"com.netflix.servo:servo-core:${servo_version}"
compile
"com.google.guava:guava:${guava_version}"
compile
"com.netflix.archaius:archaius-core:${archaius_version}"
compile
'com.netflix.netflix-commons:netflix-commons-util:0.1.1'
testCompile
project
(
":ribbon-archaius"
)
testCompile
'junit:junit:4.11'
testCompile
'org.mockito:mockito-core:2.13.0'
testCompile
'org.awaitility:awaitility:3.0.0'
testCompile
'org.slf4j:slf4j-log4j12:1.7.2'
testCompile
"org.slf4j:slf4j-log4j12:${slf4j_version}"
testCompile
"com.sun.jersey:jersey-server:${jersey_version}"
}
ribbon-loadbalancer/src/main/java/com/netflix/client/PrimeConnections.java
浏览文件 @
3275c24d
...
...
@@ -125,8 +125,8 @@ public class PrimeConnections {
}
public
PrimeConnections
(
String
name
,
IClientConfig
niwsClientConfig
)
{
int
maxRetriesPerServerPrimeConnection
=
CommonClientConfigKey
.
MaxRetriesPerServerPrimeConnection
.
getD
efaultValue
();
int
maxTotalTimeToPrimeConnections
=
CommonClientConfigKey
.
MaxTotalTimeToPrimeConnections
.
getD
efaultValue
();
int
maxRetriesPerServerPrimeConnection
=
CommonClientConfigKey
.
MaxRetriesPerServerPrimeConnection
.
d
efaultValue
();
int
maxTotalTimeToPrimeConnections
=
CommonClientConfigKey
.
MaxTotalTimeToPrimeConnections
.
d
efaultValue
();
try
{
maxRetriesPerServerPrimeConnection
=
niwsClientConfig
.
getOrDefault
(
CommonClientConfigKey
.
MaxRetriesPerServerPrimeConnection
);
}
catch
(
Exception
e
)
{
...
...
@@ -152,7 +152,7 @@ public class PrimeConnections {
public
PrimeConnections
(
String
name
,
int
maxRetries
,
long
maxTotalTimeToPrimeConnections
,
String
primeConnectionsURI
)
{
setUp
(
name
,
maxRetries
,
maxTotalTimeToPrimeConnections
,
primeConnectionsURI
,
CommonClientConfigKey
.
MinPrimeConnectionsRatio
.
getD
efaultValue
());
setUp
(
name
,
maxRetries
,
maxTotalTimeToPrimeConnections
,
primeConnectionsURI
,
CommonClientConfigKey
.
MinPrimeConnectionsRatio
.
d
efaultValue
());
}
public
PrimeConnections
(
String
name
,
int
maxRetries
,
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/AbstractServerPredicate.java
浏览文件 @
3275c24d
...
...
@@ -29,7 +29,6 @@ import com.google.common.collect.ImmutableList;
import
com.google.common.collect.Iterables
;
import
com.google.common.collect.Lists
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.loadbalancer.PredicateKey
;
/**
* A basic building block for server filtering logic which can be used in rules and server list filters.
...
...
@@ -48,7 +47,7 @@ public abstract class AbstractServerPredicate implements Predicate<PredicateKey>
private
final
Random
random
=
new
Random
();
private
final
AtomicInteger
nextIndex
=
new
AtomicInteger
();
private
final
Predicate
<
Server
>
serverOnlyPredicate
=
new
Predicate
<
Server
>()
{
@Override
public
boolean
apply
(
@Nullable
Server
input
)
{
...
...
@@ -56,7 +55,7 @@ public abstract class AbstractServerPredicate implements Predicate<PredicateKey>
}
};
public
static
AbstractServerPredicate
alwaysTrue
()
{
public
static
AbstractServerPredicate
alwaysTrue
()
{
return
new
AbstractServerPredicate
()
{
@Override
public
boolean
apply
(
@Nullable
PredicateKey
input
)
{
...
...
@@ -72,15 +71,21 @@ public abstract class AbstractServerPredicate implements Predicate<PredicateKey>
public
AbstractServerPredicate
(
IRule
rule
)
{
this
.
rule
=
rule
;
}
@Deprecated
public
AbstractServerPredicate
(
IRule
rule
,
IClientConfig
clientConfig
)
{
this
.
rule
=
rule
;
this
(
rule
)
;
}
@Deprecated
public
AbstractServerPredicate
(
LoadBalancerStats
lbStats
,
IClientConfig
clientConfig
)
{
this
(
lbStats
);
}
public
AbstractServerPredicate
(
LoadBalancerStats
lbStats
)
{
this
.
lbStats
=
lbStats
;
}
protected
LoadBalancerStats
getLBStats
()
{
if
(
lbStats
!=
null
)
{
return
lbStats
;
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/AvailabilityFilteringRule.java
浏览文件 @
3275c24d
...
...
@@ -49,7 +49,7 @@ public class AvailabilityFilteringRule extends PredicateBasedRule {
public
AvailabilityFilteringRule
()
{
super
();
predicate
=
CompositePredicate
.
withPredicate
(
new
AvailabilityPredicate
(
this
,
null
))
predicate
=
CompositePredicate
.
withPredicate
(
new
AvailabilityPredicate
(
this
,
null
))
.
addFallbackPredicate
(
AbstractServerPredicate
.
alwaysTrue
())
.
build
();
}
...
...
@@ -83,7 +83,7 @@ public class AvailabilityFilteringRule extends PredicateBasedRule {
int
count
=
0
;
Server
server
=
roundRobinRule
.
choose
(
key
);
while
(
count
++
<=
10
)
{
if
(
predicate
.
apply
(
new
PredicateKey
(
server
)))
{
if
(
server
!=
null
&&
predicate
.
apply
(
new
PredicateKey
(
server
)))
{
return
server
;
}
server
=
roundRobinRule
.
choose
(
key
);
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/AvailabilityPredicate.java
浏览文件 @
3275c24d
...
...
@@ -17,13 +17,13 @@
*/
package
com.netflix.loadbalancer
;
import
javax.annotation.Nullable
;
import
com.google.common.base.Preconditions
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.c
onfig.ChainedDynamicPropert
y
;
import
com.netflix.c
onfig.DynamicBoolean
Property
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
com.netflix.c
lient.config.IClientConfigKe
y
;
import
com.netflix.c
lient.config.
Property
;
import
javax.annotation.Nullable
;
/**
* Predicate with the logic of filtering out circuit breaker tripped servers and servers
...
...
@@ -33,37 +33,53 @@ import com.netflix.config.DynamicPropertyFactory;
*
*/
public
class
AvailabilityPredicate
extends
AbstractServerPredicate
{
private
static
final
DynamicBooleanProperty
CIRCUIT_BREAKER_FILTERING
=
DynamicPropertyFactory
.
getInstance
().
getBooleanProperty
(
"niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped"
,
true
);
private
static
final
DynamicIntProperty
ACTIVE_CONNECTIONS_LIMIT
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
"niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit"
,
Integer
.
MAX_VALUE
);
private
static
final
IClientConfigKey
<
Boolean
>
FILTER_CIRCUIT_TRIPPED
=
new
CommonClientConfigKey
<
Boolean
>(
"niws.loadbalancer.availabilityFilteringRule.filterCircuitTripped"
,
true
)
{};
private
static
final
IClientConfigKey
<
Integer
>
DEFAULT_ACTIVE_CONNECTIONS_LIMIT
=
new
CommonClientConfigKey
<
Integer
>(
"niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit"
,
-
1
)
{};
private
static
final
IClientConfigKey
<
Integer
>
ACTIVE_CONNECTIONS_LIMIT
=
new
CommonClientConfigKey
<
Integer
>(
"ActiveConnectionsLimit"
,
-
1
)
{};
private
Property
<
Boolean
>
circuitBreakerFiltering
=
Property
.
of
(
FILTER_CIRCUIT_TRIPPED
.
defaultValue
());
private
Property
<
Integer
>
defaultActiveConnectionsLimit
=
Property
.
of
(
DEFAULT_ACTIVE_CONNECTIONS_LIMIT
.
defaultValue
());
private
Property
<
Integer
>
activeConnectionsLimit
=
Property
.
of
(
ACTIVE_CONNECTIONS_LIMIT
.
defaultValue
());
private
ChainedDynamicProperty
.
IntProperty
activeConnectionsLimit
=
new
ChainedDynamicProperty
.
IntProperty
(
ACTIVE_CONNECTIONS_LIMIT
);
public
AvailabilityPredicate
(
IRule
rule
,
IClientConfig
clientConfig
)
{
super
(
rule
,
clientConfig
);
super
(
rule
);
initDynamicProperty
(
clientConfig
);
}
public
AvailabilityPredicate
(
LoadBalancerStats
lbStats
,
IClientConfig
clientConfig
)
{
super
(
lbStats
,
clientConfig
);
super
(
lbStats
);
initDynamicProperty
(
clientConfig
);
}
AvailabilityPredicate
(
IRule
rule
)
{
super
(
rule
);
}
private
void
initDynamicProperty
(
IClientConfig
clientConfig
)
{
String
id
=
"default"
;
if
(
clientConfig
!=
null
)
{
id
=
clientConfig
.
getClientName
();
activeConnectionsLimit
=
new
ChainedDynamicProperty
.
IntProperty
(
id
+
"."
+
clientConfig
.
getNameSpace
()
+
".ActiveConnectionsLimit"
,
ACTIVE_CONNECTIONS_LIMIT
);
}
this
.
circuitBreakerFiltering
=
clientConfig
.
getGlobalProperty
(
FILTER_CIRCUIT_TRIPPED
);
this
.
defaultActiveConnectionsLimit
=
clientConfig
.
getGlobalProperty
(
DEFAULT_ACTIVE_CONNECTIONS_LIMIT
);
this
.
activeConnectionsLimit
=
clientConfig
.
getDynamicProperty
(
ACTIVE_CONNECTIONS_LIMIT
);
}
}
private
int
getActiveConnectionsLimit
()
{
Integer
limit
=
activeConnectionsLimit
.
get
();
if
(
limit
==
-
1
)
{
limit
=
defaultActiveConnectionsLimit
.
get
();
if
(
limit
==
-
1
)
{
limit
=
Integer
.
MAX_VALUE
;
}
}
return
limit
;
}
@Override
public
boolean
apply
(
@Nullable
PredicateKey
input
)
{
LoadBalancerStats
stats
=
getLBStats
();
...
...
@@ -73,10 +89,9 @@ public class AvailabilityPredicate extends AbstractServerPredicate {
return
!
shouldSkipServer
(
stats
.
getSingleServerStat
(
input
.
getServer
()));
}
private
boolean
shouldSkipServer
(
ServerStats
stats
)
{
if
((
CIRCUIT_BREAKER_FILTERING
.
get
()
&&
stats
.
isCircuitBreakerTripped
())
||
stats
.
getActiveRequestsCount
()
>=
activeConnectionsLimit
.
get
())
{
private
boolean
shouldSkipServer
(
ServerStats
stats
)
{
if
((
circuitBreakerFiltering
.
get
()
&&
stats
.
isCircuitBreakerTripped
())
||
stats
.
getActiveRequestsCount
()
>=
getActiveConnectionsLimit
())
{
return
true
;
}
return
false
;
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/BaseLoadBalancer.java
浏览文件 @
3275c24d
...
...
@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableList;
import
com.netflix.client.ClientFactory
;
import
com.netflix.client.IClientConfigAware
;
import
com.netflix.client.PrimeConnections
;
import
com.netflix.client.config.ClientConfigFactory
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.servo.annotations.DataSourceType
;
...
...
@@ -59,8 +60,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
public
class
BaseLoadBalancer
extends
AbstractLoadBalancer
implements
PrimeConnections
.
PrimeConnectionListener
,
IClientConfigAware
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
BaseLoadBalancer
.
class
);
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
BaseLoadBalancer
.
class
);
private
final
static
IRule
DEFAULT_RULE
=
new
RoundRobinRule
();
private
final
static
SerialPingStrategy
DEFAULT_PING_STRATEGY
=
new
SerialPingStrategy
();
private
static
final
String
DEFAULT_NAME
=
"default"
;
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerContext.java
浏览文件 @
3275c24d
...
...
@@ -48,13 +48,13 @@ public class LoadBalancerContext implements IClientConfigAware {
protected
String
vipAddresses
;
protected
int
maxAutoRetriesNextServer
=
CommonClientConfigKey
.
MaxAutoRetriesNextServer
.
getD
efaultValue
();
protected
int
maxAutoRetries
=
CommonClientConfigKey
.
MaxAutoRetries
.
getD
efaultValue
();
protected
int
maxAutoRetriesNextServer
=
CommonClientConfigKey
.
MaxAutoRetriesNextServer
.
d
efaultValue
();
protected
int
maxAutoRetries
=
CommonClientConfigKey
.
MaxAutoRetries
.
d
efaultValue
();
protected
RetryHandler
defaultRetryHandler
=
new
DefaultLoadBalancerRetryHandler
();
protected
boolean
okToRetryOnAllOperations
=
CommonClientConfigKey
.
OkToRetryOnAllOperations
.
getD
efaultValue
();
protected
boolean
okToRetryOnAllOperations
=
CommonClientConfigKey
.
OkToRetryOnAllOperations
.
d
efaultValue
();
private
ILoadBalancer
lb
;
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerStats.java
浏览文件 @
3275c24d
...
...
@@ -17,6 +17,21 @@
*/
package
com.netflix.loadbalancer
;
import
com.google.common.base.Preconditions
;
import
com.google.common.cache.CacheBuilder
;
import
com.google.common.cache.CacheLoader
;
import
com.google.common.cache.LoadingCache
;
import
com.google.common.cache.RemovalListener
;
import
com.netflix.client.IClientConfigAware
;
import
com.netflix.client.config.ClientConfigFactory
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.UnboxedIntProperty
;
import
com.netflix.servo.annotations.DataSourceType
;
import
com.netflix.servo.annotations.Monitor
;
import
com.netflix.servo.monitor.Monitors
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.Collections
;
...
...
@@ -28,20 +43,6 @@ import java.util.concurrent.ConcurrentHashMap;
import
java.util.concurrent.ExecutionException
;
import
java.util.concurrent.TimeUnit
;
import
com.google.common.cache.CacheBuilder
;
import
com.google.common.cache.CacheLoader
;
import
com.google.common.cache.LoadingCache
;
import
com.google.common.cache.RemovalListener
;
import
com.google.common.cache.RemovalNotification
;
import
com.netflix.client.IClientConfigAware
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.CachedDynamicIntProperty
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
com.netflix.servo.annotations.DataSourceType
;
import
com.netflix.servo.annotations.Monitor
;
import
com.netflix.servo.monitor.Monitors
;
/**
* Class that acts as a repository of operational charateristics and statistics
* of every Node/Server in the LaodBalancer.
...
...
@@ -56,38 +57,41 @@ import com.netflix.servo.monitor.Monitors;
public
class
LoadBalancerStats
implements
IClientConfigAware
{
private
static
final
String
PREFIX
=
"LBStats_"
;
public
static
final
IClientConfigKey
<
Integer
>
ACTIVE_REQUESTS_COUNT_TIMEOUT
=
new
CommonClientConfigKey
<
Integer
>(
"niws.loadbalancer.serverStats.activeRequestsCount.effectiveWindowSeconds"
,
60
*
10
)
{};
public
static
final
IClientConfigKey
<
Integer
>
CONNECTION_FAILURE_COUNT_THRESHOLD
=
new
CommonClientConfigKey
<
Integer
>(
"niws.loadbalancer.%s.connectionFailureCountThreshold"
,
3
)
{};
public
static
final
IClientConfigKey
<
Integer
>
CIRCUIT_TRIP_TIMEOUT_FACTOR_SECONDS
=
new
CommonClientConfigKey
<
Integer
>(
"niws.loadbalancer.%s.circuitTripTimeoutFactorSeconds"
,
10
)
{};
public
static
final
IClientConfigKey
<
Integer
>
CIRCUIT_TRIP_MAX_TIMEOUT_SECONDS
=
new
CommonClientConfigKey
<
Integer
>(
"niws.loadbalancer.%s.circuitTripMaxTimeoutSeconds"
,
30
)
{};
private
String
name
;
String
name
;
// Map<Server,ServerStats> serverStatsMap = new ConcurrentHashMap<Server,ServerStats>();
volatile
Map
<
String
,
ZoneStats
>
zoneStatsMap
=
new
ConcurrentHashMap
<
String
,
ZoneStats
>();
volatile
Map
<
String
,
List
<?
extends
Server
>>
upServerListZoneMap
=
new
ConcurrentHashMap
<
String
,
List
<?
extends
Server
>>();
volatile
Map
<
String
,
ZoneStats
>
zoneStatsMap
=
new
ConcurrentHashMap
<>();
volatile
Map
<
String
,
List
<?
extends
Server
>>
upServerListZoneMap
=
new
ConcurrentHashMap
<>();
private
volatile
CachedDynamicIntProperty
connectionFailureThreshold
;
private
UnboxedIntProperty
connectionFailureThreshold
=
new
UnboxedIntProperty
(
CONNECTION_FAILURE_COUNT_THRESHOLD
.
defaultValue
())
;
private
volatile
CachedDynamicIntProperty
circuitTrippedTimeoutFactor
;
private
UnboxedIntProperty
circuitTrippedTimeoutFactor
=
new
UnboxedIntProperty
(
CIRCUIT_TRIP_TIMEOUT_FACTOR_SECONDS
.
defaultValue
())
;
private
volatile
CachedDynamicIntProperty
maxCircuitTrippedTimeout
;
private
UnboxedIntProperty
maxCircuitTrippedTimeout
=
new
UnboxedIntProperty
(
CIRCUIT_TRIP_MAX_TIMEOUT_SECONDS
.
defaultValue
())
;
private
static
final
DynamicIntProperty
SERVERSTATS_EXPIRE_MINUTES
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
"niws.loadbalancer.serverStats.expire.minutes"
,
30
);
private
final
LoadingCache
<
Server
,
ServerStats
>
serverStatsCache
=
CacheBuilder
.
newBuilder
()
.
expireAfterAccess
(
SERVERSTATS_EXPIRE_MINUTES
.
get
(),
TimeUnit
.
MINUTES
)
.
removalListener
(
new
RemovalListener
<
Server
,
ServerStats
>()
{
@Override
public
void
onRemoval
(
RemovalNotification
<
Server
,
ServerStats
>
notification
)
{
notification
.
getValue
().
close
();
private
UnboxedIntProperty
activeRequestsCountTimeout
=
new
UnboxedIntProperty
(
ACTIVE_REQUESTS_COUNT_TIMEOUT
.
defaultValue
());
private
final
LoadingCache
<
Server
,
ServerStats
>
serverStatsCache
=
CacheBuilder
.
newBuilder
()
.
expireAfterAccess
(
30
,
TimeUnit
.
MINUTES
)
.
removalListener
((
RemovalListener
<
Server
,
ServerStats
>)
notification
->
notification
.
getValue
().
close
())
.
build
(
new
CacheLoader
<
Server
,
ServerStats
>()
{
public
ServerStats
load
(
Server
server
)
{
return
createServerStats
(
server
);
}
})
.
build
(
new
CacheLoader
<
Server
,
ServerStats
>()
{
public
ServerStats
load
(
Server
server
)
{
return
createServerStats
(
server
);
}
});
});
protected
ServerStats
createServerStats
(
Server
server
)
{
ServerStats
ss
=
new
ServerStats
(
this
);
//configure custom settings
...
...
@@ -96,25 +100,28 @@ public class LoadBalancerStats implements IClientConfigAware {
ss
.
initialize
(
server
);
return
ss
;
}
public
LoadBalancerStats
(){
zoneStatsMap
=
new
ConcurrentHashMap
<
String
,
ZoneStats
>();
upServerListZoneMap
=
new
ConcurrentHashMap
<
String
,
List
<?
extends
Server
>>();
public
LoadBalancerStats
()
{
}
public
LoadBalancerStats
(
String
name
){
this
();
public
LoadBalancerStats
(
String
name
)
{
this
.
name
=
name
;
Monitors
.
registerObject
(
name
,
this
);
Monitors
.
registerObject
(
name
,
this
);
}
@Override
public
void
initWithNiwsConfig
(
IClientConfig
clientConfig
)
{
public
void
initWithNiwsConfig
(
IClientConfig
clientConfig
)
{
this
.
name
=
clientConfig
.
getClientName
();
Monitors
.
registerObject
(
name
,
this
);
Preconditions
.
checkArgument
(
name
!=
null
,
"IClientConfig#getCLientName() must not be null"
);
this
.
connectionFailureThreshold
=
new
UnboxedIntProperty
(
clientConfig
.
getGlobalProperty
(
CONNECTION_FAILURE_COUNT_THRESHOLD
.
format
(
name
)));
this
.
circuitTrippedTimeoutFactor
=
new
UnboxedIntProperty
(
clientConfig
.
getGlobalProperty
(
CIRCUIT_TRIP_TIMEOUT_FACTOR_SECONDS
.
format
(
name
)));
this
.
maxCircuitTrippedTimeout
=
new
UnboxedIntProperty
(
clientConfig
.
getGlobalProperty
(
CIRCUIT_TRIP_MAX_TIMEOUT_SECONDS
.
format
(
name
)));
this
.
activeRequestsCountTimeout
=
new
UnboxedIntProperty
(
clientConfig
.
getGlobalProperty
(
ACTIVE_REQUESTS_COUNT_TIMEOUT
));
}
public
String
getName
()
{
return
name
;
}
...
...
@@ -123,31 +130,23 @@ public class LoadBalancerStats implements IClientConfigAware {
this
.
name
=
name
;
}
CachedDynamicIntProperty
getConnectionFailureCountThreshold
()
{
if
(
connectionFailureThreshold
==
null
)
{
connectionFailureThreshold
=
new
CachedDynamicIntProperty
(
"niws.loadbalancer."
+
name
+
".connectionFailureCountThreshold"
,
3
);
}
UnboxedIntProperty
getConnectionFailureCountThreshold
()
{
return
connectionFailureThreshold
;
}
CachedDynamicIntProperty
getCircuitTrippedTimeoutFactor
()
{
if
(
circuitTrippedTimeoutFactor
==
null
)
{
circuitTrippedTimeoutFactor
=
new
CachedDynamicIntProperty
(
"niws.loadbalancer."
+
name
+
".circuitTripTimeoutFactorSeconds"
,
10
);
}
return
circuitTrippedTimeoutFactor
;
UnboxedIntProperty
getCircuitTrippedTimeoutFactor
()
{
return
circuitTrippedTimeoutFactor
;
}
CachedDynamicIntProperty
getCircuitTripMaxTimeoutSeconds
()
{
if
(
maxCircuitTrippedTimeout
==
null
)
{
maxCircuitTrippedTimeout
=
new
CachedDynamicIntProperty
(
"niws.loadbalancer."
+
name
+
".circuitTripMaxTimeoutSeconds"
,
30
);
}
return
maxCircuitTrippedTimeout
;
UnboxedIntProperty
getCircuitTripMaxTimeoutSeconds
()
{
return
maxCircuitTrippedTimeout
;
}
UnboxedIntProperty
getActiveRequestsCountTimeout
()
{
return
activeRequestsCountTimeout
;
}
/**
* The caller o this class is tasked to call this method every so often if
* the servers participating in the LoadBalancer changes
...
...
@@ -161,11 +160,13 @@ public class LoadBalancerStats implements IClientConfigAware {
public
void
addServer
(
Server
server
)
{
try
{
serverStatsCache
.
get
(
server
);
}
catch
(
ExecutionException
e
)
{
ServerStats
stats
=
createServerStats
(
server
);
serverStatsCache
.
asMap
().
putIfAbsent
(
server
,
stats
);
if
(
server
!=
null
)
{
try
{
serverStatsCache
.
get
(
server
);
}
catch
(
ExecutionException
e
)
{
ServerStats
stats
=
createServerStats
(
server
);
serverStatsCache
.
asMap
().
putIfAbsent
(
server
,
stats
);
}
}
}
...
...
@@ -181,6 +182,10 @@ public class LoadBalancerStats implements IClientConfigAware {
}
protected
ServerStats
getServerStats
(
Server
server
)
{
if
(
server
==
null
)
{
return
null
;
}
try
{
return
serverStatsCache
.
get
(
server
);
}
catch
(
ExecutionException
e
)
{
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/PollingServerListUpdater.java
浏览文件 @
3275c24d
...
...
@@ -3,14 +3,13 @@ package com.netflix.loadbalancer;
import
com.google.common.util.concurrent.ThreadFactoryBuilder
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.DynamicIntProperty
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.Date
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledFuture
;
import
java.util.concurrent.ScheduledThreadPoolExecutor
;
import
java.util.concurrent.ThreadFactory
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicBoolean
;
...
...
@@ -26,60 +25,23 @@ public class PollingServerListUpdater implements ServerListUpdater {
private
static
long
LISTOFSERVERS_CACHE_UPDATE_DELAY
=
1000
;
// msecs;
private
static
int
LISTOFSERVERS_CACHE_REPEAT_INTERVAL
=
30
*
1000
;
// msecs;
private
static
int
POOL_SIZE
=
2
;
private
static
class
LazyHolder
{
private
final
static
String
CORE_THREAD
=
"DynamicServerListLoadBalancer.ThreadPoolSize"
;
private
final
static
DynamicIntProperty
poolSizeProp
=
new
DynamicIntProperty
(
CORE_THREAD
,
2
);
private
static
Thread
_shutdownThread
;
static
ScheduledThreadPoolExecutor
_serverListRefreshExecutor
=
null
;
static
ScheduledExecutorService
_serverListRefreshExecutor
=
null
;
static
{
int
coreSize
=
poolSizeProp
.
get
();
ThreadFactory
factory
=
(
new
ThreadFactoryBuilder
())
_serverListRefreshExecutor
=
Executors
.
newScheduledThreadPool
(
POOL_SIZE
,
new
ThreadFactoryBuilder
()
.
setNameFormat
(
"PollingServerListUpdater-%d"
)
.
setDaemon
(
true
)
.
build
();
_serverListRefreshExecutor
=
new
ScheduledThreadPoolExecutor
(
coreSize
,
factory
);
poolSizeProp
.
addCallback
(
new
Runnable
()
{
@Override
public
void
run
()
{
_serverListRefreshExecutor
.
setCorePoolSize
(
poolSizeProp
.
get
());
}
});
_shutdownThread
=
new
Thread
(
new
Runnable
()
{
public
void
run
()
{
logger
.
info
(
"Shutting down the Executor Pool for PollingServerListUpdater"
);
shutdownExecutorPool
();
}
});
Runtime
.
getRuntime
().
addShutdownHook
(
_shutdownThread
);
}
private
static
void
shutdownExecutorPool
()
{
if
(
_serverListRefreshExecutor
!=
null
)
{
_serverListRefreshExecutor
.
shutdown
();
if
(
_shutdownThread
!=
null
)
{
try
{
Runtime
.
getRuntime
().
removeShutdownHook
(
_shutdownThread
);
}
catch
(
IllegalStateException
ise
)
{
// NOPMD
// this can happen if we're in the middle of a real
// shutdown,
// and that's 'ok'
}
}
}
.
build
());
}
}
private
static
Scheduled
ThreadPoolExecutor
getRefreshExecutor
()
{
private
static
Scheduled
ExecutorService
getRefreshExecutor
()
{
return
LazyHolder
.
_serverListRefreshExecutor
;
}
private
final
AtomicBoolean
isActive
=
new
AtomicBoolean
(
false
);
private
volatile
long
lastUpdated
=
System
.
currentTimeMillis
();
private
final
long
initialDelayMs
;
...
...
@@ -103,21 +65,18 @@ public class PollingServerListUpdater implements ServerListUpdater {
@Override
public
synchronized
void
start
(
final
UpdateAction
updateAction
)
{
if
(
isActive
.
compareAndSet
(
false
,
true
))
{
final
Runnable
wrapperRunnable
=
new
Runnable
()
{
@Override
public
void
run
()
{
if
(!
isActive
.
get
())
{
if
(
scheduledFuture
!=
null
)
{
scheduledFuture
.
cancel
(
true
);
}
return
;
}
try
{
updateAction
.
doUpdate
();
lastUpdated
=
System
.
currentTimeMillis
();
}
catch
(
Exception
e
)
{
logger
.
warn
(
"Failed one update cycle"
,
e
);
final
Runnable
wrapperRunnable
=
()
->
{
if
(!
isActive
.
get
())
{
if
(
scheduledFuture
!=
null
)
{
scheduledFuture
.
cancel
(
true
);
}
return
;
}
try
{
updateAction
.
doUpdate
();
lastUpdated
=
System
.
currentTimeMillis
();
}
catch
(
Exception
e
)
{
logger
.
warn
(
"Failed one update cycle"
,
e
);
}
};
...
...
@@ -163,12 +122,7 @@ public class PollingServerListUpdater implements ServerListUpdater {
@Override
public
int
getCoreThreads
()
{
if
(
isActive
.
get
())
{
if
(
getRefreshExecutor
()
!=
null
)
{
return
getRefreshExecutor
().
getCorePoolSize
();
}
}
return
0
;
return
POOL_SIZE
;
}
private
static
long
getRefreshIntervalMs
(
IClientConfig
clientConfig
)
{
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ServerListSubsetFilter.java
浏览文件 @
3275c24d
...
...
@@ -15,19 +15,19 @@
*/
package
com.netflix.loadbalancer
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.Random
;
import
java.util.Set
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Sets
;
import
com.netflix.client.IClientConfigAware
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.DynamicFloatProperty
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.Property
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.List
;
import
java.util.Random
;
import
java.util.Set
;
/**
* A server list filter that limits the number of the servers used by the load balancer to be the subset of all servers.
...
...
@@ -43,26 +43,41 @@ public class ServerListSubsetFilter<T extends Server> extends ZoneAffinityServer
private
Random
random
=
new
Random
();
private
volatile
Set
<
T
>
currentSubset
=
Sets
.
newHashSet
();
private
DynamicIntProperty
sizeProp
=
new
DynamicIntProperty
(
CommonClientConfigKey
.
DEFAULT_NAME_SPACE
+
".ServerListSubsetFilter.size"
,
20
);
private
DynamicFloatProperty
eliminationPercent
=
new
DynamicFloatProperty
(
CommonClientConfigKey
.
DEFAULT_NAME_SPACE
+
".ServerListSubsetFilter.forceEliminatePercent"
,
0.1f
);
private
DynamicIntProperty
eliminationFailureCountThreshold
=
new
DynamicIntProperty
(
CommonClientConfigKey
.
DEFAULT_NAME_SPACE
+
".ServerListSubsetFilter.eliminationFailureThresold"
,
0
);
private
DynamicIntProperty
eliminationConnectionCountThreshold
=
new
DynamicIntProperty
(
CommonClientConfigKey
.
DEFAULT_NAME_SPACE
+
".ServerListSubsetFilter.eliminationConnectionThresold"
,
0
);
private
Property
<
Integer
>
sizeProp
;
private
Property
<
Float
>
eliminationPercent
;
private
Property
<
Integer
>
eliminationFailureCountThreshold
;
private
Property
<
Integer
>
eliminationConnectionCountThreshold
;
private
static
final
IClientConfigKey
<
Integer
>
SIZE
=
new
CommonClientConfigKey
<
Integer
>(
"ServerListSubsetFilter.size"
,
20
)
{};
private
static
final
IClientConfigKey
<
Float
>
FORCE_ELIMINATE_PERCENT
=
new
CommonClientConfigKey
<
Float
>(
"ServerListSubsetFilter.forceEliminatePercent"
,
0.1f
)
{};
private
static
final
IClientConfigKey
<
Integer
>
ELIMINATION_FAILURE_THRESHOLD
=
new
CommonClientConfigKey
<
Integer
>(
"ServerListSubsetFilter.eliminationFailureThresold"
,
0
)
{};
private
static
final
IClientConfigKey
<
Integer
>
ELIMINATION_CONNECTION_THRESHOLD
=
new
CommonClientConfigKey
<
Integer
>(
"ServerListSubsetFilter.eliminationConnectionThresold"
,
0
)
{};
/**
* @deprecated ServerListSubsetFilter should only be created with an IClientConfig. See {@link ServerListSubsetFilter#ServerListSubsetFilter(IClientConfig)}
*/
@Deprecated
public
ServerListSubsetFilter
()
{
sizeProp
=
Property
.
of
(
SIZE
.
defaultValue
());
eliminationPercent
=
Property
.
of
(
FORCE_ELIMINATE_PERCENT
.
defaultValue
());
eliminationFailureCountThreshold
=
Property
.
of
(
ELIMINATION_FAILURE_THRESHOLD
.
defaultValue
());
eliminationConnectionCountThreshold
=
Property
.
of
(
ELIMINATION_CONNECTION_THRESHOLD
.
defaultValue
());
}
public
ServerListSubsetFilter
(
IClientConfig
clientConfig
)
{
super
(
clientConfig
);
initWithNiwsConfig
(
clientConfig
);
}
@Override
public
void
initWithNiwsConfig
(
IClientConfig
clientConfig
)
{
super
.
initWithNiwsConfig
(
clientConfig
);
sizeProp
=
new
DynamicIntProperty
(
clientConfig
.
getClientName
()
+
"."
+
clientConfig
.
getNameSpace
()
+
".ServerListSubsetFilter.size"
,
20
);
eliminationPercent
=
new
DynamicFloatProperty
(
clientConfig
.
getClientName
()
+
"."
+
clientConfig
.
getNameSpace
()
+
".ServerListSubsetFilter.forceEliminatePercent"
,
0.1f
);
eliminationFailureCountThreshold
=
new
DynamicIntProperty
(
clientConfig
.
getClientName
()
+
"."
+
clientConfig
.
getNameSpace
()
+
".ServerListSubsetFilter.eliminationFailureThresold"
,
0
);
eliminationConnectionCountThreshold
=
new
DynamicIntProperty
(
clientConfig
.
getClientName
()
+
"."
+
clientConfig
.
getNameSpace
()
+
".ServerListSubsetFilter.eliminationConnectionThresold"
,
0
);
sizeProp
=
clientConfig
.
getDynamicProperty
(
SIZE
);
eliminationPercent
=
clientConfig
.
getDynamicProperty
(
FORCE_ELIMINATE_PERCENT
);
eliminationFailureCountThreshold
=
clientConfig
.
getDynamicProperty
(
ELIMINATION_FAILURE_THRESHOLD
);
eliminationConnectionCountThreshold
=
clientConfig
.
getDynamicProperty
(
ELIMINATION_CONNECTION_THRESHOLD
);
}
/**
* Given all the servers, keep only a stable subset of servers to use. This method
* keeps the current list of subset in use and keep returning the same list, with exceptions
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ServerStats.java
浏览文件 @
3275c24d
...
...
@@ -17,15 +17,12 @@
*/
package
com.netflix.loadbalancer
;
import
java.util.Date
;
import
java.util.Random
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.concurrent.atomic.AtomicLong
;
import
com.google.common.annotations.VisibleForTesting
;
import
com.netflix.config.CachedDynamicIntProperty
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.Property
;
import
com.netflix.client.config.UnboxedIntProperty
;
import
com.netflix.servo.annotations.DataSourceType
;
import
com.netflix.servo.annotations.Monitor
;
import
com.netflix.stats.distribution.DataDistribution
;
...
...
@@ -33,21 +30,26 @@ import com.netflix.stats.distribution.DataPublisher;
import
com.netflix.stats.distribution.Distribution
;
import
com.netflix.util.MeasuredRate
;
import
java.util.Date
;
import
java.util.Random
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.concurrent.atomic.AtomicLong
;
/**
* Capture various stats per Server(node) in the LoadBalancer
* @author stonse
*
*/
public
class
ServerStats
{
private
static
final
int
DEFAULT_PUBLISH_INTERVAL
=
60
*
1000
;
// = 1 minute
private
static
final
int
DEFAULT_BUFFER_SIZE
=
60
*
1000
;
// = 1000 requests/sec for 1 minute
private
final
CachedDynamicIntProperty
connectionFailureThreshold
;
private
final
CachedDynamicIntProperty
circuitTrippedTimeoutFactor
;
private
final
CachedDynamicIntProperty
maxCircuitTrippedTimeout
;
private
static
final
DynamicIntProperty
activeRequestsCountTimeout
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
"niws.loadbalancer.serverStats.activeRequestsCount.effectiveWindowSeconds"
,
60
*
10
)
;
private
final
UnboxedIntProperty
connectionFailureThreshold
;
private
final
UnboxedIntProperty
circuitTrippedTimeoutFactor
;
private
final
UnboxedIntProperty
maxCircuitTrippedTimeout
;
private
final
UnboxedIntProperty
activeRequestsCountTimeout
;
private
static
final
double
[]
PERCENTS
=
makePercentValues
();
private
DataDistribution
dataDist
=
new
DataDistribution
(
1
,
PERCENTS
);
// in case
...
...
@@ -81,21 +83,19 @@ public class ServerStats {
private
AtomicLong
totalCircuitBreakerBlackOutPeriod
=
new
AtomicLong
(
0
);
private
volatile
long
lastAccessedTimestamp
;
private
volatile
long
firstConnectionTimestamp
=
0
;
public
ServerStats
()
{
connectionFailureThreshold
=
new
CachedDynamicIntProperty
(
"niws.loadbalancer.default.connectionFailureCountThreshold"
,
3
);
circuitTrippedTimeoutFactor
=
new
CachedDynamicIntProperty
(
"niws.loadbalancer.default.circuitTripTimeoutFactorSeconds"
,
10
);
maxCircuitTrippedTimeout
=
new
CachedDynamicIntProperty
(
"niws.loadbalancer.default.circuitTripMaxTimeoutSeconds"
,
30
);
public
ServerStats
()
{
connectionFailureThreshold
=
new
UnboxedIntProperty
(
Property
.
of
(
LoadBalancerStats
.
CONNECTION_FAILURE_COUNT_THRESHOLD
.
defaultValue
()));
circuitTrippedTimeoutFactor
=
new
UnboxedIntProperty
(
LoadBalancerStats
.
CIRCUIT_TRIP_TIMEOUT_FACTOR_SECONDS
.
defaultValue
());
maxCircuitTrippedTimeout
=
new
UnboxedIntProperty
(
LoadBalancerStats
.
CIRCUIT_TRIP_MAX_TIMEOUT_SECONDS
.
defaultValue
());
activeRequestsCountTimeout
=
new
UnboxedIntProperty
(
LoadBalancerStats
.
ACTIVE_REQUESTS_COUNT_TIMEOUT
.
defaultValue
());
}
public
ServerStats
(
LoadBalancerStats
lbStats
)
{
this
.
maxCircuitTrippedTimeout
=
lbStats
.
getCircuitTripMaxTimeoutSeconds
();
this
.
circuitTrippedTimeoutFactor
=
lbStats
.
getCircuitTrippedTimeoutFactor
();
this
.
connectionFailureThreshold
=
lbStats
.
getConnectionFailureCountThreshold
();
maxCircuitTrippedTimeout
=
lbStats
.
getCircuitTripMaxTimeoutSeconds
();
circuitTrippedTimeoutFactor
=
lbStats
.
getCircuitTrippedTimeoutFactor
();
connectionFailureThreshold
=
lbStats
.
getConnectionFailureCountThreshold
();
activeRequestsCountTimeout
=
lbStats
.
getActiveRequestsCountTimeout
();
}
/**
...
...
@@ -225,18 +225,14 @@ public class ServerStats {
}
public
void
decrementActiveRequestsCount
()
{
if
(
activeRequestsCount
.
decrementAndGet
()
<
0
)
{
activeRequestsCount
.
set
(
0
);
}
activeRequestsCount
.
getAndUpdate
(
current
->
Math
.
max
(
0
,
current
-
1
));
lastActiveRequestsCountChangeTimestamp
=
System
.
currentTimeMillis
();
}
public
void
decrementOpenConnectionsCount
()
{
if
(
openConnectionsCount
.
decrementAndGet
()
<
0
)
{
openConnectionsCount
.
set
(
0
);
}
openConnectionsCount
.
getAndUpdate
(
current
->
Math
.
max
(
0
,
current
-
1
));
}
public
int
getActiveRequestsCount
()
{
return
getActiveRequestsCount
(
System
.
currentTimeMillis
());
}
...
...
@@ -257,7 +253,6 @@ public class ServerStats {
return
openConnectionsCount
.
get
();
}
public
long
getMeasuredRequestsCount
()
{
return
requestCountInWindow
.
getCount
();
}
...
...
@@ -280,7 +275,6 @@ public class ServerStats {
return
circuitBreakerTimeout
>
currentTime
;
}
private
long
getCircuitBreakerTimeout
()
{
long
blackOutPeriod
=
getCircuitBreakerBlackoutPeriod
();
if
(
blackOutPeriod
<=
0
)
{
...
...
@@ -295,7 +289,7 @@ public class ServerStats {
if
(
failureCount
<
threshold
)
{
return
0
;
}
int
diff
=
(
failureCount
-
threshold
)
>
16
?
16
:
(
failureCount
-
threshold
);
int
diff
=
Math
.
min
(
failureCount
-
threshold
,
16
);
int
blackOutSeconds
=
(
1
<<
diff
)
*
circuitTrippedTimeoutFactor
.
get
();
if
(
blackOutSeconds
>
maxCircuitTrippedTimeout
.
get
())
{
blackOutSeconds
=
maxCircuitTrippedTimeout
.
get
();
...
...
@@ -313,7 +307,6 @@ public class ServerStats {
successiveConnectionFailureCount
.
set
(
0
);
}
@Monitor
(
name
=
"SuccessiveConnectionFailureCount"
,
type
=
DataSourceType
.
GAUGE
)
public
int
getSuccessiveConnectionFailureCount
()
{
return
successiveConnectionFailureCount
.
get
();
...
...
@@ -518,35 +511,4 @@ public class ServerStats {
return
sb
.
toString
();
}
public
static
void
main
(
String
[]
args
){
ServerStats
ss
=
new
ServerStats
();
ss
.
setBufferSize
(
1000
);
ss
.
setPublishInterval
(
1000
);
ss
.
initialize
(
new
Server
(
"stonse"
,
80
));
Random
r
=
new
Random
(
1459834
);
for
(
int
i
=
0
;
i
<
99
;
i
++){
double
rl
=
r
.
nextDouble
()
*
25.2
;
ss
.
noteResponseTime
(
rl
);
ss
.
incrementNumRequests
();
try
{
Thread
.
sleep
(
100
);
System
.
out
.
println
(
"ServerStats:avg:"
+
ss
.
getResponseTimeAvg
());
System
.
out
.
println
(
"ServerStats:90 percentile:"
+
ss
.
getResponseTime90thPercentile
());
System
.
out
.
println
(
"ServerStats:90 percentile:"
+
ss
.
getResponseTimePercentileNumValues
());
}
catch
(
InterruptedException
e
)
{
}
}
System
.
out
.
println
(
"done ---"
);
ss
.
publisher
.
stop
();
System
.
out
.
println
(
"ServerStats:"
+
ss
);
}
}
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAffinityPredicate.java
浏览文件 @
3275c24d
...
...
@@ -17,28 +17,19 @@
*/
package
com.netflix.loadbalancer
;
import
com.netflix.config.ConfigurationManager
;
import
com.netflix.config.DeploymentContext.ContextKey
;
import
com.netflix.loadbalancer.AbstractServerPredicate
;
import
com.netflix.loadbalancer.PredicateKey
;
import
com.netflix.loadbalancer.Server
;
/**
* A predicate the filters out servers that are not in the same zone as the client's current
* zone. The current zone is determined from the call
*
* <pre>{@code
* ConfigurationManager.getDeploymentContext().getValue(ContextKey.zone);
* }</pre>
* zone.
*
* @author awang
*
*/
public
class
ZoneAffinityPredicate
extends
AbstractServerPredicate
{
private
final
String
zone
=
ConfigurationManager
.
getDeploymentContext
().
getValue
(
ContextKey
.
zone
);
public
ZoneAffinityPredicate
()
{
private
final
String
zone
;
public
ZoneAffinityPredicate
(
String
zone
)
{
this
.
zone
=
zone
;
}
@Override
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAffinityServerListFilter.java
浏览文件 @
3275c24d
...
...
@@ -18,23 +18,19 @@ package com.netflix.loadbalancer;
*
*/
import
java.util.List
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.collect.Iterables
;
import
com.google.common.collect.Lists
;
import
com.netflix.client.IClientConfigAware
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.ConfigurationManager
;
import
com.netflix.config.DeploymentContext.ContextKey
;
import
com.netflix.config.DynamicDoubleProperty
;
import
com.netflix.config.DynamicIntProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.Property
;
import
com.netflix.servo.monitor.Counter
;
import
com.netflix.servo.monitor.Monitors
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.List
;
/**
* This server list filter deals with filtering out servers based on the Zone affinity.
...
...
@@ -50,45 +46,46 @@ import com.netflix.servo.monitor.Monitors;
public
class
ZoneAffinityServerListFilter
<
T
extends
Server
>
extends
AbstractServerListFilter
<
T
>
implements
IClientConfigAware
{
private
volatile
boolean
zoneAffinity
=
CommonClientConfigKey
.
EnableZoneAffinity
.
getDefaultValue
();
private
volatile
boolean
zoneExclusive
=
CommonClientConfigKey
.
EnableZoneExclusivity
.
getDefaultValue
();
private
DynamicDoubleProperty
activeReqeustsPerServerThreshold
;
private
DynamicDoubleProperty
blackOutServerPercentageThreshold
;
private
DynamicIntProperty
availableServersThreshold
;
private
static
IClientConfigKey
<
String
>
ZONE
=
new
CommonClientConfigKey
<
String
>(
"@zone"
,
""
)
{};
private
static
IClientConfigKey
<
Double
>
MAX_LOAD_PER_SERVER
=
new
CommonClientConfigKey
<
Double
>(
"zoneAffinity.maxLoadPerServer"
,
0.6d
)
{};
private
static
IClientConfigKey
<
Double
>
MAX_BLACKOUT_SERVER_PERCENTAGE
=
new
CommonClientConfigKey
<
Double
>(
"zoneAffinity.maxBlackOutServesrPercentage"
,
0.8d
)
{};
private
static
IClientConfigKey
<
Integer
>
MIN_AVAILABLE_SERVERS
=
new
CommonClientConfigKey
<
Integer
>(
"zoneAffinity.minAvailableServers"
,
2
)
{};
private
boolean
zoneAffinity
;
private
boolean
zoneExclusive
;
private
Property
<
Double
>
activeReqeustsPerServerThreshold
;
private
Property
<
Double
>
blackOutServerPercentageThreshold
;
private
Property
<
Integer
>
availableServersThreshold
;
private
Counter
overrideCounter
;
private
ZoneAffinityPredicate
zoneAffinityPredicate
=
new
ZoneAffinityPredicate
()
;
private
ZoneAffinityPredicate
zoneAffinityPredicate
;
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
ZoneAffinityServerListFilter
.
class
);
String
zone
;
public
ZoneAffinityServerListFilter
()
{
private
String
zone
;
/**
* @deprecated Must pass in a config via {@link ZoneAffinityServerListFilter#ZoneAffinityServerListFilter(IClientConfig)}
*/
@Deprecated
public
ZoneAffinityServerListFilter
()
{
}
public
ZoneAffinityServerListFilter
(
IClientConfig
niwsClientConfig
)
{
initWithNiwsConfig
(
niwsClientConfig
);
}
@Override
public
void
initWithNiwsConfig
(
IClientConfig
niwsClientConfig
)
{
String
sZoneAffinity
=
""
+
niwsClientConfig
.
getProperty
(
CommonClientConfigKey
.
EnableZoneAffinity
,
false
);
if
(
sZoneAffinity
!=
null
){
zoneAffinity
=
Boolean
.
parseBoolean
(
sZoneAffinity
);
logger
.
debug
(
"ZoneAffinity is set to {}"
,
zoneAffinity
);
}
String
sZoneExclusive
=
""
+
niwsClientConfig
.
getProperty
(
CommonClientConfigKey
.
EnableZoneExclusivity
,
false
);
if
(
sZoneExclusive
!=
null
){
zoneExclusive
=
Boolean
.
parseBoolean
(
sZoneExclusive
);
}
if
(
ConfigurationManager
.
getDeploymentContext
()
!=
null
)
{
zone
=
ConfigurationManager
.
getDeploymentContext
().
getValue
(
ContextKey
.
zone
);
}
activeReqeustsPerServerThreshold
=
DynamicPropertyFactory
.
getInstance
().
getDoubleProperty
(
niwsClientConfig
.
getClientName
()
+
"."
+
niwsClientConfig
.
getNameSpace
()
+
".zoneAffinity.maxLoadPerServer"
,
0.6d
);
logger
.
debug
(
"activeReqeustsPerServerThreshold: {}"
,
activeReqeustsPerServerThreshold
.
get
());
blackOutServerPercentageThreshold
=
DynamicPropertyFactory
.
getInstance
().
getDoubleProperty
(
niwsClientConfig
.
getClientName
()
+
"."
+
niwsClientConfig
.
getNameSpace
()
+
".zoneAffinity.maxBlackOutServesrPercentage"
,
0.8d
);
logger
.
debug
(
"blackOutServerPercentageThreshold: {}"
,
blackOutServerPercentageThreshold
.
get
());
availableServersThreshold
=
DynamicPropertyFactory
.
getInstance
().
getIntProperty
(
niwsClientConfig
.
getClientName
()
+
"."
+
niwsClientConfig
.
getNameSpace
()
+
".zoneAffinity.minAvailableServers"
,
2
);
logger
.
debug
(
"availableServersThreshold: {}"
,
availableServersThreshold
.
get
());
zoneAffinity
=
niwsClientConfig
.
getOrDefault
(
CommonClientConfigKey
.
EnableZoneAffinity
);
zoneExclusive
=
niwsClientConfig
.
getOrDefault
(
CommonClientConfigKey
.
EnableZoneExclusivity
);
zone
=
niwsClientConfig
.
getGlobalProperty
(
ZONE
).
get
();
zoneAffinityPredicate
=
new
ZoneAffinityPredicate
(
zone
);
activeReqeustsPerServerThreshold
=
niwsClientConfig
.
getDynamicProperty
(
MAX_LOAD_PER_SERVER
);
blackOutServerPercentageThreshold
=
niwsClientConfig
.
getDynamicProperty
(
MAX_BLACKOUT_SERVER_PERCENTAGE
);
availableServersThreshold
=
niwsClientConfig
.
getDynamicProperty
(
MIN_AVAILABLE_SERVERS
);
overrideCounter
=
Monitors
.
newCounter
(
"ZoneAffinity_OverrideCounter"
);
Monitors
.
registerObject
(
"NIWSServerListFilter_"
+
niwsClientConfig
.
getClientName
());
...
...
@@ -144,4 +141,5 @@ public class ZoneAffinityServerListFilter<T extends Server> extends
sb
.
append
(
", zoneExclusivity:"
).
append
(
zoneExclusive
);
return
sb
.
toString
();
}
}
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAvoidancePredicate.java
浏览文件 @
3275c24d
...
...
@@ -17,18 +17,16 @@
*/
package
com.netflix.loadbalancer
;
import
java.util.Map
;
import
java.util.Set
;
import
javax.annotation.Nullable
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.Property
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.DynamicBooleanProperty
;
import
com.netflix.config.DynamicDoubleProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
import
javax.annotation.Nullable
;
import
java.util.Map
;
import
java.util.Set
;
/**
* A server predicate that filters out all servers in a worst zone if the aggregated metric for that zone reaches a threshold.
...
...
@@ -37,48 +35,50 @@ import com.netflix.config.DynamicPropertyFactory;
* @author awang
*
*/
public
class
ZoneAvoidancePredicate
extends
AbstractServerPredicate
{
private
volatile
DynamicDoubleProperty
triggeringLoad
=
new
DynamicDoubleProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer.triggeringLoadPerServerThreshold"
,
0.2d
);
public
class
ZoneAvoidancePredicate
extends
AbstractServerPredicate
{
private
volatile
DynamicDoubleProperty
triggeringBlackoutPercentage
=
new
DynamicDoubleProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer.avoidZoneWithBlackoutPercetage"
,
0.99999d
);
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ZoneAvoidancePredicate
.
class
);
private
static
final
DynamicBooleanProperty
ENABLED
=
DynamicPropertyFactory
.
getInstance
().
getBooleanProperty
(
"niws.loadbalancer.zoneAvoidanceRule.enabled"
,
true
);
private
static
final
IClientConfigKey
<
Double
>
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
=
new
CommonClientConfigKey
<
Double
>(
"ZoneAwareNIWSDiscoveryLoadBalancer.%s.triggeringLoadPerServerThreshold"
,
0.2d
)
{};
private
static
final
IClientConfigKey
<
Double
>
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
=
new
CommonClientConfigKey
<
Double
>(
"ZoneAwareNIWSDiscoveryLoadBalancer.%s.avoidZoneWithBlackoutPercetage"
,
0.99999d
)
{};
private
static
final
IClientConfigKey
<
Boolean
>
ENABLED
=
new
CommonClientConfigKey
<
Boolean
>(
"niws.loadbalancer.zoneAvoidanceRule.enabled"
,
true
)
{};
private
Property
<
Double
>
triggeringLoad
=
Property
.
of
(
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
.
defaultValue
());
private
Property
<
Double
>
triggeringBlackoutPercentage
=
Property
.
of
(
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
.
defaultValue
());
private
Property
<
Boolean
>
enabled
=
Property
.
of
(
ENABLED
.
defaultValue
());
public
ZoneAvoidancePredicate
(
IRule
rule
,
IClientConfig
clientConfig
)
{
super
(
rule
,
clientConfig
);
super
(
rule
);
initDynamicProperties
(
clientConfig
);
}
public
ZoneAvoidancePredicate
(
LoadBalancerStats
lbStats
,
IClientConfig
clientConfig
)
{
super
(
lbStats
,
clientConfig
);
public
ZoneAvoidancePredicate
(
LoadBalancerStats
lbStats
,
IClientConfig
clientConfig
)
{
super
(
lbStats
);
initDynamicProperties
(
clientConfig
);
}
ZoneAvoidancePredicate
(
IRule
rule
)
{
super
(
rule
);
}
private
void
initDynamicProperties
(
IClientConfig
clientConfig
)
{
if
(
clientConfig
!=
null
)
{
triggeringLoad
=
DynamicPropertyFactory
.
getInstance
().
getDoubleProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer."
+
clientConfig
.
getClientName
()
+
".triggeringLoadPerServerThreshold"
,
0.2d
);
triggeringBlackoutPercentage
=
DynamicPropertyFactory
.
getInstance
().
getDoubleProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer."
+
clientConfig
.
getClientName
()
+
".avoidZoneWithBlackoutPercetage"
,
0.99999d
);
enabled
=
clientConfig
.
getGlobalProperty
(
ENABLED
);
triggeringLoad
=
clientConfig
.
getGlobalProperty
(
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
.
format
(
clientConfig
.
getClientName
()));
triggeringBlackoutPercentage
=
clientConfig
.
getGlobalProperty
(
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
.
format
(
clientConfig
.
getClientName
()));
}
}
@Override
public
boolean
apply
(
@Nullable
PredicateKey
input
)
{
if
(!
ENABLED
.
get
())
{
if
(!
enabled
.
get
())
{
return
true
;
}
String
serverZone
=
input
.
getServer
().
getZone
();
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAvoidanceRule.java
浏览文件 @
3275c24d
...
...
@@ -40,7 +40,6 @@ public class ZoneAvoidanceRule extends PredicateBasedRule {
private
CompositePredicate
compositePredicate
;
public
ZoneAvoidanceRule
()
{
super
();
ZoneAvoidancePredicate
zonePredicate
=
new
ZoneAvoidancePredicate
(
this
);
AvailabilityPredicate
availabilityPredicate
=
new
AvailabilityPredicate
(
this
);
compositePredicate
=
createCompositePredicate
(
zonePredicate
,
availabilityPredicate
);
...
...
@@ -51,10 +50,8 @@ public class ZoneAvoidanceRule extends PredicateBasedRule {
.
addFallbackPredicate
(
p2
)
.
addFallbackPredicate
(
AbstractServerPredicate
.
alwaysTrue
())
.
build
();
}
@Override
public
void
initWithNiwsConfig
(
IClientConfig
clientConfig
)
{
ZoneAvoidancePredicate
zonePredicate
=
new
ZoneAvoidancePredicate
(
this
,
clientConfig
);
...
...
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/ZoneAwareLoadBalancer.java
浏览文件 @
3275c24d
...
...
@@ -17,22 +17,24 @@
*/
package
com.netflix.loadbalancer
;
import
com.google.common.annotations.VisibleForTesting
;
import
com.google.common.base.Preconditions
;
import
com.netflix.client.ClientFactory
;
import
com.netflix.client.config.ClientConfigFactory
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.client.config.IClientConfigKey
;
import
com.netflix.client.config.Property
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.concurrent.ConcurrentHashMap
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.annotations.VisibleForTesting
;
import
com.netflix.client.ClientFactory
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.config.DynamicBooleanProperty
;
import
com.netflix.config.DynamicDoubleProperty
;
import
com.netflix.config.DynamicPropertyFactory
;
/**
* Load balancer that can avoid a zone as a whole when choosing server.
*<p>
...
...
@@ -55,35 +57,64 @@ public class ZoneAwareLoadBalancer<T extends Server> extends DynamicServerListLo
private
ConcurrentHashMap
<
String
,
BaseLoadBalancer
>
balancers
=
new
ConcurrentHashMap
<
String
,
BaseLoadBalancer
>();
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ZoneAwareLoadBalancer
.
class
);
private
volatile
DynamicDoubleProperty
triggeringLoad
;
private
volatile
DynamicDoubleProperty
triggeringBlackoutPercentage
;
private
static
final
IClientConfigKey
<
Boolean
>
ENABLED
=
new
CommonClientConfigKey
<
Boolean
>(
"ZoneAwareNIWSDiscoveryLoadBalancer.enabled"
,
true
){};
private
static
final
IClientConfigKey
<
Double
>
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
=
new
CommonClientConfigKey
<
Double
>(
"ZoneAwareNIWSDiscoveryLoadBalancer.%s.triggeringLoadPerServerThreshold"
,
0.2d
){};
private
static
final
IClientConfigKey
<
Double
>
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
=
new
CommonClientConfigKey
<
Double
>(
"ZoneAwareNIWSDiscoveryLoadBalancer.%s.avoidZoneWithBlackoutPercetage"
,
0.99999d
){};
private
Property
<
Double
>
triggeringLoad
=
Property
.
of
(
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
.
defaultValue
());
private
Property
<
Double
>
triggeringBlackoutPercentage
=
Property
.
of
(
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
.
defaultValue
());
private
Property
<
Boolean
>
enabled
=
Property
.
of
(
ENABLED
.
defaultValue
());
private
static
final
DynamicBooleanProperty
ENABLED
=
DynamicPropertyFactory
.
getInstance
().
getBooleanProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer.enabled"
,
true
);
void
setUpServerList
(
List
<
Server
>
upServerList
)
{
this
.
upServerList
=
upServerList
;
}
public
ZoneAwareLoadBalancer
()
{
super
();
}
@Deprecated
public
ZoneAwareLoadBalancer
(
IClientConfig
clientConfig
,
IRule
rule
,
IPing
ping
,
ServerList
<
T
>
serverList
,
ServerListFilter
<
T
>
filter
)
{
super
(
clientConfig
,
rule
,
ping
,
serverList
,
filter
);
String
name
=
Optional
.
ofNullable
(
getName
()).
orElse
(
"default"
);
this
.
enabled
=
clientConfig
.
getGlobalProperty
(
ENABLED
);
this
.
triggeringLoad
=
clientConfig
.
getGlobalProperty
(
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
.
format
(
name
));
this
.
triggeringBlackoutPercentage
=
clientConfig
.
getGlobalProperty
(
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
.
format
(
name
));
}
public
ZoneAwareLoadBalancer
(
IClientConfig
clientConfig
,
IRule
rule
,
IPing
ping
,
ServerList
<
T
>
serverList
,
ServerListFilter
<
T
>
filter
,
ServerListUpdater
serverListUpdater
)
{
super
(
clientConfig
,
rule
,
ping
,
serverList
,
filter
,
serverListUpdater
);
String
name
=
Optional
.
ofNullable
(
getName
()).
orElse
(
"default"
);
this
.
enabled
=
clientConfig
.
getGlobalProperty
(
ENABLED
);
this
.
triggeringLoad
=
clientConfig
.
getGlobalProperty
(
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
.
format
(
name
));
this
.
triggeringBlackoutPercentage
=
clientConfig
.
getGlobalProperty
(
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
.
format
(
name
));
}
public
ZoneAwareLoadBalancer
()
{
super
();
}
public
ZoneAwareLoadBalancer
(
IClientConfig
niwsClientConfig
)
{
super
(
niwsClientConfig
);
@Override
public
void
initWithNiwsConfig
(
IClientConfig
clientConfig
)
{
super
.
initWithNiwsConfig
(
clientConfig
);
String
name
=
Optional
.
ofNullable
(
getName
()).
orElse
(
"default"
);
this
.
enabled
=
clientConfig
.
getGlobalProperty
(
ENABLED
);
this
.
triggeringLoad
=
clientConfig
.
getGlobalProperty
(
TRIGGERING_LOAD_PER_SERVER_THRESHOLD
.
format
(
name
));
this
.
triggeringBlackoutPercentage
=
clientConfig
.
getGlobalProperty
(
AVOID_ZONE_WITH_BLACKOUT_PERCENTAGE
.
format
(
name
));
}
@Override
...
...
@@ -108,7 +139,7 @@ public class ZoneAwareLoadBalancer<T extends Server> extends DynamicServerListLo
@Override
public
Server
chooseServer
(
Object
key
)
{
if
(!
ENABLED
.
get
()
||
getLoadBalancerStats
().
getAvailableZones
().
size
()
<=
1
)
{
if
(!
enabled
.
get
()
||
getLoadBalancerStats
().
getAvailableZones
().
size
()
<=
1
)
{
logger
.
debug
(
"Zone aware logic disabled or there is only one zone"
);
return
super
.
chooseServer
(
key
);
}
...
...
@@ -117,15 +148,6 @@ public class ZoneAwareLoadBalancer<T extends Server> extends DynamicServerListLo
LoadBalancerStats
lbStats
=
getLoadBalancerStats
();
Map
<
String
,
ZoneSnapshot
>
zoneSnapshot
=
ZoneAvoidanceRule
.
createSnapshot
(
lbStats
);
logger
.
debug
(
"Zone snapshots: {}"
,
zoneSnapshot
);
if
(
triggeringLoad
==
null
)
{
triggeringLoad
=
DynamicPropertyFactory
.
getInstance
().
getDoubleProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer."
+
this
.
getName
()
+
".triggeringLoadPerServerThreshold"
,
0.2d
);
}
if
(
triggeringBlackoutPercentage
==
null
)
{
triggeringBlackoutPercentage
=
DynamicPropertyFactory
.
getInstance
().
getDoubleProperty
(
"ZoneAwareNIWSDiscoveryLoadBalancer."
+
this
.
getName
()
+
".avoidZoneWithBlackoutPercetage"
,
0.99999d
);
}
Set
<
String
>
availableZones
=
ZoneAvoidanceRule
.
getAvailableZones
(
zoneSnapshot
,
triggeringLoad
.
get
(),
triggeringBlackoutPercentage
.
get
());
logger
.
debug
(
"Available zones: {}"
,
availableZones
);
if
(
availableZones
!=
null
&&
availableZones
.
size
()
<
zoneSnapshot
.
keySet
().
size
())
{
...
...
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/PredicatesTest.java
浏览文件 @
3275c24d
...
...
@@ -168,9 +168,11 @@ public class PredicatesTest {
assertTrue
(
predicate
.
apply
(
new
PredicateKey
((
Server
)
stats
[
0
][
0
])));
assertTrue
(
predicate
.
apply
(
new
PredicateKey
((
Server
)
stats
[
9
][
0
])));
}
@Test
public
void
testCompositePredicate
()
{
ConfigurationManager
.
getConfigInstance
().
setProperty
(
ContextKey
.
zone
.
getKey
(),
"0"
);
Object
[][]
stats
=
new
Object
[
10
][
3
];
Map
<
String
,
List
<
Server
>>
zoneMap
=
Maps
.
newHashMap
();
List
<
Server
>
expectedFiltered
=
Lists
.
newArrayList
();
...
...
@@ -205,9 +207,9 @@ public class PredicatesTest {
LoadBalancerStats
lbStats
=
new
LoadBalancerStats
(
"default"
);
setServerStats
(
lbStats
,
stats
);
lbStats
.
updateZoneServerMapping
(
zoneMap
);
ConfigurationManager
.
getDeploymentContext
().
setValue
(
ContextKey
.
zone
,
"0"
);
AvailabilityPredicate
p1
=
new
AvailabilityPredicate
(
lbStats
,
null
);
ZoneAffinityPredicate
p2
=
new
ZoneAffinityPredicate
();
ZoneAffinityPredicate
p2
=
new
ZoneAffinityPredicate
(
"0"
);
CompositePredicate
c
=
CompositePredicate
.
withPredicates
(
p2
,
p1
).
build
();
assertFalse
(
c
.
apply
(
new
PredicateKey
((
Server
)
stats
[
5
][
0
])));
assertTrue
(
c
.
apply
(
new
PredicateKey
((
Server
)
stats
[
0
][
0
])));
...
...
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/ServerStatsTest.java
浏览文件 @
3275c24d
...
...
@@ -29,6 +29,6 @@ public class ServerStatsTest {
public
void
testRegisterWithServo
()
{
// Make sure annotations are correct:
// https://github.com/Netflix/ribbon/issues/191
Monitors
.
registerObject
(
new
ServerStats
());
//
Monitors.registerObject(new ServerStats());
}
}
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/SubsetFilterTest.java
浏览文件 @
3275c24d
...
...
@@ -20,9 +20,12 @@ import static org.junit.Assert.assertTrue;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
import
com.google.common.util.concurrent.Uninterruptibles
;
import
org.apache.commons.configuration.Configuration
;
import
org.junit.BeforeClass
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
com.google.common.collect.Lists
;
...
...
@@ -35,17 +38,7 @@ public class SubsetFilterTest {
@BeforeClass
public
static
void
init
()
{
Configuration
config
=
ConfigurationManager
.
getConfigInstance
();
config
.
setProperty
(
DefaultClientConfigImpl
.
DEFAULT_PROPERTY_NAME_SPACE
+
".ServerListSubsetFilter.forceEliminatePercent"
,
"0.6"
);
config
.
setProperty
(
DefaultClientConfigImpl
.
DEFAULT_PROPERTY_NAME_SPACE
+
".ServerListSubsetFilter.eliminationFailureThresold"
,
2
);
config
.
setProperty
(
DefaultClientConfigImpl
.
DEFAULT_PROPERTY_NAME_SPACE
+
".ServerListSubsetFilter.eliminationConnectionThresold"
,
2
);
config
.
setProperty
(
DefaultClientConfigImpl
.
DEFAULT_PROPERTY_NAME_SPACE
+
".ServerListSubsetFilter.size"
,
"5"
);
config
.
setProperty
(
"SubsetFilerTest.ribbon.NFLoadBalancerClassName"
,
com
.
netflix
.
loadbalancer
.
DynamicServerListLoadBalancer
.
class
.
getName
());
config
.
setProperty
(
"SubsetFilerTest.ribbon.NFLoadBalancerClassName"
,
com
.
netflix
.
loadbalancer
.
DynamicServerListLoadBalancer
.
class
.
getName
());
config
.
setProperty
(
"SubsetFilerTest.ribbon.NIWSServerListClassName"
,
MockServerList
.
class
.
getName
());
config
.
setProperty
(
"SubsetFilerTest.ribbon.NIWSServerListFilterClassName"
,
ServerListSubsetFilter
.
class
.
getName
());
// turn off auto refresh
...
...
@@ -90,8 +83,12 @@ public class SubsetFilterTest {
@Test
public
void
testFiltering
()
{
ServerListSubsetFilter
<
Server
>
filter
=
new
ServerListSubsetFilter
<
Server
>();
DefaultClientConfigImpl
config
=
new
DefaultClientConfigImpl
();
config
.
setClientName
(
"SubsetFilerTest"
);
ServerListSubsetFilter
<
Server
>
filter
=
new
ServerListSubsetFilter
<
Server
>(
config
);
LoadBalancerStats
stats
=
new
LoadBalancerStats
(
"default"
);
stats
.
initWithNiwsConfig
(
config
);
filter
.
setLoadBalancerStats
(
stats
);
Object
[][]
serverStats
=
{
{
"server0"
,
0
,
0
},
...
...
@@ -167,12 +164,9 @@ public class SubsetFilterTest {
LoadBalancerStats
stats
=
lb
.
getLoadBalancerStats
();
List
<
Server
>
list
=
getServersAndStats
(
stats
,
serverStats
);
serverList
.
setServerList
(
list
);
try
{
Thread
.
sleep
(
2000
);
}
catch
(
InterruptedException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
Uninterruptibles
.
sleepUninterruptibly
(
2
,
TimeUnit
.
SECONDS
);
lb
.
updateListOfServers
();
List
<
Server
>
filtered
=
lb
.
getAllServers
();
// first filtering, should get 5 servers
...
...
ribbon-loadbalancer/src/test/java/com/netflix/loadbalancer/ZoneAwareLoadBalancerTest.java
浏览文件 @
3275c24d
...
...
@@ -32,6 +32,8 @@ import java.util.List;
import
java.util.Map
;
import
java.util.Set
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
org.junit.Ignore
;
import
org.junit.Test
;
import
com.netflix.client.ClientFactory
;
...
...
@@ -68,13 +70,17 @@ public class ZoneAwareLoadBalancerTest {
@Test
@Ignore
public
void
testChooseZone
()
throws
Exception
{
ConfigurationManager
.
getConfigInstance
().
setProperty
(
"niws.loadbalancer.serverStats.activeRequestsCount.effectiveWindowSeconds"
,
10
);
DefaultClientConfigImpl
config
=
new
DefaultClientConfigImpl
();
ZoneAwareLoadBalancer
<
Server
>
balancer
=
new
ZoneAwareLoadBalancer
<
Server
>();
balancer
.
init
();
IRule
globalRule
=
new
RoundRobinRule
();
balancer
.
setRule
(
globalRule
);
LoadBalancerStats
loadBalancerStats
=
balancer
.
getLoadBalancerStats
();
loadBalancerStats
.
initWithNiwsConfig
(
config
);
assertNotNull
(
loadBalancerStats
);
List
<
Server
>
servers
=
new
ArrayList
<
Server
>();
...
...
ribbon-loadbalancer/src/test/resources/log4j.properties
0 → 100644
浏览文件 @
3275c24d
log4j.rootCategory
=
INFO,stdout
log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=
%d %-5p %C:%L [%t] [%M] %m%n
ribbon-transport/build.gradle
浏览文件 @
3275c24d
...
...
@@ -7,12 +7,12 @@ dependencies {
compile
"io.reactivex:rxnetty-contexts:${rx_netty_version}"
compile
"io.reactivex:rxnetty-servo:${rx_netty_version}"
compile
'javax.inject:javax.inject:1'
compile
'org.slf4j:slf4j-api:1.6.4'
compile
"org.slf4j:slf4j-api:${slf4j_version}"
compile
"com.google.guava:guava:${guava_version}"
compile
"com.netflix.archaius:archaius-core:${archaius_version}"
testCompile
'junit:junit:4.11'
testCompile
"com.sun.jersey:jersey-server:${jersey_version}"
testCompile
'com.google.mockwebserver:mockwebserver:20130706'
testCompile
project
(
':ribbon-eureka'
)
testCompile
project
(
':ribbon-test'
)
testCompile
project
(
':ribbon-archaius'
)
}
ribbon-transport/src/test/resources/log4j.properties
0 → 100644
浏览文件 @
3275c24d
log4j.rootCategory
=
INFO,stdout
log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=
%d %-5p %C:%L [%t] [%M] %m%n
ribbon/build.gradle
浏览文件 @
3275c24d
...
...
@@ -22,7 +22,7 @@ dependencies {
testCompile
"junit:junit:${junit_version}"
testCompile
"org.powermock:powermock-easymock-release-full:${powermock_version}"
testCompile
"org.easymock:easymock:${easymock_version}"
testCompile
'org.slf4j:slf4j-log4j12:1.7.2'
testCompile
"org.slf4j:slf4j-log4j12:${slf4j_version}"
testCompile
project
(
':ribbon-eureka'
)
testCompile
project
(
':ribbon-test'
)
testCompile
'com.google.mockwebserver:mockwebserver:20130706'
...
...
ribbon/src/main/java/com/netflix/ribbon/ClientOptions.java
浏览文件 @
3275c24d
...
...
@@ -32,7 +32,7 @@ public final class ClientOptions {
private
Map
<
IClientConfigKey
<?>,
Object
>
options
;
private
ClientOptions
()
{
options
=
new
ConcurrentHashMap
<
IClientConfigKey
<?>,
Object
>();
options
=
new
ConcurrentHashMap
<>();
}
public
static
ClientOptions
create
()
{
...
...
ribbon/src/test/resources/log4j.properties
0 → 100644
浏览文件 @
3275c24d
log4j.rootCategory
=
INFO,stdout
log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=
%d %-5p %C:%L [%t] [%M] %m%n
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录