Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
thythm
ribbon
提交
1c3e164c
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,体验更适合开发者的 AI 搜索 >>
提交
1c3e164c
编写于
4月 24, 2014
作者:
A
Allen Wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added new API in LoadBalancerBuilder to build from Archaius configuration using reflection.
上级
bccaafdd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
142 addition
and
4 deletion
+142
-4
ribbon-eureka/src/test/java/com/netflix/niws/loadbalancer/LBBuilderTest.java
...est/java/com/netflix/niws/loadbalancer/LBBuilderTest.java
+126
-4
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerBuilder.java
...in/java/com/netflix/loadbalancer/LoadBalancerBuilder.java
+16
-0
未找到文件。
ribbon-eureka/src/test/java/com/netflix/niws/loadbalancer/LBBuilderTest.java
浏览文件 @
1c3e164c
package
com.netflix.niws.loadbalancer
;
import
static
org
.
easymock
.
EasyMock
.
expect
;
import
static
org
.
junit
.
Assert
.*;
import
static
org
.
powermock
.
api
.
easymock
.
PowerMock
.
createMock
;
import
static
org
.
powermock
.
api
.
easymock
.
PowerMock
.
replay
;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.apache.commons.configuration.Configuration
;
import
org.easymock.EasyMock
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.powermock.api.easymock.PowerMock
;
import
org.powermock.core.classloader.annotations.PowerMockIgnore
;
import
org.powermock.core.classloader.annotations.PrepareForTest
;
import
org.powermock.modules.junit4.PowerMockRunner
;
import
com.google.common.collect.Lists
;
import
com.netflix.appinfo.InstanceInfo
;
import
com.netflix.client.config.ClientConfigBuilder
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.client.config.IClientConfigKey.CommonKeys
;
import
com.netflix.config.ConfigurationManager
;
import
com.netflix.discovery.DiscoveryClient
;
import
com.netflix.discovery.DiscoveryManager
;
import
com.netflix.loadbalancer.AvailabilityFilteringRule
;
import
com.netflix.loadbalancer.BaseLoadBalancer
;
import
com.netflix.loadbalancer.DummyPing
;
import
com.netflix.loadbalancer.DynamicServerListLoadBalancer
;
import
com.netflix.loadbalancer.ILoadBalancer
;
import
com.netflix.loadbalancer.IRule
;
import
com.netflix.loadbalancer.LoadBalancerBuilder
;
import
com.netflix.loadbalancer.RoundRobinRule
;
import
com.netflix.loadbalancer.Server
;
import
com.netflix.loadbalancer.ServerList
;
import
com.netflix.loadbalancer.ServerListFilter
;
import
com.netflix.loadbalancer.ZoneAffinityServerListFilter
;
import
com.netflix.loadbalancer.ZoneAwareLoadBalancer
;
@RunWith
(
PowerMockRunner
.
class
)
@PrepareForTest
(
{
DiscoveryManager
.
class
,
DiscoveryClient
.
class
}
)
@PowerMockIgnore
({
"javax.management.*"
,
"com.sun.jersey.*"
,
"com.sun.*"
,
"org.apache.*"
,
"weblogic.*"
,
"com.netflix.config.*"
,
"com.sun.jndi.dns.*"
,
"javax.naming.*"
,
"com.netflix.logging.*"
,
"javax.ws.*"
})
public
class
LBBuilderTest
{
static
Server
expected
=
new
Server
(
"www.example.com"
,
8001
);
static
List
<
InstanceInfo
>
getDummyInstanceInfo
(
String
appName
,
String
host
,
int
port
){
List
<
InstanceInfo
>
list
=
new
ArrayList
<
InstanceInfo
>();
InstanceInfo
info
=
InstanceInfo
.
Builder
.
newBuilder
().
setAppName
(
appName
)
.
setHostName
(
host
)
.
setPort
(
port
)
.
build
();
list
.
add
(
info
);
return
list
;
}
static
class
NiwsClientConfig
extends
DefaultClientConfigImpl
{
public
NiwsClientConfig
()
{
super
();
}
@Override
public
String
getNameSpace
()
{
return
"niws.client"
;
}
}
@Before
public
void
setupMock
(){
List
<
InstanceInfo
>
instances
=
getDummyInstanceInfo
(
"dummy"
,
expected
.
getHost
(),
expected
.
getPort
());
PowerMock
.
mockStatic
(
DiscoveryManager
.
class
);
PowerMock
.
mockStatic
(
DiscoveryClient
.
class
);
DiscoveryClient
mockedDiscoveryClient
=
createMock
(
DiscoveryClient
.
class
);
DiscoveryManager
mockedDiscoveryManager
=
createMock
(
DiscoveryManager
.
class
);
expect
(
DiscoveryClient
.
getZone
((
InstanceInfo
)
EasyMock
.
anyObject
())).
andReturn
(
"dummyZone"
).
anyTimes
();
expect
(
DiscoveryManager
.
getInstance
()).
andReturn
(
mockedDiscoveryManager
).
anyTimes
();
expect
(
mockedDiscoveryManager
.
getDiscoveryClient
()).
andReturn
(
mockedDiscoveryClient
).
anyTimes
();
expect
(
mockedDiscoveryClient
.
getInstancesByVipAddress
(
"dummy:7001"
,
false
,
null
)).
andReturn
(
instances
).
anyTimes
();
replay
(
DiscoveryManager
.
class
);
replay
(
DiscoveryClient
.
class
);
replay
(
mockedDiscoveryManager
);
replay
(
mockedDiscoveryClient
);
}
@Test
public
void
testBuilder
()
{
public
void
testBuildWithDiscoveryEnabledNIWSServerList
()
{
IRule
rule
=
new
AvailabilityFilteringRule
();
ServerList
<
DiscoveryEnabledServer
>
list
=
new
DiscoveryEnabledNIWSServerList
(
"dummy:7001"
);
ServerListFilter
<
DiscoveryEnabledServer
>
filter
=
new
ZoneAffinityServerListFilter
<
DiscoveryEnabledServer
>();
ZoneAwareLoadBalancer
<
DiscoveryEnabledServer
>
lb
=
LoadBalancerBuilder
.<
DiscoveryEnabledServer
>
newBuilder
()
.
withDynamicServerList
(
new
DiscoveryEnabledNIWSServerList
()
)
.
withRule
(
new
AvailabilityFilteringRule
()
)
.
withServerListFilter
(
new
ZoneAffinityServerListFilter
<
DiscoveryEnabledServer
>()
)
.
withDynamicServerList
(
list
)
.
withRule
(
rule
)
.
withServerListFilter
(
filter
)
.
buildDynamicServerListLoadBalancer
();
assertNotNull
(
lb
);
assertEquals
(
Lists
.
newArrayList
(
expected
),
lb
.
getServerList
(
false
));
assertSame
(
filter
,
lb
.
getFilter
());
assertSame
(
list
,
lb
.
getServerListImpl
());
}
@Test
public
void
testBuildWithArchaiusProperties
()
{
Configuration
config
=
ConfigurationManager
.
getConfigInstance
();
config
.
setProperty
(
"client1.niws.client."
+
CommonKeys
.
DeploymentContextBasedVipAddresses
,
"dummy:7001"
);
config
.
setProperty
(
"client1.niws.client."
+
CommonKeys
.
InitializeNFLoadBalancer
,
"true"
);
config
.
setProperty
(
"client1.niws.client."
+
CommonKeys
.
NFLoadBalancerClassName
,
DynamicServerListLoadBalancer
.
class
.
getName
());
config
.
setProperty
(
"client1.niws.client."
+
CommonKeys
.
NFLoadBalancerRuleClassName
,
RoundRobinRule
.
class
.
getName
());
config
.
setProperty
(
"client1.niws.client."
+
CommonKeys
.
NIWSServerListClassName
,
DiscoveryEnabledNIWSServerList
.
class
.
getName
());
config
.
setProperty
(
"client1.niws.client."
+
CommonKeys
.
NIWSServerListFilterClassName
,
ZoneAffinityServerListFilter
.
class
.
getName
());
IClientConfig
clientConfig
=
ClientConfigBuilder
.
newBuilderWithArchaiusProperties
(
NiwsClientConfig
.
class
,
"client1"
).
build
();
ILoadBalancer
lb
=
LoadBalancerBuilder
.
newBuilder
().
withClientConfig
(
clientConfig
).
buildLoadBalancerFromConfigWithReflection
();
assertNotNull
(
lb
);
assertEquals
(
DynamicServerListLoadBalancer
.
class
.
getName
(),
lb
.
getClass
().
getName
());
DynamicServerListLoadBalancer
<
Server
>
dynamicLB
=
(
DynamicServerListLoadBalancer
<
Server
>)
lb
;
assertTrue
(
dynamicLB
.
getFilter
()
instanceof
ZoneAffinityServerListFilter
);
assertTrue
(
dynamicLB
.
getRule
()
instanceof
RoundRobinRule
);
assertTrue
(
dynamicLB
.
getPing
()
instanceof
DummyPing
);
assertEquals
(
Lists
.
newArrayList
(
expected
),
lb
.
getServerList
(
false
));
}
@Test
public
void
testBuildStaticServerListLoadBalancer
()
{
List
<
Server
>
list
=
Lists
.
newArrayList
(
expected
,
expected
);
IRule
rule
=
new
AvailabilityFilteringRule
();
IClientConfig
clientConfig
=
ClientConfigBuilder
.
newBuilderWithDefaultConfigValues
()
.
withMaxAutoRetriesNextServer
(
3
).
build
();
assertEquals
(
3
,
clientConfig
.
getPropertyWithType
(
CommonKeys
.
MaxAutoRetriesNextServer
).
intValue
());
BaseLoadBalancer
lb
=
LoadBalancerBuilder
.
newBuilder
()
.
withRule
(
rule
)
.
buildFixedServerListLoadBalancer
(
list
);
assertEquals
(
list
,
lb
.
getServerList
(
false
));
assertSame
(
rule
,
lb
.
getRule
());
}
}
ribbon-loadbalancer/src/main/java/com/netflix/loadbalancer/LoadBalancerBuilder.java
浏览文件 @
1c3e164c
...
...
@@ -2,7 +2,9 @@ package com.netflix.loadbalancer;
import
java.util.List
;
import
com.netflix.client.ClientFactory
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.CommonClientConfigKey
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
com.netflix.client.config.IClientConfig
;
...
...
@@ -84,6 +86,20 @@ public class LoadBalancerBuilder<T extends Server> {
return
new
ZoneAwareLoadBalancer
<
T
>(
config
,
rule
,
ping
,
serverListImpl
,
serverListFilter
);
}
public
ILoadBalancer
buildLoadBalancerFromConfigWithReflection
()
{
String
loadBalancerClassName
=
config
.
getPropertyWithType
(
CommonClientConfigKey
.
NFLoadBalancerClassName
);
if
(
loadBalancerClassName
==
null
)
{
throw
new
IllegalArgumentException
(
"NFLoadBalancerClassName is not specified in the IClientConfig"
);
}
ILoadBalancer
lb
;
try
{
lb
=
(
ILoadBalancer
)
ClientFactory
.
instantiateInstanceWithClientConfig
(
loadBalancerClassName
,
config
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
return
lb
;
}
public
LoadBalancerExecutor
buildDynamicServerListLoadBalancerExecutor
()
{
ZoneAwareLoadBalancer
<
T
>
lb
=
buildDynamicServerListLoadBalancer
();
LoadBalancerExecutor
executor
=
new
LoadBalancerExecutor
(
lb
,
config
,
errorHandler
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录