Springboot 整合 dubbo ,@Reference @Service 可能空指针
记录遇到的问题,纯解决问题
直接上代码,少屁话,给空气多点清新
第一步:导包
<!-- springboot整合dubbo的start包 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper相关的包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
</dependency>
<!-- 客户端连接zookeeper所需的包 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
第二步(提供方(@Service)):application.properties 的配置
#dubbo服务端口,我们无需知道dubbo服务运行在哪个端口,故也将其设为随机端口
dubbo.protocol.port =20880
#通讯规则dubbo,hession...
dubbo.protocol.name=dubbo
#dubbo服务名称
dubbo.application.name =dubbo-provider
#dubbo服务所在包路径,可要可不要
#dubbo.scan.basePackages =com.gcyl.search.service.impl
#注册中心地址协议
dubbo.registry.protocol=zookeeper
#注册中心地址,因为我搭建的是集群,所以用逗号分开
dubbo.registry.address=192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183
接下来就可以使用注解来使用 dubbo 了;
接口最好抽出来作为单独的 maven 项目,方便调用方依赖
//共用接口API
public interface ProductService{
/**
*注释之类的就不写了
*/
String sayHello(String name);
}
-----------------------------------------------------------
//实现类
//当然Service里面还有很多参数,这里只列举两个
@com.alibaba.dubbo.config.annotation.Service(timeout = 5000,version = "1.0.0")
public class ProductServiceImpl implements ProductService {
@Override
String sayHello(String name) {
System.out.println(String.format("你好%s,欢迎调用我",name));
return "success";
}
}
启动就可以注册成功了,使用客户端连接,查看是否注册成功(我用的是 docker 启动的集群,用外部 zkCli.sh 启动的)
连接到 zookeeper
./zkCli.sh -server 192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183
查看是否注册成功
查看注册成功与否(类似 linux 操作命令,zookeeper 里面是数据模型,可当成目录看)
ls /dubbo/packageName.ProductService/provider)
consumer: 是否否消费者
provider: 提供者
服务端已经完成,接下来客户端
第三步:客户端(@Reference)
同样需要导入 jar 包,这里就省了。。。
接下来 application.properties 文件
#通讯规则
dubbo.protocol.name=dubbo
#dubbo服务名称
dubbo.application.name =dubbo-consume
#注册中心地址
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.1.112:2181,192.168.1.112:2182,192.168.1.112:2183
然后再到需要用的地方调用即可(此处有坑,后面讲)
@Reference(version = "1.0.0",timeout = 2000)
private ProductService productService;
@RequestMapping("/sayHello")
@ResponseBody
public String sayHello(String name) {
String result = productService.sayHello(name);
System.in.print(result);
return result;
}
启动,访问 sayHello
报错:java.lang.NullPointerException: null;追踪到 productService 为 null
@Reference 没有引用成功,报空指针(可能服务端未开启),网上有解决办法,但是需要更多的维护
网上可以找到使用 xml 文件的方式,这里我就不说了
使用注解方式解决:
第一步:在启动类上面添加注解
@EnableDubbo() // 开启 dubbo
@DubboComponentScan() //dubbo 组件扫描,里面可以带 basePackages, 也可以不用
@EnableDubbo()
@DubboComponentScan()
@SpringBootApplication()
public class ReferenceDemoApplication {
}
重新启动,看日志文件(object=“com.alibaba.dubbo.common.bytecode.proxy0@39941489”)说明已经注册成功,就这样可以使用 dubbo 了,也不会空指针了
就这样,就这样,我要下班了。。。