项目场景:
最近在与电信做交维的时候, 由于一些原因, 项目挂了. 然后甲方爸爸让我们这边负责追查问题并且解决 (ps: 好想做回甲方爸爸~~)
问题描述:
遇事不决, 重启大法好. 首先先祭出公司祖传的运维文档, 然后把项目重新启动...一顿操作下去, 发现我们的这个基于Dubbo SSM的项目还是嗝屁了...启动依然报错,consumer项目日志如下(草! 一种植物)
代码语言:javascript复制Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method saveProject in the service
com.clife.ctcc.iot.service.h5.interfaces.h5edit.AppUiDesignService. No provider available for the service
com.clife.ctcc.iot.service.h5.interfaces.h5edit.AppUiDesignService from registry zk.open.clife.com:2181 on the consumer 192.168.232.xx using
the dubbo version 2.5.3. Please check if the providers have been started and registered.
at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:246) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:55) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.common.bytecode.proxy1.saveProject(proxy1.java) ~[na:2.5.3]
at com.clife.ctcc.iot.api.h5.controller.web.H5EditController.saveProject(H5EditController.java:337) ~[H5EditController.class:na]
... 45 common frames omitted
原因分析:
前提: 确认配置文件没有改动(已确认), 配置文件的改动很容易就会导致项目重启失败! 因为该项目是基于Dubbo, 所以我们首先确认dubbo中哪些节点可用.(全部可用,部分可用还是全部不可用) 1.进入zookeeper的cli, 找到对应服务注册的地方, 查看是否有服务提供者与服务消费者的信息.如下图
2. 经过多次查看,发现h5项目的服务消费者接口注册了, 服务提供者项目没有注册. 而另一个module项目启动则无问题, 消费者和提供者接口都注册了 3. 经过上一步确认, 可以发现已经确认是h5项目的问题, 那么我们需要到这个项目对应的日志下,查看项目的日志信息
4. 根据上面的日志信息, 找到关键内容 Could not autowire field: private com.clife.ctcc.iot.service.h5.utils.FileUploadUtil com.clife.ctcc.iot.business.h5.service.h5edit.AppPanelTemplateServiceImpl.fileuploadutil
解决方案:
- 上面出现Could not autowire field, 说明在代码中已经将FileUploadUtil注入了(但注入是有问题的)
- 在代码中找到这个类被那个类锁注入(ctrl shift f),如下图
- 可以发现,这种写法是有问题的, 因为你本来就已经导包了, 可以直接引用了, 但是你又在spring容器中去注入.而且在h5的项目中又找不到这个文件上传的工具类( 因为他被存放到底层的service项目中了,打包后不在一个jar下面的类无法被直接注入!!! )
- 基于如上分析,将注解@Autowired去掉, 打包上传重启一条龙即可~~~ 重启后,发现zk下面项目的服务提供者就注册好了, 一旦能够注册好就说明可以被服务消费者调用了
- 果不其然,去h5项目下查看日志, 发现日志中无异常. 向甲方爸爸报告以后, 也没木得问题了
反思:
在遇到Dubbo项目启动异常后, 必须确认配置文件是否改动, 如果改动了需要分析改动是否合理 确认没有改动后就要去zk确认哪些项目的提供者接口或者消费者接口出现问题, 然后去出现异常的项目中去认真分析启动日志(不要太过依赖百度!!!), 根据日志确认项目的问题. 最后进行相关改动然后,打包上传重启一条龙就OVER啦~~~
ps: 如果你也有交维的经验, 你可能会有一个疑问, 为什么之前提交项目后项目运行没问题, 但是项目挂掉重启就有问题了? 看看下面的图, 相信你就会找到答案
从图上可以看到, 因为之前在19年使用Java用户启动的h5进程没有关闭, 然后今年5.12使用root用户启动的h5进程无论有没有注册到dubbo上, 都不会影响其使用, 因为之前的h5进程一直还在提供服务 ( 勤劳的老代码~ )