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
/**
* 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);
}
<dependency>
<groupId>com.zjhgroupId>
<artifactId>015_interface_apiartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>2.7.8version>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-dependencies-zookeeperartifactId>
<version>2.7.8version>
<type>pomtype>
<exclusions>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
exclusion>
exclusions>
dependency>
//写此注解是为了确保注入到容器
@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;
}
}
# 配置服务名称 dubbo:application name="名称"
spring.application.name=stuservice-provider
# 配置扫描的包,扫描的@DubboService
dubbo.scan.base-packages=com.zjh.service
# 配置注册中心
dubbo.registry.address=zookeeper://localhost:2181
@SpringBootApplication
//启动Dubbo
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
在provider依赖的基础上再加一个web依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
@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();
}
}
# dubbo服务命名 dubbo:application name="名称"
spring.application.name=stuservice-consumer
# 注册中心
dubbo.registry.address=zookeeper://localhost:2181