dubbo项目的搭建和启动
- dubbo项目主要由四部分组成: registor注册中心, producer服务提供者, consumer服务消费者, monitor服务监控中心;
- 创建接口的maven项目, 定义需要发布的接口;
- 创建producer项目maven项目, 并引入接口项目依赖;
- 创建consumer项目maven项目, 引入接口依赖;
- 搭建zookeeper的服务注册中心;
- 到dubbo-admin下载地址, 下载dubbo-admin的maven项目进行打包, 打包之前修改配置文件的zookeeper的地址, 然后使用java -jar方式启动, 访问http://ip:7001端口, 看到界面(如果有用户名密码, 默认为root, root)
- 监控中心搭建, 到dubbo-simple项目下载, 一样打成jar包, 然后到target目录中, 找到tar文件, 解压修改配置文件, 然后到**bin目录下, 使用脚本启动, 访问8080端口启动
dubbo配置文件的一些说明
- 大部分的配置不需要特别说明, 主要是zookeeper的配置中心, 应用名称, 发布的接口和实现类, 以及使用协议
提供方配置
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="org.apache.dubbo.demo.DemoService" ref\="demoService" />
<!-- 和本地bean一样实现服务 -->
<bean id\="demoService" class\="org.apache.dubbo.demo.provider.DemoServiceImpl" />
消费方
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name\="consumer-of-helloworld-app" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry address\="multicast://224.5.6.7:1234" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id\="demoService" interface\="org.apache.dubbo.demo.DemoService" />
在spring-boot的Application启动类上添加ImportResource注解导入配置文件, 并添加以下依赖
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
使用@Reference注解即可使用;
- 主要是配置级别, 客户端大于服务端, 细粒度高的大于细粒度低的, 细粒度相同时, 以客户端配置为准
- version版本号, 可以定义不同的服务版本供消费者使用;
实现的协议
dubbo可支持多种协议, 例如dubbo和hession协议, 默认的是dubbo协议
集群容错
loadbalance
failfast: 快速失败, 抛出异常
failover: 一个服务失败后, 再重新调用(重新调用次数默认是2次, 不包含第一次), 都失败则换另一个服务
failsafe: 失败忽略异常, 并记录日志
forking: 同时向多个服务发送, 有一个成功即为成功
brodcast: 同时向所有服务发送, 一个失败就是失败
failback: 失败自动回复, 失败后记录日志, 并在一段时间后重新调用
<dubbo:reference
id=“helloService”
interface=“com.test.dubbo.IHello”
version=“2”
cluster=“failover”
retries=“2”
/>
负载均衡
Random LoadBalance: 随机,按权重设置随机概率。
RoundRobin LoadBalance: 轮询,按公约后的权重设置轮询比率。
LeastActive LoadBalance: 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
ConsistentHash LoadBalance: 一致性 Hash,相同参数的请求总是发到同一提供者
<dubbo:service
interface="com.yz.dubbo.api.IUserService"
ref="userService1"
version="1.0.0"
loadbalance="random"\>
服务降级
服务降级使用mock方式, 写一个实现类接口
<dubbo:reference id="helloService"
interface="com.test.dubbo.IHello"
mock="com.test.dubbo.TestMock"
/>
dubbo的整体架构
如上图, 可以清晰的看到这个框架的设计分层, 具体分析:
1. service层: 在使用dubbo的时候要设计接口并引入, 由服务者提供,
consumer调用;
2. config层: 就是对dubbo的配置文件进行解析;
3. proxy层: 客户端实际调用的接口并不是真正原来的接口, 而是被动态
代理过的, 这是dubbo实现rpc调用的关键地方, 他隐藏了底层很多实现;
4. register层: 接口的调用需要知道服务的地址, 以及发布的端口, 在
调用时需要到zookeeper上去拉取;
5. cluster层: 当所有的都准备好之后, 开始调用, dubbo的producer
可能会部署多台机器, 进行负载均衡和容错, 这里就是处理这些逻辑;
6. monitor层: 对于dubbo的架构, 通常我们会搭建一个监控管理平台,
负责监控调用的次数以及时间等;
7. protocol远程调用层:封装 RPC 调用;
8. exchange信息交换层:封装请求响应模式(比如定义request或者
response等),同步转异步;
9. transport网络传输层:调用netty或者mina组件, 进行远程调用;
10. serialize数据序列化层:数据传输过程中需要对数据进行序列化;
dubbo的SPI机制
dubbo支持自定义拓展点, 实现方式可以参照该处
- java的SPI实现, 创建一个maven的jar项目, 实现要实现的规范接口(如DataDriver), 在根路径下创建META-INF/services目录, 使用接口全路径名做文件名, 内容为实现类全路径名, 使用ServiceLoad.load(接口.class)可获取到
- dubbo的SPI实现: 实际上有两点不同, 一个是路径, META-INF/dubbo另一个是内容使用的是key=value形式(可以实现不一次全部加载), 另外, dubbo中可以实现拓展点的接口都是必须添加@SPI注解的, 在源码中, 实现类如果在类上添加@Adaptive注解, 在加载时直接返回该实现类, 而这个注解不存在或者添加在方法上是, 实际上是返回的一个包装类, dubbo的组件扩展都是使用这种机制
和spring整合以及服务暴露.引用和暴露实现
spring整合: 使用的是NameserveHandler和BeanDefinitionParse, 前者会在容器启动时调用它的init方法已经解析的bean组件添加到spring容器中, 后者会解析dubbo的配置文件生成DefinitionBean, 他们在dubbo中的实现类是dubbo*;在所有的解析类里面有两个bean比较特殊, ServiceBean和RegistBean, 他们都是实现了spring的事件监听接口, 用来监听spring容器初始化完成事件, 服务的暴露和引用都是在这个时间点去执行的, 底层的调用机制是用网络通信实现的, 默认使用netty, 而服务的调用, 则是使用jdk动态代理, 将原来的服务提供者层层包装, 来调用服务, 而filter, cluster容错, loadBalance, 序列化...都会在这个时候实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。