远程调用服务好帮手-dubbox

概述

  Dubbox是一款高性能、轻量级的开源Java RPC(Remote Procedure Call 远程过程调用)框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

  Dubbox 的前身是阿里巴巴开源项目 Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在 Dubbo 基础上进行优化,并继续维护,为了与原有的 Dubbo 区分,故将其命名为 Dubbox。

角色

  • 注册中心(Registry):相当于房东、中介,记录提供者和消费者信息
  • 监控中心(Monitor):通过连接注册中心,监控消费者和提供者健康状况
  • 服务提供者(Provider):Service层
  • 服务消费者(Consumer):Web层

四种角色之间的关系如下图

相关概念

  • 远程调用:用@Reference:web调用service,依赖中没有service的jar包,service是war,此时是远程调用
  • 本地调用:用@Autowired:service调用dao,依赖中有dao.jar,此时是本地调用
  • 长连接:建立连接后,不断进行数据交互
  • 短连接:建立连接后,没有操作则自动断开
  • WebService:远程服务调用API
    • 具体实现:
      • 老:axis, cxf
      • 新:hessain, dubbox, feign Ribbon

Dubbox的优势

Dubbox具有以下优势:

  1. 负载均衡:同一个工程划分成不同模块,每个模块部署在独立的服务器上
  2. 服务调用链路生成:服务间依赖关系错踪复杂,可以解决服务之间互相是如何调用的
  3. 服务访问压力以及时长统计、资源调度和治理:基于访问压力实时管理集群容量,提高集群利用率。
  4. 服务降级:某个服务宕机后调用备用服务
  5. 可以应用在微服务系统中

快速入门

注册中心Zookeeper

  1. 上传zookeeper-3.4.6.tar.gz至Linux服务器,并解压 tar -zxvf
  2. 创建data文件夹 mkdir /root/zookeeper-3.4.6/data
  3. 重命名 /root/zookeeper-3.4.6/conf/zoo_example.cfgzoo.cfg,并使用vim编辑器修改 zoo.cfg 中的 dataDir=/root/zookeeper-3.4.6/data

监控中心

  1. 上传 dubbo-admin-2.8.4.warapache-tomcat.tar.gz至Linux服务器,解压tomcat
  2. dubbo-admin-2.8.4.war拷贝到 tomcat/webapp 目录下
  3. 启动tomcat ./tomcat/bin/startup.sh
  4. 在不改变默认端口的情况下,可以通过 虚拟机IP:8080/dubbo-admin访问监控中心,默认用户名密码均为root,实时监控消费者和提供者的健康状况

服务提供者

  1. 在Service模块业务层实现类上增加注解@Service ,注意包名是dubbo不是springframework

    1
    2
    3
    4
    5
    import com.alibaba.dubbo.config.annotation.Service;
    @Service
    public class XxxServiceImpl implements XxxService {
    ...
    }
  1. 在spring主配置文件中增加以下配置

    1
    2
    3
    <dubbo:application name="一般和项目名称保持一致,唯一"/> <!--在“注册中心”声明服务提供者名称-->
    <dubbo:registry address="zookeeper://服务器ip:2181"/> <!--连接注册中心-->
    <dubbo:annotation package="要暴露服务所在的包路径"/>

服务消费者

  1. 在Web模块控制层Controller类中调用Service

    1
    2
    3
    4
    5
    6
    7
    8
    import com.alibaba.dubbo.config.annotation.Reference;
    @RestController
    @RequestMapping("/xxx")
    public class XxxController {
    @Reference
    private XxxService XxxService;
    ...
    }

这样,我们就完成了远程调用Service服务。

0%