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 了,也不会空指针了

就这样,就这样,我要下班了。。。