Toggle navigation
Toggle navigation
This project
Loading...
Sign in
ops
/
monitor-service
·
Commits
Go to a project
GitLab
Go to group
Project
Activity
Files
Commits
Pipelines
0
Builds
0
Graphs
Milestones
Issues
0
Merge Requests
0
Members
Labels
Wiki
Forks
Network
Create a new issue
Download as
Email Patches
Plain Diff
Browse Files
Authored by
qinchao
7 years ago
Commit
3ae565cd2f7298d10a71551c23044bb88b6db34b
1 parent
e05f0200
nginx切换调整
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
271 additions
and
16 deletions
monitor-service-switch/src/main/java/com/monitor/switchs/NginxSwitchCtrl.java
monitor-service-switch/src/main/java/com/monitor/switchs/NginxSwitchCtrl.java
View file @
3ae565c
...
...
@@ -8,6 +8,7 @@ import com.monitor.mysql.mapper.HostInfoMapper;
import
com.yoho.ops.cmdb.models.LbModel
;
import
com.yoho.ops.cmdb.qcloud.model.*
;
import
com.yoho.ops.cmdb.qcloud.util.QcloudSdkUtil
;
import
lombok.Data
;
import
org.apache.commons.collections.CollectionUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.slf4j.Logger
;
...
...
@@ -35,6 +36,8 @@ public class NginxSwitchCtrl {
private
Logger
logger
=
LoggerFactory
.
getLogger
(
"switchLogger"
);
private
long
sleepTime
=
10
*
1000L
;
@Value
(
"${system.envi}"
)
private
String
env
;
...
...
@@ -42,6 +45,271 @@ public class NginxSwitchCtrl {
HostInfoMapper
hostInfoMapper
;
/**
* 切换lb的权重
* cloudName 源lb
* target 目标nginx
*/
@RequestMapping
(
value
=
"switchLbWeight"
)
@ResponseBody
public
BaseResponse
switchLbWeight
(
String
cloudName
,
String
target
)
{
List
<
LbModel
>
lbList
=
getJavaLb
().
stream
().
filter
(
p
->
StringUtils
.
equals
(
p
.
getAzTag
(),
cloudName
)).
collect
(
Collectors
.
toList
());
if
(
lbList
==
null
||
lbList
.
size
()<=
0
){
return
new
BaseResponse
(
201
,
"源lb为空,请检测参数:"
+
cloudName
);
}
Map
<
String
,
String
>
innerListenerMap
=
getLbListerner
(
true
);
Map
<
String
,
String
>
outerListenerMap
=
getLbListerner
(
false
);
for
(
LbModel
lb:
lbList
){
if
(
lb
.
isClbFlag
()){
switchClb
(
target
,
lb
);
}
else
{
Map
<
String
,
String
>
listenerMap
=
outerListenerMap
;
if
(
lb
.
isInnerFlag
())
{
listenerMap
=
innerListenerMap
;
}
QcloudForwardLbModel
forwardLbModel
=
getAlbFromQcloud
(
lb
);
if
(
forwardLbModel
==
null
)
{
return
new
BaseResponse
(
201
,
"获取alb信息出现异常,切换失败:"
+
lb
.
getKey
());
}
List
<
AlbModelClass
>
dealAlb
=
new
ArrayList
<>();
for
(
String
protoTypeAndPort
:
listenerMap
.
keySet
())
{
AlbModelClass
albModelClass
=
new
AlbModelClass
();
String
[]
protoAndPortArray
=
protoTypeAndPort
.
split
(
","
);
String
protocolType
=
protoAndPortArray
[
0
];
int
port
=
Integer
.
parseInt
(
protoAndPortArray
[
1
]);
String
domain
=
listenerMap
.
get
(
protoTypeAndPort
);
List
<
String
>
locationIdList
=
new
ArrayList
<>();
for
(
QcloudForwardLbModelData
data
:
forwardLbModel
.
getData
())
{
if
(
StringUtils
.
equals
(
protocolType
,
data
.
getProtocolType
())
&&
port
==
data
.
getLoadBalancerPort
())
{
String
listenerId
=
data
.
getListenerId
();
for
(
QcloudForwardLbModelDataRule
rule
:
data
.
getRules
())
{
if
(
StringUtils
.
equals
(
domain
,
rule
.
getDomain
()))
{
locationIdList
.
add
(
rule
.
getLocationId
());
List
<
List
<
QcloudLbModelBackend
>>
ls
=
getNeedChangedWei
(
rule
.
getBackends
(),
target
);
List
<
QcloudLbModelBackend
>
needAddWeight
=
ls
.
get
(
0
);
List
<
QcloudLbModelBackend
>
needRemoveWeight
=
ls
.
get
(
1
);
albModelClass
.
setListenerId
(
listenerId
);
albModelClass
.
setLocationIdList
(
locationIdList
);
albModelClass
.
setNeedAddWeight
(
needAddWeight
);
albModelClass
.
setNeedRemoveWeight
(
needRemoveWeight
);
dealAlb
.
add
(
albModelClass
);
}
}
}
}
}
for
(
AlbModelClass
albModelClass
:
dealAlb
)
{
//操作weight,
List
<
QcloudLbModelBackend
>
needAddWeight
=
albModelClass
.
getNeedAddWeight
();
if
(
needAddWeight
.
size
()
>
0
)
{
List
<
String
>
unInstanceIdList
=
new
ArrayList
<>();
List
<
Integer
>
weightList
=
new
ArrayList
<>();
List
<
Integer
>
portList
=
new
ArrayList
<>();
for
(
QcloudLbModelBackend
backend
:
needAddWeight
)
{
unInstanceIdList
.
add
(
backend
.
getUnInstanceId
());
weightList
.
add
(
10
);
portList
.
add
(
backend
.
getPort
());
}
//alb 切换权重
QcloudSdkUtil
.
modifyForwardSeventhBackends
(
lb
.
getLbId
(),
albModelClass
.
getListenerId
(),
albModelClass
.
getLocationIdList
(),
unInstanceIdList
,
portList
,
weightList
);
try
{
// 括号内的参数是毫秒值,线程休眠
Thread
.
sleep
(
sleepTime
);
//10s
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
boolean
recheckFlag
=
false
;
for
(
AlbModelClass
albModelClass
:
dealAlb
)
{
List
<
QcloudLbModelBackend
>
needRemoveWeight
=
albModelClass
.
getNeedRemoveWeight
();
if
(
needRemoveWeight
.
size
()
>
0
)
{
recheckFlag
=
true
;
break
;
}
}
if
(
recheckFlag
)
{
//切掉流量之前需要校验
QcloudForwardLbModel
checkBeforeMoveBackends
=
getAlbFromQcloud
(
lb
);
boolean
checkPass
=
false
;
for
(
QcloudForwardLbModelData
flbModel
:
checkBeforeMoveBackends
.
getData
())
{
for
(
AlbModelClass
albModelClass
:
dealAlb
)
{
if
(
StringUtils
.
equals
(
flbModel
.
getListenerId
(),
albModelClass
.
getListenerId
()))
{
List
<
String
>
unInstanceIdList
=
new
ArrayList
<>();
List
<
Integer
>
weightList
=
new
ArrayList
<>();
List
<
Integer
>
portList
=
new
ArrayList
<>();
for
(
QcloudLbModelBackend
backend
:
albModelClass
.
getNeedRemoveWeight
())
{
unInstanceIdList
.
add
(
backend
.
getUnInstanceId
());
weightList
.
add
(
0
);
portList
.
add
(
backend
.
getPort
());
}
for
(
QcloudForwardLbModelDataRule
rule
:
flbModel
.
getRules
())
{
if
(
albModelClass
.
getLocationIdList
().
contains
(
rule
.
getLocationId
()))
{
for
(
QcloudLbModelBackend
backend
:
rule
.
getBackends
())
{
if
(
backend
.
getWeight
()
>
0
&&
!
unInstanceIdList
.
contains
(
backend
.
getUnInstanceId
()))
{
checkPass
=
true
;
break
;
}
}
}
}
if
(
checkPass
)
{
//alb 切换权重
QcloudSdkUtil
.
modifyForwardSeventhBackends
(
lb
.
getLbId
(),
albModelClass
.
getListenerId
(),
albModelClass
.
getLocationIdList
(),
unInstanceIdList
,
portList
,
weightList
);
try
{
// 括号内的参数是毫秒值,线程休眠
Thread
.
sleep
(
sleepTime
);
//10s
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
}
}
}
}
}
return
new
BaseResponse
();
}
private
BaseResponse
switchClb
(
String
target
,
LbModel
lb
){
QcloudCLBModel
clbModel
=
getCLbFromQcloud
(
lb
);
if
(
clbModel
==
null
){
return
new
BaseResponse
(
201
,
"获取lb信息出现异常,切换失败lb "
+
lb
.
getKey
());
}
List
<
List
<
QcloudLbModelBackend
>>
ls
=
getNeedChangedWei
(
clbModel
.
getBackendSet
(),
target
);
List
<
QcloudLbModelBackend
>
needAddWeight
=
ls
.
get
(
0
);
List
<
QcloudLbModelBackend
>
needRemoveWeight
=
ls
.
get
(
1
);
//操作weight,
if
(
needAddWeight
.
size
()>
0
){
List
<
String
>
unInstanceIdList
=
new
ArrayList
<>();
List
<
Integer
>
weightList
=
new
ArrayList
<>();
for
(
QcloudLbModelBackend
backend:
needAddWeight
){
unInstanceIdList
.
add
(
backend
.
getUnInstanceId
());
weightList
.
add
(
10
);
}
//clb 切换权重
QcloudSdkUtil
.
modifyLoadBalancerBackends
(
lb
.
getLbId
(),
unInstanceIdList
,
weightList
);
try
{
// 括号内的参数是毫秒值,线程休眠
Thread
.
sleep
(
sleepTime
);
//10s
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
//移除之前一定检测一次,保证移除后,至少还有另外一个
if
(
needRemoveWeight
.
size
()>
0
){
List
<
String
>
unInstanceIdList
=
new
ArrayList
<>();
List
<
Integer
>
weightList
=
new
ArrayList
<>();
for
(
QcloudLbModelBackend
backend:
needRemoveWeight
){
unInstanceIdList
.
add
(
backend
.
getUnInstanceId
());
weightList
.
add
(
0
);
}
QcloudCLBModel
checkBeforeMoveBackends
=
getCLbFromQcloud
(
lb
);
boolean
checkPass
=
false
;
for
(
QcloudLbModelBackend
backend:
checkBeforeMoveBackends
.
getBackendSet
()){
if
(
backend
.
getWeight
()>
0
&&!
unInstanceIdList
.
contains
(
backend
.
getUnInstanceId
())){
checkPass
=
true
;
break
;
}
}
if
(
checkPass
){
//clb 切换权重
QcloudSdkUtil
.
modifyLoadBalancerBackends
(
lb
.
getLbId
(),
unInstanceIdList
,
weightList
);
try
{
// 括号内的参数是毫秒值,线程休眠
Thread
.
sleep
(
sleepTime
*
2
);
//20s
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
return
new
BaseResponse
();
}
private
List
<
List
<
QcloudLbModelBackend
>>
getNeedChangedWei
(
List
<
QcloudLbModelBackend
>
backendList
,
String
target
){
List
<
QcloudLbModelBackend
>
needAddWeight
=
new
ArrayList
<>();
List
<
QcloudLbModelBackend
>
needRemoveWeight
=
new
ArrayList
<>();
for
(
QcloudLbModelBackend
backend:
backendList
){
if
(
backend
.
getInstanceName
().
indexOf
(
target
)>=
0
){
if
(
backend
.
getWeight
()<=
0
){
needAddWeight
.
add
(
backend
);
}
}
else
{
if
(
backend
.
getWeight
()>
0
){
needRemoveWeight
.
add
(
backend
);
}
}
}
List
<
List
<
QcloudLbModelBackend
>>
ls
=
new
ArrayList
<>();
ls
.
add
(
needAddWeight
);
ls
.
add
(
needRemoveWeight
);
return
ls
;
}
@Data
private
class
AlbModelClass
{
String
listenerId
;
List
<
String
>
locationIdList
;
List
<
QcloudLbModelBackend
>
needAddWeight
;
List
<
QcloudLbModelBackend
>
needRemoveWeight
;
}
private
QcloudCLBModel
getCLbFromQcloud
(
LbModel
lb
){
QcloudCLBModel
tmp
=
null
;
for
(
int
i
=
0
;
i
<
3
;
i
++){
tmp
=
QcloudSdkUtil
.
describeLoadBalancerBackends
(
lb
.
getLbId
());
if
(
tmp
!=
null
){
break
;
}
}
if
(
tmp
==
null
){
return
null
;
}
return
tmp
;
}
private
QcloudForwardLbModel
getAlbFromQcloud
(
LbModel
lb
){
QcloudForwardLbModel
tmp
=
null
;
for
(
int
i
=
0
;
i
<
3
;
i
++){
tmp
=
QcloudSdkUtil
.
describeForwardLBBackends
(
lb
.
getLbId
());
if
(
tmp
!=
null
){
break
;
}
}
if
(
tmp
==
null
){
return
null
;
}
return
tmp
;
}
/**
* 查看nginx配置
*
* @return 2016年5月12日下午1:49:48
...
...
@@ -85,13 +353,7 @@ public class NginxSwitchCtrl {
for
(
LbModel
lb:
lbList
){
if
(
lb
.
isClbFlag
()){
QcloudCLBModel
tmp
=
null
;
for
(
int
i
=
0
;
i
<
3
;
i
++){
tmp
=
QcloudSdkUtil
.
describeLoadBalancerBackends
(
lb
.
getLbId
());
if
(
tmp
!=
null
){
break
;
}
}
QcloudCLBModel
tmp
=
getCLbFromQcloud
(
lb
);
if
(
tmp
==
null
){
return
new
BaseResponse
(
201
,
"请求lb信息error,lb:"
+
lb
.
getLbId
());
}
...
...
@@ -105,13 +367,7 @@ public class NginxSwitchCtrl {
lbMap
.
put
(
lb
.
getKey
(),
ipInWeight
);
}
else
{
QcloudForwardLbModel
tmp
=
null
;
for
(
int
i
=
0
;
i
<
3
;
i
++){
tmp
=
QcloudSdkUtil
.
describeForwardLBBackends
(
lb
.
getLbId
());
if
(
tmp
!=
null
){
break
;
}
}
QcloudForwardLbModel
tmp
=
getAlbFromQcloud
(
lb
);
if
(
tmp
==
null
){
return
new
BaseResponse
(
201
,
"请求lb信息error,lb:"
+
lb
.
getLbId
());
}
...
...
@@ -139,7 +395,6 @@ public class NginxSwitchCtrl {
}
addJavaNgingList
(
backend
,
java_nginx_az1
,
java_nginx_az2
,
java_nginx_az3
);
}
break
;
}
}
}
...
...
@@ -150,7 +405,7 @@ public class NginxSwitchCtrl {
}
else
{
//如果两次的不一致,需要提示出来
if
(!
CollectionUtils
.
isEqualCollection
((
Set
<
String
>)
lbMap
.
get
(
lb
.
getKey
()),
ipInWeight
)){
return
new
BaseResponse
(
201
,
"负载均衡protocol指定主机数量不一致,lb
:"
+
lb
.
getLbId
()
);
return
new
BaseResponse
(
201
,
"负载均衡protocol指定主机数量不一致,lb
->"
+
lb
.
getLbId
()+
":"
+
protoTypeAndPort
);
}
}
times
++;
...
...
Please
register
or
login
to post a comment