实现Dubbo分布式框架,需要公共接口maven项目,需要服务提供者springboot项目,需要服务消费者springboot项目。
因为公共接口只有数据类和接口,后期提供者和消费者需要根据maven唯一坐标来导入公共接口项目的jar包,因此公共接口项目是java-maven项目。
服务提供者需要配置 暴露服务,声明服务,故使用springboot+Dubbo 服务消费者需要配置
使用服务,声明服务,故使用springboot+Dubbo
公共接口maven项目
不添加任何jar包,只定义Service公共接口和数据类。
服务提供者
服务提供者只需要实现接口的实现类,暴露服务即可。
1、导入依赖的jar包
公共接口的jar包
spring-boot-starter 起步依赖
dubbo-spring-boot-starter 起步依赖
dubbo-dependencies-zookeeper 注册中心相关的依赖
问题1:使用dubbo分布式框架需要dubbo,spring-context,netty,javassist,json依赖,日志依赖
解释1:导入dubbo-spring-boot-starter相当于导入了dubbo依赖,spring框架依赖,javassist依赖,netty依赖,fastjson依赖
日志依赖在导入注册中心的时候导入。
问题2:使用注册中心,需要导入有关注册中心的jar包
解释2:Apache Curator是Apache ZooKeeper的Java / JVM客户端库,Apache ZooKeeper是一种分布式协调服务。它包括一个高级API框架和实用程序,使Apache ZooKeeper更容易和更可靠。它还包括常见用例和扩展(如服务发现和Java 8异步DSL)的配方。
导入了日志。
2、编写实现类。
在实现类上暴露服务@DubboService(interfaceClass=接口.class,timeout=5000,version=1.0)
,在springboot的核心配置文件中指明组件扫描器扫描的路径dubbo.scan.base-package=com.wll.service
没有结合springboot时,只写@Service,并在xml包中配置组件扫描器<component-scan base-pacakage=“service包”/
3、声明服务,声明注册中心,定义端口号
在springboot核心配置文件中声明服务,dubbo.application.name=stuservice-provider
,声明注册中心 dubbo.registry.address=zookeeper://localhost:2181
没有结合springboot时,只写<dubbo:application name=“服务名称”/> <dubbo:registry address=“zookeeper://localhost:2181”/>
为了避免端口号冲突,server.port=8081
4、在启动类上加上注解@EnableDubbo
注意没有结合springboot时,@Service本身就是@Component,但是DubboService并不是,他只是暴露服务,没有创建Bean对象,将对象放进spring容器中的能力,因此需要加上组件扫描器的使用
@Component <componen-scan
@DubboService @DubboComponentScan
创建bean对象,将对象放入spring容器中
@EnableDubbo是复合注解
他里面的@DubboComponentScan,同Component组件能力相同。
@EnableDubbo做了两件事,一个是初始化Dubbo核心组件,加载Dubbo配置到内存。另一个是注册BeanPostProcessor,用来扫描@Service和@Reference注解。
服务消费者
1、导入相关的jar包
公共接口的jar包
spring-boot-starter 起步依赖
dubbo-spring-boot-starter 起步依赖
dubbo-dependencies-zookeeper 注册中心相关的依赖
2、编写调用类,调用提供者的类中方法
调用类中有公共接口的成员方法,通过@DubboReference注解给成员变量赋值
@RestController
public class ConsumerController {
@DubboReference(version="1.0")
private StuService stuService;
@GetMapping("/query")
public Student queryStudentById(Integer id){
return stuService.queryStudentById(id);
}
}
注意这里使用的@DubboReference(interfaceClass = StudentService.class,version = "1.0")
是引用远程服务,将服务注入给接口,这个@DubboReference内部的属性要与提供者@DubboService内部的内容对应,不能缺胳膊少腿,如@DubboService中定义版本号为1.0,@DubboReference也必须定义,否则,无法注入。
3、编写springboot核心配置文件
为了避免端口号冲突,server.port=8082
指定服务名称spring.application.name=consumer-application
,指定注册中心dubbo.registry.address=zookeeper://localhost:2181
4、在启动类上加上@EnableDubbo注解
@EnableDubbo做了两件事,一个是初始化Dubbo核心组件,加载Dubbo配置到内存。另一个是注册BeanPostProcessor,用来扫描@Service和@Reference注解。
消费者远程调用提供者的方法
开启注册中心
zkServer.cmd
运行提供者启动main方法
运行消费者启动main方法