我也是第一次写这个,有误地方请指出,我也是一个爱学习的好公民,哈哈

dubbo 我也是今天开始使用的,然后就遇到@Reference为空,
然后找了很多博客,大多数都是花里胡哨的,我在这里也不讲源码了,看不懂,直接说解决方案

一 问题出现所在

很多博客多说的很明白了,搜关键字‘dubbo @Reference注入为null’,大致都是说sping容器和dubbo容器冲突了

二 解决方案

1.使用阿里巴巴的dubbo,要注意,当时阿里开发这个的时候,用的spring版本很低,把spring版本降到4.x.x版本,还有把jdk降到1.7版本好像就可以解决了,我没试过,但是我同学成功了
2.我这里使用第二中方案,把dubbo版本调高,用阿帕奇的dubbo
我使用的是spring版本是5.1.8版本的,够大家用的了

三 途中可能还遇到一些小问题

1.zookeeper jar包不能高于zookeeper 客户端版本
我使用的zookeeper客户端时 3.4.8
pom中的依赖是3.4.7
2.jar包版本冲突
使用dubbo,zookeeper等等,还有使用dubbo必须依赖的包,会带来一些低版本的jar包,排除传递依赖即可

四 客户端软件版本 监控和注册中心

dubbo的Reference的注入_dubbo

五 服务端和消费端POM文件

spring版本5.1.8

<dependencies>  
	<!-- 这些是运行dubbo的核心依赖-->
	<!-- ${spring.version} -- 5.1.8   - ->
   <!-- dubbo采用spring配置方式,所以需要导入spring容器依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.0.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-client</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.0.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-client</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/io.netty/netty -->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty</artifactId>
        <version>3.10.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jms</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.7.4.1</version>
        <exclusions>
            <exclusion>
                <!-- 排除传递spring依赖 -->
                <artifactId>spring</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
<build>
    <plugins>
        <!-- 配置Tomcat插件 -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
                <port>8087</port>
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

六 服务端xml配置

不管是消费端还是服务端都是以apache的xml约束表头
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
   xmlns="http://www.springframework.org/schema/beans"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
   http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

1.xml 配置

<?xml version="1.0" encoding="UTF-8"?>

<!--这里扫描,接口实现类的包,不然无效-->
<dubbo:annotation package="cn.zbs.tao.sso.query.service"/>
<!-- 提供方应用信息,用于计算依赖关系,name必须唯一 -->
<dubbo:application name="taotao-sso-query-server" />
<!-- 这里使用的注册中心是zookeeper -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881" />
<dubbo:monitor protocol="registry"/>

2. <dubbo:registry address=“zookeeper://127.0.0.1:2181”/>必须单独拿出来说下

我这里使用的是zookeeper注册服务,其他的根据自己的需求填写,
linux的ip地址不一样
<dubbo:protocol name="dubbo" port="20881" /> 这里的port
第一次使用应该是20880,我的已被占用,自行更换20881

3.阿里的dubbo:registry 和阿帕奇的dubbo:registry 的区别

<!--阿里-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"
 client="zkclient" />
<!--阿帕奇-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

阿帕奇dubbo没有 client=“zkclient” 这个属性 不然会报错 切记

七 消费端xml配置

<dubbo:application name="dubbo-a-consumer"/>
<!-- 这里使用的注册中心是zookeeper -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- dubbo包扫描 在哪里使用了@Reference 就扫描哪个包 
不过这个包扫描有用,但是做了无用功,以防万一,写好-->
<dubbo:annotation package="cn.zbs.dubbo.controller"/>

address=“zookeeper://127.0.0.1:2181” 请和服务端保持一致

八 准备工作做好了,就是解决办法了

(一) 服务端准备

1.定义接口

package cn.zbs.tao.sso.query.api;

public interface MyService {
   String getName();
}

2.service层注入并实现接口

package cn.zbs.tao.sso.query.service.impl;

import org.apache.dubbo.config.annotation.Service;
import cn.zbs.tao.sso.query.api.MyService;

//注意 这里使用的是apache下的 dubbo 的Service注解
@Service
public class MyServiceImpl implements MyService {
@Override
public String getName() {
    return "My Service";
   }
}

(二) 消费端准备调用

!!!!注意重点来了

问题1:<dubbo:annotation package="cn.zbs.dubbo.controller"/>
我为什么说这个消费端的dubbo包扫描做无用功
 这是spring初始化机制问题

这方面可以参考下面博客博主分析很详细

因此 @Reference 会注入为null

解决方案
在使用@Reference的Conreoller或者service注解上面加上
@DubboComponentScan(basePackages = “当前类的包名”)
//dubbo组件扫描,里面可以带basePackages,也可以不用

具体使用参考下面配置

注意 阿里的dubbo也有注入为空的情况,但是使用这个注解就不行,低版本的dubbo没有这个注解

这方面可以参考下面博客博主分析很详细

消费端注入并调用

package cn.zbs.dubbo.controller;

import cn.zbs.tao.sso.query.api.MyService;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@DubboComponentScan(basePackages = "cn.zbs.dubbo.controller")
@RestController
public class MyController {
@Reference
private MyService myService;
@RequestMapping("/get")
public String getName(){
    return myService.getName();
}

}

如果对现在的你有帮助,请用你那发财的小手挪下鼠标点个赞