Dubbo是实现远程调用的一个框架,阿里巴巴开源的。远程调用就是B服务器可以调用A服务器的方法。大型项目会被拆分成多个模块,部署在不同的服务器上。若将公共模块集中部署在一台服务器上,可以方便其他服务器调用。因此,需要Dubbo。
此外参考Dubbo官方手册,Dubbo自己提供注册中心,需要在provider项目中配置文件里配置dubbo协议才能使用,目前主流的办法是使用zookeeper注册中心。
本案例提供三个模块演示springboot项目如何集成Dubbo
015_interface_api 公用模块
项目类型:maven java工程
描述:存放实体bean和业务接口
负责业务模块:Model,Service
016_springboot_provider :服务提供者
项目类型:SpringBoot web工程
描述:实现业务接口中的接口
负责业务模块:ServiceImpl,Mapper
017_consumer:服务消费者
项目类型:SpringBoot web工程
描述:处理从浏览器客户端发送的请求,就是 Controller 层
负责业务模块:Controller
目录
- 015_interface_api
- 016_springboot_provider
- 1 导入额外的依赖
- 2 实现stuServiceimpl
- 3 配置application.properties文件
- 4 @EnableDubbo注解 启动服务
- 017_consumer
- 1 导入额外依赖
- 2 实现controller类 并启动
- 3 配置application.properties文件
- 启动项目步骤
015_interface_api
stu类
/**
* Dubbo 实体 Bean 需实现 Serializable ,否则会报错
*/
public class stu implements Serializable {
private String name;
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "stu{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
stuService
public interface stuService {
stu queryStudent(Integer id);
}
016_springboot_provider
1 导入额外的依赖
<!-- 1、导入项目015的依赖-->
<dependency>
<groupId>com.zjh</groupId>
<artifactId>015_interface_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 2、导入Dubbo依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- 3、导入Zookeeper依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
<type>pom</type>
<!-- 禁用zookeeper的日志,因为Dubbo自己也携带了一个,多个日志重复-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2 实现stuServiceimpl
//写此注解是为了确保注入到容器
@Service
//@DubboService说明:使用dubbo的注解暴露服务,版本号自定义
@DubboService(interfaceClass = stuService.class, version = "1.0" )
public class stuServiceImpl implements stuService {
@Override
public stu queryStudent(Integer id) {
stu student = new stu();
if( 1001 == id){
student.setName("zjh");
student.setAge(10);
student.setSex("男");
}
return student;
}
}
3 配置application.properties文件
# 配置服务名称 dubbo:application name="名称"
spring.application.name=stuservice-provider
# 配置扫描的包,扫描的@DubboService
dubbo.scan.base-packages=com.zjh.service
# 配置注册中心
dubbo.registry.address=zookeeper://localhost:2181
4 @EnableDubbo注解 启动服务
@SpringBootApplication
//启动Dubbo
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
017_consumer
1 导入额外依赖
在provider依赖的基础上再加一个web依赖
<!-- 4、web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2 实现controller类 并启动
@RestController
//消费者也启动Dubbo
@EnableDubbo
public class DubboController {
//原本需要@ resource自动注入
@DubboReference(interfaceClass = stuService.class, version = "1.0")
private stuService stuservice;
@RequestMapping("/dubbo/{stu_id}")
public String HelloSubbo(@PathVariable("stu_id")Integer id){
stu stu = stuservice.queryStudent(id);
return "远程调用接口,获取对象:"+stu.toString();
}
}
3 配置application.properties文件
# dubbo服务命名 dubbo:application name="名称"
spring.application.name=stuservice-consumer
# 注册中心
dubbo.registry.address=zookeeper://localhost:2181
启动项目步骤
- 启动安装的zookeeper服务
- 依次启动provider服务,consumer服务
- 输入localhost:8080/dubbo/id=1001