Dubbo是阿里巴巴公司开源的一个高性能的服务框架,使得应用可以通过高性能的RPC实现服务的输入和输出功能,可以和spring框架无缝集成。本文会从dubbo的基本使用方式开始,一步一步的去发现问题和解决问题并最终在项目中使用dubbo开发分布式系统,
当垂直应用越来越多,应用之间的交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能够快速响应多变的市场需求,此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键.
一、Dubbo架构
- Provider: 暴露服务的服务提供商
- Consumer: 调用远程服务的服务消费房
- Register: 服务注册于发现的注册中心
- Monitor: 统计服务的调用次数和调用时间的监控中心
- Container: 服务运行的容器
调用关系
- 服务器负责启动,加载,运行服务提供者
- 服务提供者在启动时,像注册中心注册自己提供的服务
- 服务消费者在启动时,像注册中心订阅自己所需的服务
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
- 服务消费者从提供者地址列表中,基于软负债均衡算法,选择一台提供者进行调用,如果调用失败,再选择另外一台调用
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
二、安装注册中心(Registry)
此处将zookeeper作为注册中心,这也是dubbo推荐的,下载地址: zookeeper
1、配置
下载完成文件之后解压,在conf目录下复制zoo_sample.cfg并改名为zoo.cfg,打开此文件配置,配置选项如下
1 | tickTime=2000 # zookeeper服务器之间或者客户端和服务器之间维持心跳的时间间隔 |
在dataDir配置的目录下创建myidw文件,设置当前服务器的pid,就是一个数字,对应上面配置的server.1的这个数字,这个数字指定当前zookeeper的id
2、操作命令
所有的操作脚本在zookeeper文件目录的bin文件夹下
1 | sh zkServer.sh start # 启动zookeeper |
3、一台机器伪集群配置
启动三台zookeeper集群,配置如下
zookeeper1的配置文件
1 | # The number of milliseconds of each tick |
zookeeper2的配置文件
1 | # The number of milliseconds of each tick |
zookeeper3的配置文件
1 | # The number of milliseconds of each tick |
注意: 需要在dataDir配置的文件路径下创建myid文件,并设置id,id用来置顶当前zookeeper服务器的id,如果不创建,将会启动不成功
二、安装监控中心(Monitor)
此处就用dubbo的监控中心,直接下载dubbo的源代码,在项目目录dubbo-simple/dubbo-monitor-simple/target下面,解压文件dubbo-monitor-simple-2.5.4-SNAPSHOT-assembly.tar
1、简单配置
配置文件是conf/dubbo.properties, 打开配置文件,配置如下
1 | dubbo.container=log4j,spring,registry,jetty |
2、基本操作
1 | sh bin/start.sh # 启动,启动完成可以通过配置的jetty端口通过网页访问监控中心 |
三、Dubbo管理控制台
dubbo控制台的war包在源代码的dubbo-admin/target
下,复制此war包部署到本地的tomcat服务器上去,然后启动tomcat服务器,可以直接访问了。
1、配置多注册中心
需要下部署tomcat,然后在部署的项目目录下找到WEB-INF/dubbo.properties
文件,在此文件里面配置多个注册中心,此处配置上面的三台伪集群zookeeper注册中心配置文件如下
1 | dubbo.registry.address=zookeeper://127.0.0.1:2181|zookeeper://127.0.0.1:2182|zookeeper://127.0.0.1:2183 |
之后就可以在页面的系统管理/系统状态里面看到注册中心了
四、基于spring-boot的集成Dubbo
在spring-boot中这儿用注解来配置dubbo,这样代码看起来相对简洁。
1、maven添加服务依赖
1 | <dependency> |
注意: 此处log4j必须要添加,否则抛出异常
NoClassDefFoundError: org/apache/log4j/Logger
2、基本配置
在application.properties
文件中配置dubbo相关的属性,所有的配置项在io.dubbo.springboot.DubboProperties
类下面,这个配置类的源代码如下,可以一目了然的看到需要配置哪些参数:
1 | @ConfigurationProperties( |
服务提供方配置如下:
1 | //配置扫描的包,dubbo会扫描此包下的dubbo相关的注解 |
3、服务提供方注解配置
在实现类上面加上@Service
注解完成服务的暴露
1 | @Service(version = "1.0.0", executes = 10) |
注意: 此处的@Service是
com.alibaba.dubbo.config.annotation
包下面的Service
解释: @Service有很多参数,具体参数和含义可以参考链接: dubbo service配置
4、异常处理
BeanCreationException
异常,如果提示实现类找不到,如Error creating bean with name 'estateAreaImpl' defined in file
,那在启动类上手动加上需要扫描的包,代码如下:
1 | @SpringBootApplication |
5、服务消费方基本配置
(1)、配置properties
配置application.properties
文件如下:
1 | spring.dubbo.application.name=huijinhang-backend |
(2)、注解使用
1 | @RestController |
@Reference的参数很多,可参考: dubbo reference
完成配置之后启动项目调用api就可以得到服务提供方的结果了