使用Service描述的服務與springAop衝突導致服務無法暴露
阿新 • • 發佈:2019-01-21
我參與的這個專案架構中採用了dubbo+zookeeper,為了線上排錯方便用到了AOP攔截方法列印日誌.專案是聚合工程,結構如下,當AOP攔截facade層時會出現服務註冊不到dubbo上的情況.
出現這個問題的程式碼結構是:
@Service
public class demoFacadeImpl implements basicFacade{
//業務程式碼
}
原因分析:
這個問題是和平哥一起研究的,平哥在群裡問了別人之後瞭解到已經有人在dubbo的github上提出來這個issues,我們現在使用的是com.alibaba.dubbo.config.annotation.Service標籤修飾該服務,出現這種情況的原因是配置有Spring aop的bean生成了代理物件,com.alibaba.dubbo.config.spring.AnnotationBean 這個類的postProcessAfterInitialization方法的Service service = bean.getClass().getAnnotation(Service.class); 這一行獲取到的是由cglib代理出來的物件,所以無法得到@service 註解,導致服務未暴露.
解決方案:
由於使用的是註解的方式,spring AOP先執行的攔截後註冊,導致服務不能暴露.我們修改了註冊方式,不使用註解的方式,使用了配置檔案的方式,在dubbo的配置檔案中使用bean的方式注入.