1、問題描述:在使用SpringMVC+dubbo+zk+cas搭建微服務項目時,假設項目中有A+B兩個服務提供者,有一個web項目。web項目調用B服務,B服務再調用A服務,但是程序一直提示A服務控制針異常。NullPointerException
2、問題分析:這里分析一下原因。A B服務此時都是服務的提供者,B是A服務的提供者,他們都是注冊到dubbo上的。所以項目發布的時候,無法判斷是哪個服務先注冊到dubbo上的。而且都是使用dubbo的方式注入,極有可能產生注入服務為Null的情況。
聯想到spring中有循環依賴的問題,所以spring框架會提供三級緩存來解決循環依賴,其中涉及到代理類,切面。。等等邏輯
3、解決辦法:首先先排除@Reference注釋引用錯【容易有人引用成org.springframework.data.annotation】,正確應該是【import com.alibaba.dubbo.config.annotation.Reference;】;
排除@Service注釋引用錯。
確定引起控制針的原因就是上述問題分析。在dubbo官網,提供了 @Reference(lazy = true),即采用懶加載。這樣當服務提供者還沒有啟動的時候,服務消費者會在對象初始化的時候,創建相應的代理對象,不會產生一個null對象,從而解決dubbo提供者消費者不明確引發的NullPointerException
4、詳情可參考:http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html
