Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
discovery
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
谢捷峰
discovery
Commits
3461a7a4
Commit
3461a7a4
authored
May 30, 2019
by
Nepxion
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化和修复随机权重的算法
parent
b9da7639
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
94 additions
and
0 deletions
+94
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/loadbalance/IWeightRandomLoadBalance.java
+25
-0
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/loadbalance/weight/ArrayWeightRandomLoadBalance.java
+69
-0
No files found.
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/loadbalance/IWeightRandomLoadBalance.java
0 → 100644
View file @
3461a7a4
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
loadbalance
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.List
;
import
com.nepxion.discovery.common.entity.WeightFilterEntity
;
import
com.nepxion.discovery.plugin.framework.adapter.PluginAdapter
;
import
com.netflix.loadbalancer.Server
;
public
interface
IWeightRandomLoadBalance
{
void
setPluginAdapter
(
PluginAdapter
pluginAdapter
);
WeightFilterEntity
getWeightFilterEntity
();
Server
choose
(
List
<
Server
>
serverList
,
WeightFilterEntity
weightFilterEntity
);
}
\ No newline at end of file
discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/loadbalance/weight/ArrayWeightRandomLoadBalance.java
0 → 100644
View file @
3461a7a4
package
com
.
nepxion
.
discovery
.
plugin
.
framework
.
loadbalance
.
weight
;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import
java.util.List
;
import
java.util.concurrent.ThreadLocalRandom
;
import
org.apache.commons.collections4.CollectionUtils
;
import
com.nepxion.discovery.common.entity.WeightFilterEntity
;
import
com.netflix.loadbalancer.Server
;
public
class
ArrayWeightRandomLoadBalance
extends
AbstractWeightRandomLoadBalance
{
@Override
public
Server
choose
(
List
<
Server
>
serverList
,
WeightFilterEntity
weightFilterEntity
)
{
if
(
CollectionUtils
.
isEmpty
(
serverList
))
{
return
null
;
}
int
[]
weights
=
new
int
[
serverList
.
size
()];
for
(
int
i
=
0
;
i
<
serverList
.
size
();
i
++)
{
Server
server
=
serverList
.
get
(
i
);
int
weight
=
getWeight
(
server
,
weightFilterEntity
);
if
(
weight
>
0
)
{
weights
[
i
]
=
weight
;
}
}
int
index
=
getIndex
(
weights
);
return
serverList
.
get
(
index
);
}
private
int
getIndex
(
int
[]
weights
)
{
// 次序号/权重区间值
int
[][]
weightHolder
=
new
int
[
weights
.
length
][
2
];
// 总权重
int
totalWeight
=
0
;
// 赋值次序号和区间值累加的数组值,从小到大排列
// 例如,对于权重分别为20,40, 60的三个服务,将形成[0, 20),[20, 60),[60, 120]三个区间
for
(
int
i
=
0
;
i
<
weights
.
length
;
i
++)
{
if
(
weights
[
i
]
<=
0
)
{
continue
;
}
totalWeight
+=
weights
[
i
];
weightHolder
[
i
][
0
]
=
i
;
weightHolder
[
i
][
1
]
=
totalWeight
;
}
// 获取介于0(含)和n(不含)伪随机,均匀分布的int值
int
hitWeight
=
ThreadLocalRandom
.
current
().
nextInt
(
totalWeight
)
+
1
;
// [1, totalWeight)
for
(
int
i
=
0
;
i
<
weightHolder
.
length
;
i
++)
{
if
(
hitWeight
<=
weightHolder
[
i
][
1
])
{
return
weightHolder
[
i
][
0
];
}
}
return
weightHolder
[
0
][
0
];
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment