版权声明:原创文章,未经允许,禁止转载! https://blog.csdn.net/weixin_36512652/article/details/82388601
这几天在学习Dubbo、Zookeeper和SpringBoot的整合,按照视频上的教程,在消费方使用@Reference注解的时候总是会报空指针异常,被这个问题烦了好几天。看网上的大佬们说是什么加载顺序不同,本菜鸟不是很懂,还有的教程是使用xml配置文件,本人通过使用xml配置文件可以成功整合,但是我想要的是使用全注解的方式来将其整合在一起,经过这几天的尝试,在不使用xml配置文件的情况下将三者整合了起来,下面是我的整合过程。
整个工程分为三个模块:
- api模块
- 服务提供者
- 服务消费者
下面是三个模块的工程结构
API模块:
- 定义了一个接口
//定义一个接口,作为要暴露的服务
public interface HelloService {
String sayHello(String name);
}
服务提供者模块:
- POM文件
<dependencies>
<!--引入api接口-->
<dependency>
<groupId>com.youngpain</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--引入Dubbo依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!--引入ZookeeperClient-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 实现了API模块的接口并将其暴露出去
@Component//加入容器组件
@Service//暴露服务
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello," + name;
}
}
- 主程序类使用@DubboComponentScan指定Dubbo扫描包路径
//指定Dubbo扫描包路径
@DubboComponentScan(value = "com.youngpain.dubbo.provider.service")
@SpringBootApplication
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
- application.properties文件配置相关属性
#设置端口号
server.port=8080
#应用名称
dubbo.application.name=dubbo-provider
#注册中心地址
dubbo.registry.address=zookeeper://x.x.x.x:2181
服务消费者模块:
- POM文件
<dependencies>
<!--引入api接口-->
<dependency>
<groupId>com.youngpain</groupId>
<artifactId>dubbo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--引入Dubbo依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!--引入ZookeeperClient-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 编写一个Controller类调用服务
@RestController
public class HelloController {
@Reference
HelloService helloService;
@GetMapping("/hello")
public String useHello() {
return helloService.sayHello("Dubbo");
}
}
- application.properties文件配置相关属性
#避免端口占用
server.port=8081
#应用名称
dubbo.application.name=dubbo-consumer
#注册中心地址
dubbo.registry.address=zookeeper://39.108.114.57:2181
测试流程:
- 启动dubbo-provider
- 启动dubbo-consumer
- 在浏览器输入http://localhost:8081/hello