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;}@Overridepublic 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 {@Overridepublic 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