Dubbo 是什么
Apache Dubbo™ (incubating)是一款高性能Java RPC框架
官网:
http://dubbo.apache.org/zh-cn/index.html 使用感受:
Dubbo将传统的服务调用关系分为了消费者和提供者。符合现在前后端分离的这种模式。
Dubbo架构如图
节点角色说明:
节点 | 角色说明 |
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
使用记录
主要记录dubbo的工作流程,加深理解,如果需要详细的配置及代码请移步度娘
1、服务注册中心
使用zookeeper作为服务注册中心,将其部署在docker上。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。
部署+启动
#启动docker
service docker start
#拉取镜像
docker pull zookeeper:3.5
#创建容器
docker create --name zk -p 2181:2181 zookeeper:3.5
#启动容器
docker start zk
启动成功后,可查看容器运行情况
docker ps
默认端口是2181。
2、SpringBoot下引入Dubbo进行服务治理
最明显的感受就是dubbo是非侵入性的,原先的service可以不发生改变,由dubbo调用该service并暴露一个dubbo服务接口给controller,简单的代码就可以实现服务治理。
2.1dubbo配置
在springboot的配置文件application.properties中
#Dubbo配置
# Service version
dubbo.service.version = 1.0.0
# 服务的扫描包
dubbo.scan.basePackages = zhong.dubbo.server.api
# 应用名称
dubbo.application.name = dubbo-provider-house-resources
# 协议以及端口
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20881
# zk注册中心
dubbo.registry.address = zookeeper://192.168.146.128:2181
dubbo.registry.client = zkclient
2.2dubbo使用
2.2.1定义dubbo服务接口
dubbo的服务要实现此接口,同时,该接口也是暴露给外层应用调用的,需要注意的是,要把接口和实现分开。
2.2.2实现dubbo服务接口
新增一个api包,在这里使用dubbo并暴露出dubbo服务的接口给表现层(我随便说的,感觉像类似)
/**
* 这个是dubbo服务,不要和spring的服务搞混了
*/
@Service(version = "1.0.0")
public class HouseResourcesService implements ApiHouseResourcesService {
/**
* 注入的是spring的服务
*/
@Autowired
private zhong.dubbo.server.service.HouseResourcesService houseResourcesService;
@Override
public int saveHouseResources(HouseResources houseResources) {
return this.houseResourcesService.saveHouseResources(houseResources);
}
}
2.3查看dubbo服务
利用dubbo-admin即可查看注册的服务
如果没配置过dubbo-admin,可以看这篇
2.3调用dubbo
在Controller中,因为在上一步中已经完成dubbo服务接口的定义及实现,并且把dubbo 服务的接口注入到spring容器中了。所以只需要在controller中调用duddo服务即可。
使用起来非常简单呢。
@RequestMapping("house/resources")
@Controller
public class HouseResourcesController {
@Autowired
private HouseResourcesService houseResourcesService;
/**
*
* @param houseResources 接收json数据
* @return
*/
@PostMapping
@ResponseBody
public ResponseEntity<Void> save(@RequestBody HouseResources houseResources){
try {
boolean success = this.houseResourcesService.save(houseResources);
if(success){
return ResponseEntity.status(HttpStatus.CREATED).build();
}
}catch (Exception e){
e.printStackTrace();
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
@GetMapping
@ResponseBody
public ResponseEntity<String> get(){
return ResponseEntity.ok("ok");
}
}
可以从dubbo-admin中看到消费者列表
这个时候这里的消费者就是指某个controller,这里只是完成了服务的订阅,当某个请求过来的时候,才是真正的服务调用,dubbo会根据负载均衡的不同策略对已注册的服务选择调用。
Dubbo的工作流程总结
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另
一台调用。 - 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。