1.架构
dubbo架构波及的角色:
节点
角色阐明
Provider
裸露服务的服务提供方
Consumer
调用近程服务的服务生产方
Registry
服务注册与发现的注册核心
Monitor
统计服务的调用次数和调用工夫的监控核心
Container
服务运行容器
2.配置加载流程
Dubbo配置形式有XML配置、注解配置、API配置。反对多层级配置,依照优先级配置笼罩。
3.dubbo相干重要点
3.1 负载平衡
负载平衡策略有:
- 按权随机
- 按权轮询
- 起码沉闷调用数:沉闷数指调用前后技术差
- 始终性hash:缺省,对第一个参数做hash,缺省用160分虚构节点
3.2 线程模型
3.3 服务分组
一个接口有多种实现时,应用group辨别。
3.4 接口测试留神点
(1) 直连提供者
在开发测试环境下,可能存在绕过注册核心的状况下,测试某个服务提供者,这时须要点对点直连。能够有如下形式:
- xml 配置:<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService"
url="dubbo://localhost:8080" />
- 指定-D参数:java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:8080
- 文件映射:用 -Ddubbo.resolve.file 指定映射文件门路
(2) 只订阅
不便开发测试,可能存在共用注册核心的状况,防止正开发的服务提供者影响服务消费者,能够让服务提供这只订阅服务(开发的服务可能依赖其余的服务),通过直连形式测试。
3.5 异步调用
v2.7.0起,dubbo的异步编程接口以CompletableFuture为根底,基于NIO的非阻塞实现,不须要启动多线程,绝对多线程开销小。
3.6 多协定
dubbo反对在不同服务上反对多个协定或者同一个服务上同时反对多个协定。
反对的协定有dubbo、rmi、hessian、http、webservice、thrift、memcached、redis、rest
3.7 本地存根
近程服务调用后,客户端个别是接口,实现在服务端,提供方想在客户端提供局部执行逻辑如ThreadLocal缓存,提前验证参数,嗲用失败后伪造容错数据,须要在api带上stub。
3.8 并发管制
能够限度每个办法服务端并发执行的个数,设置executes属性
3.9 连贯管制
限度服务端的连贯个数,设置accepts属性值
3.10 提早连贯
提早连贯用户缩小长连接数。有调用的时候才创立,设置lazy属性。
3.11 粘滞连贯
个别用户有状态的服务,使客户端总是向调用同一个服务提供者,设置sticky属性。
3.12 令牌验证
令牌验证注册核心受权权限,可避免消费者绕过注册核心拜访提供者,设置token属性。
3.13 集群容错
在集群调用失败时,Dubbo 提供了多种容错机制,缺省为 failover 重试。容错机制有:
- failover: 失败主动切换,重试其余服务器,通过设置retries属性(不蕴含第一次)
- failfast: 疾速失败,只发动一次调用。
- failsafe:失败平安,出现异常间接疏忽。
- failback:失败主动复原,后盾记录失败申请,定时重发。
- forking:并行调用多服务器,一个胜利即返回,通过设置forks属性。
4.dubbo我的项目搭建
4.1 应用idea创立一个spring boot kotlin我的项目
(1) 点击菜单File->new Project->Spring Initializr->next
(2) 抉择kotlin依照提醒流程创立集体我的项目
(3) 依照下面流程创立一个父我的项目,保留pom文件、.idea 文件,删除无关文件,而后new module 增加模块
以上步骤就创立一个基于dubbo的spring boot kotlin多模块我的项目。
4.4 代码实现
基于接口开发,基于注解模式,不实用xml,spring boot 提倡约定大于配置
- 对于接口的提供方,应用注解@Service
- 对于接口的调用发应用@Reference
- 裸露的接口对立放在一个治理api的子模块
- 须要用到接口时,在pom文件引入模块
如上面例子所示:
<dependency>
<groupId>com.xhh</groupId>
<artifactId>xhh-practice-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
4.5 可能会遇到的问题
(1) @Reference 空援用问题
- 集体一开始未应用zookeeper注册核心,采纳接口直连形式,须要在注解中设置好url属性,留神应用dubbo协定结尾如:dubbo://。没有启动时不报错,接口调用发现失败,最终发现时配置不全导致的空援用问题
- 应用zookeeper注册核心时,本地曾经搭建好zookeeper,须要配置的子模块也配置了zookeeper地址,启动我的项目时,工夫距离打印连贯zookeeper信息,调用接口时,提醒接口未注入实例。起初认为@Reference和@Service的注解短少相干属性,例如版本,check、接口对象等,最初发现不是这个问题,发现子模块都还未胜利注册到zookeeper,依赖配置还短少一个zookeeper包,所以无奈取得另外一个服务的接口代理对象,引入上面配置即可:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>以上这些依赖包次要是实现在zookeeper原生API的根底上进行封装、实现一些开发细节,包含接连重连、注册等。
5.dubbo框架原理
5.1 SPI机制
服务发现机制。SPI 的实质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,运行时加载实现类,动静为接口替换实现类。原生JDK规范SPI只能通过遍历查找拓展点和实例化,存在一次性加载所有拓展点的状况导致资源节约,dubbo SPI机制解决了这个问题。
(1) 注解@SPI
示意该接口为可拓展接口。以上面阐明为例子:
@SPI("netty")
public interface Transporter {
@Adaptive({"server", "transporter"})
Server bind(URL var1, ChannelHandler var2) throws RemotingException;
@Adaptive({"client", "transporter"})
Client connect(URL var1, ChannelHandler var2) throws RemotingException;
}
@SPI中的属性值,示意获取配置中key,会获取这个key对应的值,对应的值就是对应的实现类。