一 背景:
业务server对外提供dubbo接口,每次升级重启部署都不平滑,因为停止脚本是stop.sh包含了kill -9,所以就是直接报错了。
二参照公司wiki:
1升级jar:
原来是dubbox,现在升级为公司自有dubbo版本:
升级daojia自有dubbo版本3.0.2-SNAPSHOT或以上
2.增加jar:
com.daojia.dubbo
dubbo
3.0.2-SNAPSHOT
直接在web.xml替换spring的
org.springframework.web.context.ContextLoaderListener为
com.daojia.dubbo.plus.core.DubboSpringContainerListener
其他方式的使用spring集成dubbo的项目,请确保在spring容器关闭之前主动调用
3. 替换停止脚本ProtocolConfig.destroyAll();
由于dubbo的优雅停机的超时时间为10秒,所以检查tomcat服务在指定waitTime 应大于这个dubbo的timeout时间,使得dubbo能够有机会执行关闭,
目前这边的配置tomcat超时kill -9 的waitTime为15秒。另外在提供方发布的时候建议折半发布,这样可以保证消费可以重试别的provider
注意:如果在provider停服的过程中出现如下异常,且先check消费方是否请求正常,如正常请忽略本次异常
stop.sh脚本如下:com.alibaba.dubbo.remoting.RemotingException: Failed to send message Response
#!/bin/sh
TOMCAT_HOME=/opt/soft/tomcat
echo $(cd "$(dirname $0)"; pwd)
CATALINA_BASE=$(cd "$(dirname $0)"; pwd)
CATALINA_PID=$CATALINA_BASE/tomcat.pid
JAVA_HOME=/opt/soft/java
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$PATH:$JAVA_HOME/bin
export TOMCAT_HOME CATALINA_BASE CATALINA_PID JAVA_HOME CLASSPATH PATH JAVA_OPTS WF_USPCLUSTER
proj_dir=`basename $CATALINA_BASE`
/opt/soft/tomcat/bin/catalina.sh stop
sleep 5
if [[ -n "$proj_dir" ]]
then
for i in {1..15}; do
ps aux | grep "$proj_dir/t" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" > /dev/null
status=$?
if [[ $status -eq 0 ]]
then
echo "kill it"
ps aux |grep "$proj_dir/t" | grep -v "release_version" | grep "$proj_dir/t" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" | awk '{print $2}' | xargs -i kill {}
> $CATALINA_PID
sleep 1
fi
done;
else
ps aux |grep "$proj_dir/t" | grep -v "release_version" | grep "$proj_dir/t" | grep -v "grep" | grep -v "$CATALINA_BASE/\(start.sh\|stop.sh\|restart.sh\|logs/catalina.out\)" | awk '{print $2}' | xargs -i kill -9 {}
echo "stop failt!!! kill -9"
exit 1
fi
No such extension monitorx for filter/com.alibaba.dubbo.rpc.Filter
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'filter' threw exception; nested exception is java.lang.IllegalStateException: No such extension monitorx for filter/com.alibaba.dubbo.rpc.Filter
网上有需要filter的,就在配置文件增加,我们现在的监控都集中了,所以一切的filter就去了。
把spring-dubbo.xml去掉:
OK,启动正常了。
总结:
就是两块,一是服务能安全停止,而是期间不再分配新请求。
所以类似于nginx,平滑部署时,先去掉nginx请求连接,再停服务,等服务起来了,再挂上nginx连接。