1. 程式人生 > >使用註解方式實現Dubbo搭建,解決消費者呼叫接口出現空指標異常以及事務等問題

使用註解方式實現Dubbo搭建,解決消費者呼叫接口出現空指標異常以及事務等問題

 

 

最近接手了一個對之前專案進行重構的任務,使用dubbo+maven進行整合,並且將hibernate全部改成JdbcTemplate。主流還是使用springMVC+spring進行開發。

按照之前經驗,使用xml配置方式,釋出服務到zookeeper,成功執行,但是,我們想做的是使用dubbo的service註解進行釋出,遇到點問題,所以總結一下。

主要問題有三個比較重要的問題:

1.   使用dubbo的com.alibaba.dubbo.config.annotation.Service註解來注入服務提供者;

2.   使用@Reference來註冊消費者時,呼叫服務時出現空指標異常;

3.   使用com.alibaba.dubbo.config.annotation.Service導致事務失效;

第一個問題解決方案

在spring的xml檔案中配置如下即可,

<!-- 提供方應用資訊,用於計算依賴關係 -->

    <dubbo:applicationname="${zookeeper.name}"/>

    <!-- 使用zookeeper註冊中心暴露服務地址 -->

    <dubbo:registryprotocol="zookeeper"address="${zookeeper.address}"/>

    <!-- 用dubbo協議在20880埠暴露服務 -->

    <dubbo:protocolname="dubbo"port="${zookeeper.port}"/>

    <!-- 宣告需要暴露的服務介面 <dubbo:serviceinterface="com.cxb.uc.test.ITestService2"

       ref="testService2Impl" />-->

    <!-- 使用註解方式暴露介面 -->

<dubbo:annotationpackage="com.cxb.uc"/>

配置檔案大同小異,都是這樣,基本沒什麼問題,但是在使用@Service註解時出現了一個奇怪的問題,使用DubboAdmin時,全部都是代理物件的名字,一堆proxy。最後在如下解決:

@Service(interfaceName="com.test.ITestService")

直接使用iterfaceName命名服務名。

到此第一個問題告一段落。

第一個問題解決好後,便覺的沒什麼其他問題了。

專案釋出很正常,一切都和預=預期一樣正常,可是到測試介面的時候,遇到第二個問題,一直會出現空指標異常:

網上解決方法很多,嘗試了好多,最終在配置檔案實現,就是在spring的核心xml檔案中配置一遍dubbo的相關配置,同時在springMVC的xml的最前再邊配置一遍,原因就是,spring的註解掃描會導致dubbo失效,(具體原因沒有細究,這裡留下疑問)。配置如下:

Context的xml配置  

    <dubbo:applicationname="${zookeeper.name}"/>

    <!-- 使用zookeeper註冊中心暴露服務地址 -->

    <dubbo:registryprotocol="zookeeper"address="${zookeeper.address}"/>

    <!-- 要引用的服務 -->

    <dubbo:annotation/>

    <!-- 啟用spring mvc註解 -->

<context:annotation-config/>

springMVC配置檔案中將上述也放到最前邊就可以解決。

第三個問題是在新增事務管理的時候發現的,解決方案,在該部落格發現

http://jhaij.iteye.com/blog/2171723

當加入事務後,spring bean 事務代理, dubbo的 AnnotationBean 掃描 類執行下面的程式碼的時候就獲取不到對應的註解,也就釋出不了服務:

 Java程式碼

Service service =bean.getClass().getAnnotation(Service.class); 

       if (service != null) { 

因為被cglib或者java proxy 代理的類獲取不到該dubbo的service註解.

我按照方法,直接去maven庫中,將加上java.lang.annotation.Inherited 註解的Service.class替換進去。實際上我在檢視github上的最新dubbo原始碼時,這個註解已經添加了,不知道為啥不發不到Maven庫中。

以上就是這次簡陋的不謹慎的總結。