SpringBoot 集成 Dubbo
本文主要讲述学习 SpringBoot 集成 Dubbo 的过程,和容易遇到的问题,手摸手带入门。
文章目录
Dubbo 是什么
Dubbo是一个分布式服务框架,分布式简单来说就是把业务拆分到多个子项目,正常来说多个项目数据交互都是通过http交互,就像前后端分离那种交互,而有了Dubbo你就可以把其他项目的接口当成方法来调用,是不感觉一下子方便了很多。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Dubbo
1.角色
Provider 服务提供者: 暴露服务的服务提供方。
Consumer 服务消费者: 调用远程服务的服务消费方
Registry 注册中心: 服务注册与发现的注册中心
Monitor 监控中心: 统计服务的调用次调和调用时间的监控中心
2.调用顺序
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
二、搭建SpringBoot集成Dubbo项目
一共要创建三个项目【Provider 服务提供者】、【Consumer 服务消费者】、【interface 接口工程】
1.创建 Provider 服务提供者
项目类型:SpringBoot web工程
描述:实现业务接口中的接口
负责业务模块:ServiceImpl,Mapper
- 创建一个SpringBoot Web 工程,仅需要选择 spring web 一个起步依赖
- 填写配置文件 application.properties
# 设置当前工程是一个服务提供者
spring.dubbo.server=true
# 设置注册中心
# 【入门】https://blog.csdn.net/java_66666/article/details/81015302
# 【window及linux安装】https://blog.csdn.net/qq_33316784/article/details/88563482
spring.dubbo.registry=zookeeper://localhost:2181
- 配置 pom.xml 文件
<!--Dubbo集成SpringBoot框架起步依赖-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--注册中心-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!--接口工程,接下来第三个创建的【interface 接口工程】-->
<dependency>
<groupId>com.example</groupId>
<artifactId>interface</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
- 给项目启动文件 Application.java 配置注解 @EnableDubboConfiguration // 开启dubbo配置
- 编写 ServiceImpl
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
/**
* 注解解释
* 用于标注对外暴露的dubbo接口实现类
* 若使用的是dubbo的Service注解时,在controller注入的时候,要选择@Reference注解来进行注入。
* 若使用 interfaceName 参数则,controller注入的时候,也要使用 interfaceName 参数来进行注入
* https://www.cnblogs.com/riches/p/11195184.html
*/
@Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 15000)
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
@Override
public Student queryStudentById(Integer id) {
return studentMapper.selectByPrimaryKey(id);
}
}
- 编写 Mapper 这个正常就不贴代码了
2.创建 Consumer 服务消费者
项目类型:SpringBoot web工程
描述:处理从浏览器客户端发送的请求,就是 Controller 层
负责业务模块:Controller
- 创建一个SpringBoot Web 工程,仅需要选择 spring web 一个起步依赖
- 填写配置文件 application.properties
# 设置注册中心
# 【入门】https://blog.csdn.net/java_66666/article/details/81015302
# 【window及linux安装】https://blog.csdn.net/qq_33316784/article/details/88563482
spring.dubbo.registry=zookeeper://localhost:2181
- 配置 pom.xml 文件
<!--Dubbo集成SpringBoot框架起步依赖-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--注册中心-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!--接口工程,接下来第三个创建的【interface 接口工程】-->
<dependency>
<groupId>com.example</groupId>
<artifactId>interface</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
- 给项目启动文件 Application.java 配置注解 @EnableDubboConfiguration // 开启dubbo配置
- 编写 Controller
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class StudentController {
/**
* 注入服务提供者的服务
* 服务提供者 @Service 使用 interfaceName 参数则,这里也需要使用 interfaceName 参数
*/
@Reference(interfaceClass = StudentService.class,version = "1.0.0",check = false)
private StudentService studentService;
@RequestMapping("/student/detail/{id}")
public String studentDetail(@PathVariable("id") Integer id){
return id;
}
}
3.创建 interface 接口工程
项目类型:maven java工程
描述:存放实体bean和业务接口
负责业务模块:Model,Service
- 创建一个 maven java工程
- 创建 Model
import java.io.Serializable;
/**
* Dubbo 实体 Bean 需实现 Serializable ,否则会报错
*/
public class Student implements Serializable {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 创建 Service 接口,这个正常就不贴代码了