我也是第一次写这个,有误地方请指出,我也是一个爱学习的好公民,哈哈
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包,排除传递依赖即可
四 客户端软件版本 监控和注册中心
五 服务端和消费端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();
}
}
如果对现在的你有帮助,请用你那发财的小手挪下鼠标点个赞